在收到三个 ACK​​ 数据包之前发生了重新传输

网络工程 tcp 线鲨
2022-02-13 16:01:20

在下面的 Wireshark 跟踪中,发送了 seq=41030 的数据包,一段时间后数据包得到确认。之后重传数据包 seq=41030,然后收到 3 个 ACK​​,表明 seq=41030 丢失,应该重传,但这不会发生。
我很困惑,为什么在收到 3 个 ACK​​ 之前发生了重传。是从超时重传吗?但是为什么在收到 3 个 ACK​​ 时没有再次重传。 在此处输入图像描述

1个回答

您看到的是与 Acks 数量无关的基本 TCP,因为最基本的 TCP 基于超时工作。因此,序列号为 41030 的 TCP 段丢失、从未确认、超时并重新传输。

检测三个重复的 ACK 是加速丢包检测的优化。原因是一个段丢失了,但随后的段没有并且仍然触发 ACK,但是因为接收方无法在丢失的段之外确认,所以假设这是丢失的。

在您的示例中,您确实看到了相同序列号的三个 ACK​​,但这不会触发重传,因为它们实际上 ACK 已经发送的所有内容。最后两个 ACK​​ 不是由任何传入数据包触发的,而是自触发以更新接收窗口大小。您通常不会在高度活跃的 TCP 会话中看到该消息,而只会在空闲会话中看到该消息。