SOCK_STREAM套接字listen()导致TCP syn / ack被发送

时间:2012-11-06 23:21:01

标签: c sockets network-programming freebsd

我设置了一个套接字以接受与

的TCP连接
socket(AF_INET, SOCK_STREAM, 0)

然后我拨打bind()listen()accept()

问题在于,当我调用listen()时,它会导致SYN / ACK数据包被发送到客户端。我认为在调用accept()之前不会发生这种情况,但更糟糕的是SYN / ACK数据包没有将确认增加一个。

造成这种情况的原因是什么,我该如何解决?

由于

作为旁注 - 我的TCP连接是不对称的吗?

3 个答案:

答案 0 :(得分:3)

在您的计算机上实施TCP可能会选择在您拨打listen时实际“接受”传入连接。这实际上是有道理的,以避免由于“懒惰”接受而导致的不必要的延迟。只是提醒您,listen的一个参数是所谓的积压数字,即“缓冲”接受待处理的数量。

关于syn + ack数据报中ACK的递增。我不记得协议说明了什么,但这可能是握手期间的正确行为。

答案 1 :(得分:2)

这是TCP'backlog'队列的正常操作。它是一个连接队列,堆栈已经完成但应用程序尚未接受。此队列的大小由listen()的第二个参数设置,尽管平台可以向上或向下调整(通常向上)。

无论你观察到什么序列号也必然是正确的行为,否则什么都行不通。

答案 2 :(得分:0)

如其他答案和注释中所述,这是TCP实现的实际标准行为。

如果您坚持通过接受应用程序中的传入连接来显式完成TCP握手,则可以使用平台相关的解决方案。

对于Windows堆栈,您可以在侦听套接字上设置SO_CONDITIONAL_ACCEPT套接字选项。参见winsock documentation