![TCP 和重传](https://linux22.com/image/627220/TCP%20%E5%92%8C%E9%87%8D%E4%BC%A0.png)
我试图了解 TCP 中的传输和 ACK 是如何工作的。在此图中,当 A 在收到三个重复的 ACK 后重新传输 seq 100 时,B 将以 121 ACK 或 158 ACK 进行应答?
答案1
重传主题已在网络和相关文献中得到广泛记录,因此对于由于段超时而导致的重传的情况,我仅引用包含一些数据包捕获示例的 Novell 文档:
TCP 通过发送对已接收数据段的确认来实现可靠性。[...] 在重传超时检测到段丢失后,发送方必须重新传输所有段。
[...]
图 3 描述了一个 TCP 跟踪,其中按顺序接收的字节直到序列号 2028597920 都正确无误,此时有一个段丢失。发送方不知道丢失,继续发送直到 2028605220 的数据,此时它重新传输丢失的段和直到 2028605220 的整个数据管道。这导致重新传输了五个实际上已成功接收的数据包。
典型的管道重输和排水。
通过使用选择性确认方案,接收方可以选择性地确认丢失后收到的段。然后发送方只需重新传输丢失的段。这些丢失的段或数据包也称为数据流中的“漏洞”。
如果你只关注快速重传/快速恢复特性RFC 2581,则重新传输行为会有所不同。HOST B
将按照您的图发出重复的 ACK,暗示HOST A
某个段需要重新传输。当然,它还会接收并缓冲后续段,直到其接收窗口的大小为止 - 这就是段重新排序机制的工作方式。在接收到丢失的段后,重新排序机制将能够组装流,并且HOST B
的堆栈将确认最后收到的段 (157)。