TCP不';t每隔一段确认一次

TCP不';t每隔一段确认一次,tcp,Tcp,我正在阅读[Stevens 1993],在TCP批量数据一章中,显示了“每隔一段确认一次”策略,但在此之后,他给出了如下图: (很抱歉图片质量不高,我不知道如何上传高分辨率图片) 第8段确认了4段,这是否与“每隔一段确认一次”冲突?我确信这与操作系统无关,因为作者在两个示例中使用了相同的机器 我也查了一下,这也表明 ..…在全尺寸段流中,至少应有一个ACK 至少每秒钟一段 您可以为每个PSH/ACK发送一个ACK。我想如果你想使用批量数据,重点是只确认每个窗口(这是向前滑动窗口所必需的)。好的

我正在阅读[Stevens 1993],在TCP批量数据一章中,显示了“每隔一段确认一次”策略,但在此之后,他给出了如下图:

(很抱歉图片质量不高,我不知道如何上传高分辨率图片)

第8段确认了4段,这是否与“每隔一段确认一次”冲突?我确信这与操作系统无关,因为作者在两个示例中使用了相同的机器

我也查了一下,这也表明

..…在全尺寸段流中,至少应有一个ACK 至少每秒钟一段


您可以为每个PSH/ACK发送一个ACK。我想如果你想使用批量数据,重点是只确认每个窗口(这是向前滑动窗口所必需的)。

好的,你可以为每个PSH/ACK发送一个确认。我想如果你想使用批量数据,关键是只确认每个窗口(这是向前滑动窗口所必需的)。

史蒂文提到,“每隔一段确认一次”非常常见。这不是必须的。引用你提到的同一章:

“使用TCP的滑动窗口协议,接收器不必 确认每个接收到的数据包。使用TCP时,ACK 它们确认接收器已正确接收到 通过已确认序列号减去1的所有字节”

Steven提到“每隔一段确认一次”非常常见。这不是必须的。引用你提到的同一章:

“使用TCP的滑动窗口协议,接收器不必 确认每个接收到的数据包。使用TCP时,ACK 它们确认接收器已正确接收到 通过已确认序列号减去1的所有字节”


所以,既然没有正确的答案。我做了一些测试

  • 通过以太网从CentOS 7到OS X 10.12,往返时间为10ms:

    TCP应答至少每三段一次

  • 通过广域网从FreeBSD 10.1到OS X 10.12,往返时间为100ms:

    FreeBSD至少每秒钟发送一次ACK,就像RFC一样 提到

  • 仍然无法解释这个问题。
    很明显,似乎大多数实现在两个相邻的ack之间有最大数量的段,尽管每个实现可能都有自己的值。

    所以,因为没有正确的答案。我做了一些测试

  • 通过以太网从CentOS 7到OS X 10.12,往返时间为10ms:

    TCP应答至少每三段一次

  • 通过广域网从FreeBSD 10.1到OS X 10.12,往返时间为100ms:

    FreeBSD至少每秒钟发送一次ACK,就像RFC一样 提到

  • 仍然无法解释这个问题。
    很明显,似乎大多数实现在两个相邻的ACK之间都有最大数量的段,尽管每个实现可能都有自己的值。

    Linux将每隔一个完整段进行一次ACK,实际上是MSS值的两倍,并且在执行此操作之前,通常会等待最大延迟。它早在2012年就可配置:

    延迟确认可通过TCP_QUICKACK套接字选项关闭。(用于下一次确认)

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


    我怀疑在这个例子中,他假设的是一个缓慢的发送者,它要么不遵循“每隔一个”的规则,要么是因为它处理传入请求的速度太慢,以至于接收者在确认其他未完成的数据时只是看到了这些数据(或者他没有注意到这个细节)。它肯定只确认4*mss,而这恰好是RWin。

    Linux将每隔一个完整段确认一次,实际上是mss数据量的两倍,并在执行此操作之前等待最大延迟。它早在2012年就可配置:

    延迟确认可通过TCP_QUICKACK套接字选项关闭。(用于下一次确认)

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


    我怀疑在这个例子中,他假设的是一个缓慢的发送者,它要么不遵循“每隔一个”的规则,要么是因为它处理传入请求的速度太慢,以至于接收者在确认其他未完成的数据时只是看到了这些数据(或者他没有注意到这个细节)。它肯定只确认了4*mss,恰好是RWin。

    @RyanVincent不,我不是说我看到了8段,这是第八段acks段4、5、6、7。@RyanVincent不,我不是说我看到了8段,这是第八段acks段4、5、6、7。这里的图只确认了每个窗口,并且可以确认每个段,但是作者说它应该每隔一段确认一次,而在这个图中,它一次确认了4段,我只是感到困惑。我认为你实际上必须确认所有的推送,如果推送频繁的话,这会让事情变得很糟糕。这里的图只确认每个窗口,并且有可能确认每一段,但作者说它应该每隔一段确认一次,而在这个图中,它在一段时间内确认了4段,我只是感到困惑。我认为你实际上必须确认所有的推动,如果它们频繁发生,这会让事情变得糟糕。是的,我读到了。但如何解释RFC的“……在全尺寸段流中,至少每秒钟都应该有一个ACK”。我认为Stevens在这里的意思是不必确认每个数据包,而不必“每隔一段确认”,毕竟,“每隔一段确认”恰恰允许我们不确认每个数据包。后者对前者至关重要。是的,我读过。但如何解释RFC的“……在全尺寸段流中,至少每秒钟都应该有一个ACK”。我认为史蒂文斯在这里的意思是不必确认每一个数据包,而不是确认每一个数据包