在以下场景中会发生什么(假设连接已经建立):
(堆栈 A)发送 10 字节数据
(堆栈 B)发送 10 字节数据的 ACK
(堆栈 B)发送 200 字节数据
(堆栈 B)发送 100 字节数据
(堆栈 B)发送 50 字节数据
(堆栈 A)发送 350 字节数据的 ACK,并发送 70 字节数据
该段丢失并且未到达机器 B。(堆栈 B)重新传输 200 字节数据(步骤 3)
(堆栈 A)发送 200 字节数据的 ACK,并将下一个预期序列号作为 70 字节数据的序列号
问题:步骤 8 中是否也应随 ACK 一起传输 70 字节数据?请注意,步骤 6 的重传计时器尚未到期。
答案1
不,对于无序段到达,这 70 个字节不应该包含在立即 ACK 中。
为什么?步骤 7 是无序段的到达。在收到无序段时,TCP 必须立即生成 ACK,给出下一个预期字节(将是 361 + 步骤 1 之前发送的任何字节)。但 TCP 不会使用附带的 ACK 重新传输包含 70 字节数据的段。该段仍在重新传输队列中,等待计时器到期,或者如果启用了快速重新传输,则会有三个重复的 ACK 到达,但两者都尚未发生。无序到达表示拥塞,因此 TCP 应该发送尽可能小的 ACK,这是有道理的。