读书人

libjingle源码解析(6)-【PseudoTcp】建

发布时间: 2012-06-30 17:20:12 作者: rapoo

libjingle源码解析(6)-【PseudoTcp】建立UDP之上的TCP(4):超时与重传

超时与重传

TCP是面向连接的可靠的运输层。当数据丢失时,TCP需要重传包。TCP通过设置定时器解决这种问题。

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

1)重传定时器:用于当希望收到另一端的确认,而没有收到时。

2)坚持定时器:使窗口大小信息保持不断流动。

3)保活定时器:可检测空闲连接另一端何时崩溃或重启。

4)2MSL定时器:测量TIME_WAIT状态的时间。

PTCP本身是没有提供定时器的,而通过方法GetNextClock让调用者获取下一个定时器触发的时机,当定时器触发下一个超时时,需要调用方法NotifyClock。

超时时间设置

TCP设置获得确认ACK包的超时时间设置序列可能为1.5S,3S,6S,12S,24S,48S,64S,当超时持续时间多于9分钟时,TCP会被复位(RST),即“指数退避”。

那么这个超时值是怎么计算呢?

如果能很好的估计RTT话,如果确认包在一个RTT之内没有收到回报,那么可以认为丢包发生。

TCP最初的RTT估算方法为

R = aR+(1-a)M

其中平滑因子a取为90%,M表示这次测量的RTT,即这个包发送到获取ACK的时间间隔。

这个算法通过平滑因子来避免R的值受新的M的浮动过大的影响。然而这恰恰在RTT浮动比较大的连接中无法及时的反应连接情况。并且网络处于饱和状态时,频繁重传会导致火上烧油。Jacobson对此设计了新的算法:

Err = M - A

A = A+g*Err

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

RTO = A + 4D

增量g为0.125(1/8),Err为上一个得到的值和新的RTT的差。A为上一个测到的增量后的数据,h为0.25。

当RTT变化大时,Err也会变大,导致D也会变大,导致RTO快速上升。某一次连接的估值和真正的RTT关系估下:

libjingle源码解析(6)-【PseudoTcp】建立UDP之下的TCP(4):超时与重传

PTCP实现如下:

PTCP设置最大超时时间为60S。当收到ACK时,计算RTT是通过PTCP头部的TimeStamp差值计算,所以Karn算法在此不管用。RTO的算法和上面所述一致:

1)Err = rtt - m_rx_srtt

2)D=D+0.25*(abs(Err-D))

3)m_rx_srtt = m_rx_srtt + err/8

4)RTO = m_rx_srtt+D

下面的代码实现,有一定的不同,但仔细分析和上面算法是一致的。



重新分组

当TCP超时重传时,可以允许以更大的且不大于MSS的报文发送,即合并后续的数据一起发送,PTCP也是如此处理的。

读书人网 >互联网

热点推荐