[英]SOCK_STREAM socket listen() causing TCP syn/ack to be sent
我有一个套接字设置接受TCP连接
socket(AF_INET, SOCK_STREAM, 0)
然后我调用bind()
, listen()
和accept()
问题是,当我调用listen()时,它会导致SYN / ACK数据包被发送到客户端。 我认为在调用accept()之前不会发生这种情况,但更糟糕的是SYN / ACK数据包没有将确认增加1。
造成这种情况的原因是什么,我该如何解决?
谢谢
作为旁注 - 我的TCP连接是不对称的吗?
在您的计算机上执行TCP可能会选择在您调用listen
实际“接受”传入连接。 这实际上是有道理的,以避免由于“懒惰”接受而导致的不必要的延迟。 只是提醒你, listen
一个参数是所谓的积压数,即“缓冲”接受待处理的数量。
关于syn + ack数据报中ACK的递增。 我不记得协议说明了什么,但这可能是握手期间的正确行为。
这是TCP'backlog'队列的正常操作。 它是一个连接队列,堆栈已经完成但应用程序尚未接受。 此队列的大小由listen()的第二个参数设置,尽管平台可以向上或向下调整(通常向上)。
无论你观察到什么序列号也必然是正确的行为,否则什么都行不通。
正如其他答案和评论中所提到的,这是TCP实现的实际标准行为。
如果您坚持通过接受应用程序中的传入连接来显式完成TCP握手,那么您将拥有一个依赖解决方案的平台。
对于Windows堆栈,您可以在侦听套接字上设置SO_CONDITIONAL_ACCEPT
套接字选项。 请参阅winsock文档 。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.