TCP的超时与重传
2019-05-17 本文已影响0人
食梦狸猫
TCP通过在发送时设置一个定时器来解决数据和确认可能丢失的情况。如果定时器溢出时还没有收到确认,那么它就重传该数据。
对于每个连接,TCP管理4个不同的定时器:
- 重传定时器用于当希望收到另一端的确认。
- 坚持定时器使窗口大小信息保持不断流动。
- 保活定时器检测到一个空闲连接的另一端何时崩溃或重启。
- 2MSL定时器测量一个连接处于TIME_WAIT状态的时间。
拥塞避免算法
慢启动算法是在一个连接上发起数据流的方法,但有时我们会到达中间路由器的极限,此时分组就被丢弃。需要拥塞避免算法来处理丢弃分组。
该算法假定由于分组受到损坏引起的丢失是非常少的,因此分组丢失就意味着在某处网络上发送了拥塞:发生超时和接收到重复的确认。
拥塞避免算法和慢启动算法需要对每个连接维持两个变量:一个拥塞窗口cwnd,一个慢启动门限ssthresh。
- 对一个连接,初始化cwnd为1个报文段,ssthresh为65535个字节。
- 当拥塞发生时,ssthresh被设置为当前窗口大小的一半(cwnd和通告窗口大小之间的最小值的一半)。若是超时引起了拥塞,则cwnd被设置为1个报文段。
- 当新的数据被对方确认后,就增加cwnd,增加的方法取决于我们是否正在进行慢启动或拥塞避免。如果cwnd小于等于ssthresh,则正在进行慢启动,否则就正在进行拥塞避免。慢启动算法初始化cwnd为1个报文段,之后每收到一个确认就加1.拥塞避免算法要求每收到一个确认把cwnd增加1/cwnd
快速重传和快速恢复算法
快速重传算法:如果一连串收到3个或3个以上的重复ACK,就非常可能是一个报文段丢失了。于是就重传丢失的数据报文段,而无需等待超时定时器溢出。
-
当收到第3个重复的ACK时,将ssthresh设置为当前拥塞窗口cwnd的一半。重传丢失的报文段。设置cwnd为ssthresh+3倍报文段大小。
-
每次收到另一个重复的ACK时,cwnd增加1个报文段大小并发送1个分组。
-
当下一个确认新数据的ACK到达时,设置cwnd为ssthresh。
当TCP超时重传时,它不一定要重传同样的报文段,TCP允许进行重新分组而发送一个较大的报文段。