您的位置:首页 > 理论基础 > 计算机网络

《TCP/IP详解 卷1:协议》 读书笔记 第21章 TCP的超时与重传

2016-09-06 17:16 846 查看

TCP的超时与重传

TCP的超时与重传
引言

超时
往返时间测量

Karn算法

拥塞
拥塞避免算法

快速重传和快速恢复算法

ICMP的差错

重新分组

引言

TCP提供可靠的运输层,方法之一就是确认从另一端收到的数据。但是数据和确认都有可能会丢失。

如果当定时器溢出时还没有收到确认,它就重传该数据。

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

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

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

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

2MSL定时器测量一个连接处于TIME_WAIT状态的时间。(2MSL在结束一个连接的时候说过)

超时

连续重传之间的时间差是不同的,每次重传时增加1倍,直至64秒,超出一定时间之后选择放弃重传。这个倍乘关系称为“指数退避”。

往返时间测量

RTT的测量是超时重传中最重要的部分。

路由器和网络流量均会改变,TCP应该跟踪这些变化并相应改变其超时时间。

最初的RTT估计器:

R←αR+ ( 1- α)M

式中M表示测量到的RTT,α为权重,一般为0.9.

后来提出了一个RTO(重传超时时间)

RTO=Rβ

这里β一般为2。

但是以上的方法在RTT变化范围很大的时候,显然跟不上这种变化,会引起不必要的重传。于是提出了新的方案:

除了被平滑的RTT估计器,所需要做的还有跟踪RTT的方差。在往返时间变化起伏很大时,基于均值和方差来计算RTO,将比作为均值的常数倍数来计算RTO能提供更好的响应。

Err = M-A

A←A + g Err

D←D + h( | Err |-D)

RTO = A + 4D

这里的A是被平滑的RTT(均值的估计器)而D则是被平滑的均值偏差。E rr是刚得到的测量结

果与当前的RTT估计器之差。A和D均被用于计算下一个重传时间(RTO)。增量g起平均作用,取为1/8(0.125)。偏差的增益是h,取值为0.25。当RTT变化时,较大的偏差增益将使RTO快速上升。

Karn算法

当一个超时和重传发生时,在重传数据的确认最后到达之前,不能更新RTT估计器,因为我们并不知道ACK对应哪次传输(也许第一次传输被延迟而并没有被丢弃,也有可能第一次传输的ACK被延迟)。

在任何时候对每个连接仅测量一次RTT值。在发送一个报文段时,如果该连接的定时器已经被使用,则该报文段不会被计时。

对一个没有被重传的报文段来说,也要在收到一个ACK之后才能计算新的RTO。

拥塞

分组丢失的指示:超时、收到重复的确认ACK(3次重复)。

拥塞避免算法

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

拥塞避免算法和慢启动算法是两个不同目的、独立的算法。但是这两个算法经常一起实现。

拥塞避免算法和慢启动算法需要2个变量:拥塞窗口cwnd和一个慢启动门限ssthresh。

工作流程如下:

初始化cwnd为1个报文段,ssthresh为65535字节。

TCP输出例程的输出不能超过cwnd和接收方通告窗口的大小。(慢启动说过了)

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

如果cwnd <= ssthresh,则正在进行慢启动,否则正在进行拥塞避免. 当慢启动过程cwnd大小到达ssthresh,就变为拥塞避免,每次只增加1报文段.



快速重传和快速恢复算法

在收到一个失序的报文段的时候,TCP立即返回一个ACK,告诉对方希望收到的序号。

当收到3个以上的重复ACK时,判断一个报文段丢失了。无需等待定时器溢出,马上重传丢失的数据报文段,这就是快速重传。接下来执行的不是慢启动算法,而是拥塞避免算法的话,这就是快速恢复算法

没有执行慢启动的原因:收到重复ACK告诉我们两端还有流动的数据,不想用慢启动来突然减少数据流。

流程:

收到3个重复ACK之后,将ssthresh设置为cwnd的一半。重传丢失的报文段,设置cwnd为ssthresh加上3倍的报文段大小。

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

当下一个确认新数据的ACK到达时,设置cwnd为ssthresh(第1步中设置的值)。

ICMP的差错

TCP能够遇到的最常见的ICMP差错就是源站抑制、主机不可达和网络不可达。

收到源站抑制,会引起慢启动,但是ssthresh没有变化。

主机不可达和网络不可达都会被忽略。

重新分组

当TCP超时重传时,不一定要重传相同的报文段。比如可以重新分组,发送一个较大的报文段。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  TCP 超时 重传