网站推广怎么写牡丹江市西安区建设局网站
news/
2025/10/5 21:41:46/
文章来源:
网站推广怎么写,牡丹江市西安区建设局网站,企业名称核准查询系统,海北高端网站建设读 TCP 协议 RFC-793_rfc 793-CSDN博客TCP灌包中RTT时延与RTO超时关系 - konglingbin - 博客园 TCP的RTT算法
从前面的TCP重传机制我们知道Timeout的设置对于重传非常重要。
设长了#xff0c;重发就慢#xff0c;丢了老半天才重发#xff0c;没有效率#xff0c;性能差重发就慢丢了老半天才重发没有效率性能差设短了会导致可能并没有丢就重发。于是重发的就快会增加网络拥塞导致更多的超时更多的超时导致更多的重发。
而且这个超时时间在不同的网络的情况下根本没有办法设置一个死的值。只能动态地设置。 为了动态地设置TCP引入了RTT——Round Trip Time往返时延也就是一个数据包从发出去到回来的时间。这样发送端就大约知道需要多少的时间
从而可以方便地设置Timeout——RTORetransmission TimeOut超时重传时长以让我们的重传机制更高效。 听起来似乎很简单好像就是在发送端发包时记下t0然后接收端再把这个ack回来时再记一个t1于是RTT t1 – t0。没那么简单这只是一个采样不能代表普遍情况。
经典算法 TCP中的四个定时器2MSL定时器重传定时器坚持定时器保活定时器
首先是如何得到RTO值假设已经能测量到RTT值情况下 RTO值是依赖RTT值来确定的而鉴于网络环境的不稳定性RTT总是变化的 RTT 0.1*M 0.9*R; M当前测试的RTT值R历史RTT的值 RTORTT 一般取2
详解过程参见RFC793但是该方法是有缺陷的
新的方法 Err M - A M当前RTT值 A历史RTT值 平均值A AgErr A历史RTT值 g常量 方差D D h|Err| - D D历史D的值h常量 (重点)RTO A 4D
RTO的初始化 A0 D3即没有测的RTT情况下
RFC793 中定义的经典算法是这样的
1首先先采样RTT记下最近好几次的RTT值。
2然后做平滑计算SRTT Smoothed RTT。公式为其中的 α 取值在0.8 到 0.9之间这个算法英文叫Exponential weighted moving average中文叫加权移动平均
SRTT ( α * SRTT ) ((1- α) * RTT)
3开始计算RTO。公式如下
RTO min [ UBOUND, max [ LBOUND, (β * SRTT) ] ]
其中
UBOUND是最大的timeout时间上限值LBOUND是最小的timeout时间下限值β 值一般在1.3到2.0之间。
Karn / Partridge 算法
但是上面的这个算法在重传的时候会出有一个终极问题——你是用第一次发数据的时间和ack回来的时间做RTT样本值还是用重传的时间和ACK回来的时间做RTT样本值
这个问题无论你选那头都是按下葫芦起了瓢。 如下图所示
情况a是ack没回来所以重传。如果你计算第一次发送和ACK的时间那么明显算大了。情况b是ack回来慢了但是导致了重传但刚重传不一会儿之前ACK就回来了。如果你是算重传的时间和ACK回来的时间的差就会算短了。 所以1987年的时候搞了一个叫Karn / Partridge Algorithm这个算法的最大特点是——忽略重传不把重传的RTT做采样你看你不需要去解决不存在的问题。
但是这样一来又会引发一个大BUG——如果在某一时间网络闪动突然变慢了产生了比较大的延时这个延时导致要重转所有的包因为之前的RTO很小于是因为重转的不算所以RTO就不会被更新这是一个灾难。 于是Karn算法用了一个取巧的方式——只要一发生重传就对现有的RTO值翻倍这就是所谓的 Exponential backoff很明显这种死规矩对于一个需要估计比较准确的RTT也不靠谱。
Jacobson / Karels 算法
前面两种算法用的都是“加权移动平均”这种方法最大的毛病就是如果RTT有一个大的波动的话很难被发现因为被平滑掉了。所以1988年又有人推出来了一个新的算法这个算法叫Jacobson / Karels Algorithm参看RFC6289。这个算法引入了最新的RTT的采样和平滑过的SRTT的差距做因子来计算。 公式如下其中的DevRTT是Deviation RTT的意思
SRTT SRTT α (RTT – SRTT) —— 计算平滑RTT
DevRTT (1-β)*DevRTT β*(|RTT-SRTT|) ——计算平滑RTT和真实的差距加权移动平均
RTO µ * SRTT ∂ *DevRTT —— 神一样的公式
其中在Linux下α 0.125β 0.25 μ 1∂ 4 ——这就是算法中的“调得一手好参数”nobody knows why, it just works… 最后的这个算法在被用在今天的TCP协议中Linux的源代码在tcp_rtt_estimator。 参考https://blog.csdn.net/nb_zsy/article/details/127692944
http://runxinzhi.com/chris-cp-p-3893103.html
${EStime}
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/928766.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!