TCP超时与重传

出处http://blog.csdn.net/jiange_zh

1.前言

对每个连接, TCP管理4个不同的定时器。

1.重传定时器适用于当希望收到另一端的确认。

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

3.保活(keepalive)定时器可检测到一个空闲连接的另一端何时崩溃或重启。

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

超时重传是TCP协议保证数据可靠性的一个重要机制,其原理是在发送某一个数据以后就开启一个计时器,在一定时间内如果没有得到发送的数据报的ACK报文,那么就重新发送数据,直到发送成功为止。

2.超时

超时时间的计算是超时的核心部分,TCP要求这个算法能大致估计出当前的网络状况,虽然这确实很困难。要求精确的原因有两个:(1)定时太久会造成网络利用率不高。(2)定时太短会造成多次重传,使得网络阻塞。所以,书中给出了一套经验公式,和其他的保证计时器准确的措施。

计时器的使用

  1. 一个连接中,有且仅有一个测量定时器被使用。也就是说,如果TCP连续发出3组数据,只有一组数据会被测量。

  2. ACK数据报不会被测量,原因很简单,没有ACK的ACK回应可以供结束定时器测量。

RTT(往返时间):指发送端发送TCP报文段开始到接收到对方的确定所使用的时间. 
RTO(超时重传时间):发送端发送TCP报文段后,在RTO时间内没有收到对方确定,即重传该报文段.

3.拥塞避免算法

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

该算法假定由于分组受到损坏引起的丢失是非常少的,因此分组丢失意味着网络拥塞。

有两种分组丢失的指示:超时 和 重复的ACK。

拥塞避免算法和慢启动算法对每个连接维持两个变量: 拥塞窗口( cwnd ) 和 慢启动门限( ssthresh )

算法工作过程:

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

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

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

(4)当新的数据被对方确认时,就增加cwnd,但增加的方法依赖于我们是否正在进行慢启动或拥塞避免.如果cwnd <= ssthresh,则正在进行慢启动,否则正在进行拥塞避免. 
慢启动一直持续到我们回到当拥塞发生时所处位置的半时候才停止,然后转为执行拥塞避免。


这里写图片描述 

cwnd增加方式:

慢启动初始cwnd为1,每收到一个确定就加1.成指数增长. 
拥塞避免算法在每个RTT内增加 1/cwnd 个报文,成线性增长. 
慢启动根据收到的ACK次数增加cwnd,而拥塞避免算法在一个RTT不管收有多少ACK也只增加一次.

4.快速重传与快速恢复算法

如果收到3个重复ACK,可认为该报文段已经丢失,此时无需等待超时定时器溢出,直接重传丢失的包,这就叫【快速重传算法】.而接下来执行的不是慢启动而是拥塞避免算法,这就叫【快速恢复算法】.

快重传配合使用快恢复算法,有以下两个要点:

①当发送方连续收到三个重复确认时,就执行“乘法减小”算法,把ssthresh门限减半。但是接下去并不执行慢启动算法。

②考虑到如果网络出现拥塞的话就不会收到好几个重复的确认,所以发送方现在认为网络可能没有出现拥塞。所以此时不执行慢启动算法,而是将cwnd设置为ssthresh的大小,然后执行拥塞避免算法。


这里写图片描述 

5.ICMP差错

(1)源站抑制的ICMP将拥塞窗口cwnd置为1个报文段,并发起慢启动,慢启动门限ssthresh不变,窗口将打开直至开放了所有的通路(受窗口大小和往返时间的限制)或者发生了拥塞;

(2)主机不可达或网络不可达的ICMP将被忽略,继续发送直至超时。 
(但是TCP会保留下ICMP的错误并且通知用户)

6.重新分组

TCP为了提高自己的效率,允许再重新传输的时候,只要传输包含重传数据报文的报文就可以,而不用只重传需要传输的报文。

比如,第二个报文段需要重传,它可以跟第三个报文段的数据重组成一个较大的报文段然后发送。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值