两次 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 算法