第二十一章 TCP的超时与重传

来源:互联网 发布:linux 远程登录oracle 编辑:程序博客网 时间:2024/05/29 16:50

每个连接,TCP管理四个不同的定时器:
·重传定时器用于当希望接收到另一方的确认

·坚持定时器使窗口大小信息保持不断流动,即使另一端关闭了其接收窗口。

·保活定时器可检测到一个空闲连接的另一端何时重启或者崩溃

·2MSL定时器测量一个连接处于TIME_WAIT状态的时间

1.超时与重传

重传之间的时间差满足倍增关系,我们称为指数退避。首次分组传输与复位信号传输之间的时间差为9分钟。

2.重传

源于伯克利的TCP实现对收到的重复ACK进行计数,当收到第三个时,就假定一个报文段已经丢失并重传自那个序号起的一个报文段。这就是快速重传法。

在重传后,发送方继续正常的数据传输。TCP不需要等待对方确认重传。

拥塞避免算法

拥塞避免算法是一种处理丢失分组的方法。

有两种分组丢失的指示:发生超时和接收到重复的确认。

拥塞避免和慢启动算法是两种不同、独立的算法。但是当拥塞发生时,我们希望降低分组进入网络的传输速率,于是可以调用慢启动来做到这一点。实际中这两种算法一起实现

拥塞避免和慢启动算法需要每个连接维持两个变量:一个拥塞窗口cwnd和一个慢启动门限ssthresh。算法的工作过程如下:

1.对于一个给定的连接,初始化cwnd为1个报文段,ssthresh为65535个字节

2.TCP输出例程的传输不能超过cwnd和接收方通告窗口大小。拥塞避免是发送方使用的流量控制,而通告窗口则是接收方进行的流量控制。前者是发送方感受到网络的拥塞的估计,而后者则与接收方在该连接上的可用缓存大小有关。

3.当拥塞发生时(超时或收到重复确认).ssthresh被设置为当前窗口大小的半(cwnd和接收方通告窗口的最小值,但最少为2个报文段)。此外如果是超时引起了拥塞,则cwnd被设置为1个报文段(这就是慢启动)

4.当新的数据被对方确认时,就增加cwnd,但增加的方法依赖于我们正在进行慢启动或者拥塞避免。如果cwnd小于ssthresh,则正在进行慢启动,否则正在进行拥塞避免。慢启动一直持续到我们回到拥塞发生时窗口大小的一半的时候才停止(因为在步骤二ssthresh记录了窗口大小的一半),然后转为执行拥塞避免。

慢启动算法初始设置cwnd为1个报文段,此后每收到一个确认就增加1.这样就会使窗口按指数式增长:发送一个报文段,然后是2、4、8………………

拥塞避免算法要求每次收到衣蛾确认将cwnd增加1/cwnd。这是一种加性增长。在一个往返时间内最多增加一个报文段(不管在这个RTT中收到了多少确认),然而慢启动将根据这个往返时间内收到的ACK个数增加cwnd


3.快速重传和快速恢复算法

TCP在收到一个失序的报文段时,TCP立即需要产生一个ACK(一个重复的ACK)。这个重复的ACK是不能被延迟的。该重复ACK的目的在于让对方知道收到一个失序的报文段,并告诉对方自己希望收到的序号。

如果连续收到三个或三个以上的重复ACK,我们就会重传丢失的报文段,而无需等待超时定时器溢出。这就是快速重传法。接下来执行的不是慢启动而是拥塞避免算法。这就是快速恢复算法。

这种情况没有执行慢启动的原因是由于接收到重复的ACK不仅仅告诉我们一个报文段丢失了。由于接收方只有在收到另一个报文段时才会发送重复的ACK,而该报文段已经离开了网络并进入了接受缓存中。也就是说,在收发两端仍然有流动的数据,而我们不想执行慢启动来突然减少数据流。

这个算法通常按如下的过程实现:

1.当收到第3个重复的ACK时,将ssthresh设置为当前拥塞窗口cwnd的一半,重传丢失的报文段。设置cwnd为ssthresh加上3倍报文段大小。

2.每次收到另一个重复的ACK时,cwnd增加一个报文段大小并发送一个分组

3.当下一个确认新数据的ACK到达时,设置cwnd为ssthresh。这个ACK应该是在进行重传后的一个往返时间内对步骤1中重传的确认。另外这个确认也应该是对丢失的分组和收到的第1个重复的ACK之间的所有中间报文段的确认。这一步采用的是拥塞避免。

0 0
原创粉丝点击