TCP 快速重传为什么是三次冗余 ACK ?

两次 duplicated ACK 肯定是乱序造成的
丢包肯定会造成三次 duplicated ACK

假定通信双方如下,A 发送 4 个 TCP Segment 给 B,其中 N - 1 成功到达,其它按照到达顺序,分别收到 ACK(N) 的数目:

A 发送顺序 N - 1, N, N + 1, N + 2

B 方到达顺序

N - 1, N, N + 1, N + 2
A 收到 1 个 ACK(N)

N - 1, N, N + 2, N + 1
A 收到 1 个 ACK(N)

N - 1, N + 1, N, N + 2
A 收到 2 个 ACK(N)

N - 1, N + 1, N + 2, N
A 收到 3 个 ACK(N)

N - 1, N + 2, N, N + 1
A 收到 2 个 ACK(N)

N - 1, N + 2, N + 1, N
A 收到 3 个 ACK(N)

如果 N 丢了,没有到达 B

N - 1,N + 1,N + 2
A 收到 3 个 ACK (N)

N - 1,N + 2,N + 1
A 收到 3 个 ACK (N)

TCP segment 乱序有2/5 = 40%的概率会造成A收到三次 duplicated ACK(N);

而如果 N 丢了,则 A 有100%概率会收到三次duplicated ACK(N);

基于以上的统计,当 A 接收到三次 duplicated ACK(N)启动 Fast Retransmit 算法是合理的,即立马 retransmit N,可以起到 Fast Recovery 的功效,快速修复一个丢包对 TCP 管道的恶劣影响

而如果 A 接收到二次 duplicated ACK(N),则一定说明是乱序造成的,即然是乱序,说明数据都到达了 B,B 的 TCP 负责重新排序而已,没有必要 A 再来启动 Fast Retransmit 算法

你可能感兴趣的:(TCP 快速重传为什么是三次冗余 ACK ?)