TCP超时与重传
2017-02-21 13:09:14 0 举报
AI智能生成
TCP超时与重传
作者其他创作
大纲/内容
1.基于时间(超时重传)
算法1:二进制指数退避:每次重传的时间间隔加倍
,有2个参数设置:R1,R2(R1>3次,R2>100S)
但是对不同的数据报的阀值不一样,如果是新建连接时候的SYN报文,R2>3分钟
,有2个参数设置:R1,R2(R1>3次,R2>100S)
但是对不同的数据报的阀值不一样,如果是新建连接时候的SYN报文,R2>3分钟
参数1:愿意重传的次数或等待的时间
参数2:放弃当前连接的时机
在linxu中,r1默认3,r2默认是重传15次,约为13-30分钟
但是TCP要适应各种不同的网络,所以重传的时间是基于当前状态动态设置的,如何根据RTT动态设置RTO?
准备工作:TCP接收端在收到数据的时候,会返回一个ACK信息,所以我们可以
在这个ACK信息中携带一个字节的数据来测量传输该确认信息所需要的时间。每
个测量结果称为RTT样本。然后TCP根据一段时间的RTT样本得到一个RTO估计值
那么如何根据RTT估计RTO呢?
在这个ACK信息中携带一个字节的数据来测量传输该确认信息所需要的时间。每
个测量结果称为RTT样本。然后TCP根据一段时间的RTT样本得到一个RTO估计值
那么如何根据RTT估计RTO呢?
经典方法
SRTT=aSRTT+(1-a)*RTT
SRTT为平滑RTT估计值,所以SRTT是基于当前值和新的样本值来更新的。a为平滑因子,推荐0.8~0.9
因此,根据a的设定值,新的估计值有80%~90%来自当前值,10%~20%来自新的样本值。
这种计算方法称为EWMA。考虑到SRTT估计器得到的估计值会随着RTT而变化。[RFC0793]根据以下公式设置RTO
因此,根据a的设定值,新的估计值有80%~90%来自当前值,10%~20%来自新的样本值。
这种计算方法称为EWMA。考虑到SRTT估计器得到的估计值会随着RTT而变化。[RFC0793]根据以下公式设置RTO
RTO=min(ubound,max(lbound,b*(SRTT)))
b:时延因子,推荐1.3~2.0
ubound:RTO的上边界,推荐1分钟
lbound:RTO下边界,推荐1S
该方法使得RTO设置为1S或者是2倍SRTT
称为经典方法
ubound:RTO的上边界,推荐1分钟
lbound:RTO下边界,推荐1S
该方法使得RTO设置为1S或者是2倍SRTT
称为经典方法
分析:若RTT相对稳定,则这种方法效果不错
若RTT波动较大,可以发现新的样本变化值如果变化较大的时候,如实际RTT远大于估计RTT,会引起不必要的重传。而增大的RTT样本已经表明了网络已经负载,若发生重传,则进一步加大了网络负担
因此可以考虑根据RTT测量值的变化情况和均值来得到较准确的估计值
标准方法
初始化值之后,按照下面方式进行估计:
strr=(1-g)strr+g(M)
rttvar=(1-h)rttvar+h(|M-srtt|)
RTO=srtt+4*rttvar
M为每个测量结果,strr为平均值的EWMA(经典方法中提到的计算方法),rttvar为平均偏差的EWMA
另外一种计算机方便实现的写法:
Err=M-strr
srtt=srtt+g(Err)
rttvar=rttvar+h(|Err|-rttvar)
RTO=srtt+4(rttvar)
Err为当前的测量值M与估计值srtt的误差,srtt为均值的EWMA,rttvar为绝对误差的EWMA,g为新RTT样本占SRTT估计值的比重,=1/8。h为新的平均偏差样本占偏差估计值的比重,=0.25
这种方法加入了对测量值和估计值之前的误差的考虑:M-srtt。且若误差越大,表明网络越来越差(或越好),则h(|M-srtt|)也越大,RTO中该项占的比重较大,所以影响大,能较快的提高RTO的值。而经典方法里面,测量值仅占0.1~0.2,改变速度太慢。
初始值
在首个SYN报文交换之前,TCP无法获取RTO的值,也就无法获取估计器的估计值。根据[RFC6298],RTO初始值为1S,初始SYN段的超时间隔为3S。收到首个RTT测量结果M之后,估计器按照以下方式初始化:srtt=M,rttvar=M/2
重传二义性与Karn算法
假设一个包的传输出现超时,该包会被重发,接着发送端收到一个确认信息,该信息是第一次的还是第二次的包的确认信号呢?
Karn算法第一部分指出:当出去重传超时时,接收到的确认信息不能用来更新RTT估计值。但是如果我们只是简单的忽略重传问题,就可能将网络中的有用信息也忽略了,即网络中可能存在一些因素影响了传输速度。这时候,如果在再次发生丢包前,降低重传率可以减少网络负担,也就是指数退避算法。
TCP在计算RTO时采用一个退避系数,每当计时器出现超时,则退避系数加倍,直到接收到非重传数据,此时系数设置为1。仅当接收到未重传的数据时,该SRTT才用于计算RTO.
linux里面是怎么做的?
RTO=srtt+4(rttvar)。这样有一个问题,因为rttvar是绝对误差,如果实际RTT大幅减小,rttvar也是增大的,从而会导致RTO增大。Linux通过减小RTT样本值
根据以上方法,TCP发送端根据得到的RTT测量值,就可以估计出RTO值,然后以此设置计时器。先记录需要被计时的报文段序列号。若及时收到了该报文段的ACK,则计时器取消。若在给定的RTO时间内没有收到ACK信息,就会触发超时重传。同时,它还会降低当前数据发送率在响应超时
1.基于拥塞控制机制减小窗口
2.每当为一个重传报文段再次重传时,会增大RTO的退避因子。特别的是当一个报文段被多次重传时,RTO会暂时性的乘上y来形成新的退避值:RTO=yRTO(y=1,2,4,8,不会超过最大值TCP_RTO_MAX,Linux上默认120s)
2.基于ACK信号(快速重传)
当接收到失序报文段的时候,TCP接收端需要立即发送重复ACK(不能延迟发送)给发送端,以此表明收到了失序报文段,使发送端尽快填补空缺。
重复ACK也可能在另外一种情况下发生:失序分组。即接收端收到了当前期待分组的后面的分组,那么期待分组可能是丢失了,也可能只是延迟到达。我们无法区分这2种情况,所以一般会设置一个阀值:等待一定数目的重复ACK来决定数据是否丢失并触发快速重传,通常该值=3
根据重复ACK推断出的丢包一般与网络拥塞有关,所以伴随着快速重传还应触发拥塞控制机制
0 条评论
下一页