对数据包重新排序感到困惑

网络工程 tcp
2022-02-20 11:09:35

我正在阅读一本关于 TCP 协议“选择性重复”的教科书:

我们假设数据包不能在发送方和接收方之间的通道内重新排序。当发送者和接收者通过单根物理线路连接时,这通常是一个合理的假设。但是,当连接两者的“通道”是网络时,可能会发生数据包重新排序。实践中采用的方法是确保在发送方“确定”任何先前发送的序列号为 x 的数据包不再在网络中之前,不会重复使用序列号。这是通过假设一个数据包不能在网络中“存在”超过某个固定的最大时间量来完成的。

我很困惑,下面是我的两个问题。

Q1-什么是“通道可以被认为本质上是缓冲数据包并在未来任何时候自发地发出这些数据包。” 意思是?为什么我们需要缓冲一个旧数据包?接收者忽略它不是更好吗?

Q2-假设窗口大小为 2,可用序列号为 0,1,2,3。发送方首先发送数据包 0、数据包 1,而数据包 0 不知何故被击中,需要很长时间才能到达,因此发生超时,发送方必须再次发送数据包 0,但这一次数据包 0(新)按时到达。然后发送方发送数据包2,数据包3,都被接收方接收。然后发送方即将发送数据包0(新)和数据包1(新),但旧数据包0现在到达接收方,因此接收方无法知道这个数据包是旧数据包还是新数据包。那么“假设一个数据包不能在网络中“存活”超过某个固定的最长时间”如何解决这个问题呢?这是否意味着数据包标头包含发送时间?

1个回答

什么是“通道可以被认为本质上是缓冲数据包并在未来任何时候自发地发出这些数据包”。意思是?为什么我们需要缓冲一个旧数据包?接收者忽略它不是更好吗?

这就是队列和缓冲的本质,它是数据包交换的重要组成部分 - 接收到的数据包在入口处排队/缓冲,并在它们被转发后从队列中删除。缓冲是必要的,否则每当接收到数据包时,出口链路总是需要空闲 - 这对于分组交换网络是不可能的,仅对于电路交换网络是不可能的。

假设窗口大小为 2,可用序列号为 0、1、2、3。

该窗口不计算数据包/数据报,而是字节数。此外,序列号仅在其 32 位字段溢出时重复 - 这仅在 4 GiB 数据之后发生。但是,该限制意味着“正在运行”的数据不能超过 4 Gib,以避免歧义。由于最大可能的窗口是(接近)1 GiB,这不是问题。

请注意,使用简单的累积 ACK,当前一个段仍然丢失时,接收器无法选择性地 ACK 后面的段。ACK 表示已接收到所有先前的数据。

例如,段大小为 1,000,窗口大小为 10,000,发送方发送数据报 D00-D09(序列 0-9,999)。D00 和 D02-D09 接收,但 D01 丢失。接收方仍然确认 1,000(下一个预期的数据序列),这会触发发送方将 D0 移出窗口,将其推进到 1,000-10,999,然后发送 D10。

同时,接收器已经确定存在问题,因此它再次ACK 1,000以发出信号。发送方收到双重 ACK 并重新发送 D01(不情愿模式)或从 D01 开始的所有数据(积极模式)。接收方已经获得 D10 (10,000-10,999),因此它 ACK 11,000,这反过来将发送方的窗口移动到 11,000-20,999(并中止仍然未完成的重传,用于激进模式)。

(我稍微简化了这个过程,实际上有更多的并行重叠,当然,发送和接收之间存在延迟。)

编辑:正如 Jeff 正确指出的那样(谢谢!),对选择性确认(SACK)的支持在今天几乎是既定的。使用该选项,接收方也可以立即 SACK 2,000-9,999(来自 D02-D09),因此发送方不会开始重新传输它们。它还可以更早地开始传输 11,000-20,999。