TCP超时与重传
2017-02-21 13:09:14 0 举报
AI智能生成
登录查看完整内容
TCP超时与重传
作者其他创作
大纲/内容
TCP超时与重传
1.基于时间(超时重传)
参数1:愿意重传的次数或等待的时间
参数2:放弃当前连接的时机
但是TCP要适应各种不同的网络,所以重传的时间是基于当前状态动态设置的,如何根据RTT动态设置RTO?
准备工作:TCP接收端在收到数据的时候,会返回一个ACK信息,所以我们可以在这个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
b:时延因子,推荐1.3~2.0ubound: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
另外一种计算机方便实现的写法:
Err=M-strr
srtt=srtt+g(Err)
rttvar=rttvar+h(|Err|-rttvar)
RTO=srtt+4(rttvar)
初始值
重传二义性与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.基于ACK信号(快速重传)
当接收到失序报文段的时候,TCP接收端需要立即发送重复ACK(不能延迟发送)给发送端,以此表明收到了失序报文段,使发送端尽快填补空缺。
重复ACK也可能在另外一种情况下发生:失序分组。即接收端收到了当前期待分组的后面的分组,那么期待分组可能是丢失了,也可能只是延迟到达。我们无法区分这2种情况,所以一般会设置一个阀值:等待一定数目的重复ACK来决定数据是否丢失并触发快速重传,通常该值=3
根据重复ACK推断出的丢包一般与网络拥塞有关,所以伴随着快速重传还应触发拥塞控制机制
0 条评论
回复 删除
下一页