TCP 发送方如何识别无序的 ACK 数据包?

网络工程 通讯协议
2021-07-26 12:09:38

我是TCP协议的新手,最近有个问题困扰了我一段时间……

我的问题来自以下示例:

假设我们的MSS 是 1KB最大序列号是 30K-1我们可以忽略拥塞控制窗口并假设接收器的窗口大小恒定为 30K(接收器能够立即将数据分段传送到应用层)。

假设初始 seqNum 为 0,sender 同时发出 30 个数据包,seqNum 分别为 0, 1K, 2K ... 28K 和 29K。

接收方成功接受了所有 30 个数据包,并相应地回复了 30 个 ACK​​ 数据包,每个数据包的确认编号为1K、2K、... 29K 和 0。(这是第一个 ACK​​ 数据包 1K 出现的地方

但是,由于乱序交付,发送方在 1K 之前获得了 2K 确认号虽然现在还不是问题,因为发送方可以通过累积确认的原理推断出前两个数据包被接受了。

然后,发送方再发送两个带有 seqNum 0 和 1K 的数据包以及更新的数据(由于序列号环回序列号 0 和 1K 被重用),接收方接受它们并回复 ACK 数据包1K和 2K。这是第二个ACK包1K出现的地方

但是,这导致了一个问题,即存在两个确认编号均为 1K 的 ACK 数据包发送方如何判断哪个 ACK​​ 数据包比另一个新

1个回答

然后,发送方再发送两个带有 seqNum 0 和 1K 的数据包,接收方接受它们并回复 ACK 数据包 1K、2K。

序列号和 ACK 号是累积的,因此一旦数据包被确认,该序列号将不会再出现在该 TCP 流中(如果会话发送足够的数据,它们最终会出现 - 请参阅此线程以获取更多信息)。有关ACK 和 SEQ 数字如何递增的信息,请参阅此 PacketLife 帖子中的“统计 > 流图”图像

关于 ACK 无序数据包,这是通过 SACK 完成的,如本 PacketLife 帖子中所述。

编辑:阅读您编辑的问题后,我相信TCP 时间戳是您正在寻找的答案。

TCP 时间戳用于称为防止包装序列号或 PAWS 的算法(有关详细信息,请参阅 RFC 1323)。当接收窗口跨越序列号环绕边界时使用 PAWS。在数据包可能被重新传输的情况下,它回答了以下问题:“这个序列号是前 4 GB 还是第二个?” 并且时间戳用于打破平局。