TCP/IP TCP快速重传

Q:TCP为什么要设计快速重传机制
在没有快速重传/快速恢复算法之前,重传依靠发送方的重传超时,在timeout时间内如果没有接收到对方的ACK,默认是丢包了,发送方就重传。
包丢失的原因:(1)包checksum出错、(2)网络拥塞、(3)网络断,包括路由重收敛。
发送方无法判断是哪种情况,于是采用最笨的方法,将自己的发送速率减半,即CWND减为1/2(congestion Window)。
这种方法对2是有效的,可以缓解网络拥塞,3则无所谓,反正网络断了,无论发送快慢都会被丢。但对于1来说,丢包是因为偶尔的出错引起的,
一丢包就对半减速不合理。于是有了快速重传算法。
基于在反向还可以接收到ACK,可以认为网络并没有断(排除3),否则接收不到ACK,如果在timeout时间内没有接收到大于2的duplicated ACK,则概率大事件
为乱序,乱序无需重传,接收方会进行排序工作。如果接收到三个或三个以上的duplicated ACK,则大概率是丢包。
由于可以收到ACK,则网络是通的,可能是1、2造成的,先不降速,重传一次,如果接收到正确的ACK,则一切OK。如果依然接收到duplicated ACK,
则认为是网络拥塞造成的,此时降速则比较合理。

Q:TCP快速重传为什么是三次冗余ACK?
假设A发送给B四个TCP数据段,A的发送顺序为:N、N+1、N+2、N+3

B的接收顺序可能有以下几种情况:
(1)收到的第一个数据段为N,此时A收到0个Dup ACK(N)(冗余ACK)
(2)收到的第一个数据段不为N,则
N+1、N、N+2、N+3,此时A收到1个Dup ACK(N)
N+1、N、N+3、N+2,此时A收到1个Dup ACK(N)
N+1、N+2、N、N+3,此时A收到2个Dup ACK(N)
N+1、N+2、N+3、N,此时A收到3个Dup ACK(N)
N+1、N+3、N、N+2,此时A收到2个Dup ACK(N)
N+1、N+3、N+2、N,此时A收到3个Dup ACK(N)
同理,收到第一个包为N+2、N+3也分别有六种情况,其中有两种情况收到3个Dup ACK。
包乱序情况下,收到3个Dup ACK的概率为:2/6=33%
(3)数据段N丢失,则收到3个Dup ACK的概率为100%
N+1、N+2、N+3,此时A收到3个Dup ACK(N)
N+1、N+3、N+2,此时A收到3个Dup ACK(N)
N+2、N+1、N+3,此时A收到3个Dup ACK(N)
N+2、N+3、N+1,此时A收到3个Dup ACK(N)
N+3、N+1、N+2,此时A收到3个Dup ACK(N)
N+3、N+2、N+1,此时A收到3个Dup ACK(N)

结论:两次duplicated ACK肯定是乱序造成的,丢包肯定会造成三次duplicated ACK。

你可能感兴趣的:(TCP/IP)