是否应该确认每个 TCP 数据包?

mis*_*yes 1 networking tcp

如果一个tcp程序A向另一个TCP程序B发送两个数据包,数据包1:序列号从1000到2000;数据包 2:从 2000 到 3000 的序列号。

一般 B 应该回复 2 个 ACK​​,一个是确认数据包 1,另一个是确认数据包 2。现在,如果 A 只收到第二个 ACK​​,A 是否还会等待第一个 ACK​​?

我知道 TCP 是面向字节的流协议。所以A不应该等待第一个ACK,对吗?理论上是这样的,真正实现的TCP栈呢?

顺便说一句,我有一个奇怪的问题。如果 A 向 B 发送一个确认序列号为 3001 的 ACK(这是用于确认数据包 2)。但是中间有人将ack seq号修改为2501,也就是说,B确认了半个TCP数据包。那么A会从对应seq 2000或2501的字节重传吗?

小智 6

TCP 将确认序列号,而不是数据包。因此,即使没有“中间人”,程序 A 也只能确认收到的数据包的一小部分(即套接字没有足够的缓冲区空间容纳所有数据包。)在您的示例中,2501 将被重新传输程序 B。

TCP 也支持 Selective Ack,因此只需要传输一个丢失的段(在序列号空间中​​)