繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM