TCP 不会每隔一个段确认一次

标签 tcp

我正在阅读 [Stevens 1993],在 TCP 批量数据一章中,显示了“ACK every other segment”策略,但在那之后,他给出了这样一个数字:

(抱歉图片质量不高,我不知道怎么上传高清图片)

Figure

段 8 ACKed 4 段,这不会与“ACK every other segment”冲突吗?而且我确信这与操作系统无关,因为作者在两个示例中使用了相同的机器。

我也查了一下RFC 1122这也表明

.....in a stream of full-sized segments there SHOULD be an ACK for at least every second segment.

最佳答案

Linux 将 ACK 每隔一个完整的段,实际上是 MSS 数据的两倍,并且在这样做之前主要等待 MAX_DELAY。它在 2012 年成为可配置的:https://lwn.net/Articles/502585/

可以使用 TCP_QUICKACK 套接字选项关闭延迟的 ACK。 (对于下一个ACK)

看起来大多数 Windows 版本的 ACK 频率较低,不确定这是否可控。

我怀疑在插图中他假设一个慢速发送者,它要么不遵循每个其他应该因为它处理传入请求的速度太慢,以至于接收者在回过头来确认它们时只是看到其他未完成的数据(或者他没有注意这个细节)。它肯定只确认恰好是 RWin 的 4*mss。

关于TCP 不会每隔一个段确认一次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39614056/

相关文章:

c# - C#TCP异步BeginSend回调永远不会发生

python - 通过http python发送图像

sockets - hping 发送 SYN : how not to send RST after receiving SYN/ACK?

linux - Linux 中的 TCP 套接字数据不一致

.net - 如何强制我的 C# 应用程序立即确认 TCP 数据报?

java - 软件电话/voip上有任何源代码或教程吗?

Python套接字发送在多次调用recv后不起作用

java - 尝试用非阻塞 IO 打包 TCP 很难!难道我做错了什么?

使用缓冲区和线程进行 Java TCP byteArray 传输

Java - TCP 服务器无法从 TCP 客户端读取