我设置了一个套接字以接受与
的TCP连接socket(AF_INET, SOCK_STREAM, 0)
然后我拨打bind()
,listen()
和accept()
问题在于,当我调用listen()时,它会导致SYN / ACK数据包被发送到客户端。我认为在调用accept()之前不会发生这种情况,但更糟糕的是SYN / ACK数据包没有将确认增加一个。
造成这种情况的原因是什么,我该如何解决?
由于
作为旁注 - 我的TCP连接是不对称的吗?
答案 0 :(得分:3)
在您的计算机上实施TCP可能会选择在您拨打listen
时实际“接受”传入连接。这实际上是有道理的,以避免由于“懒惰”接受而导致的不必要的延迟。只是提醒您,listen
的一个参数是所谓的积压数字,即“缓冲”接受待处理的数量。
关于syn + ack数据报中ACK的递增。我不记得协议说明了什么,但这可能是握手期间的正确行为。
答案 1 :(得分:2)
这是TCP'backlog'队列的正常操作。它是一个连接队列,堆栈已经完成但应用程序尚未接受。此队列的大小由listen()的第二个参数设置,尽管平台可以向上或向下调整(通常向上)。
无论你观察到什么序列号也必然是正确的行为,否则什么都行不通。
答案 2 :(得分:0)
如其他答案和注释中所述,这是TCP实现的实际标准行为。
如果您坚持通过接受应用程序中的传入连接来显式完成TCP握手,则可以使用平台相关的解决方案。
对于Windows堆栈,您可以在侦听套接字上设置SO_CONDITIONAL_ACCEPT
套接字选项。参见winsock documentation。