TCP超时重传时间的选择
一---导读
TCP超时重传时间的选择是计算机网络中较复杂的问题之一,但幸好前辈们都把路铺好了,我们只需要学习并且遵循这些规则,有能力的话去进一步改正。
二---必知的一些专业术语
A--RTT( round-trip time)往返时延。代表TCP发送方从发送报文段开始,到接收到接收方发送的确认报文段的这段时间.

B--RTO(Retransmissinon Time -out)超时重传时间。
三---重传时间的公式和选择
思考这样两个问题,如果超时重传时间RTO设置的比往返时间RTT还要小,那么在发送方还没收到确认之前,该数据报文段发生了不必要的重传。多此一举。

如果超时重传时间RTO设置的比往返时延RTT大很多,那么网络空闲的时间就会较大(因为在重传时间内,不能进行其它报文段的发送),减低了网络传输的效率。

通过以上两个问题总结我们是否可以得出这样的结论:超时重传时间RTO的值是不是设置的比第一次往返时间RTT0的值略大就行了呢?答案是否定的,网络速率千变万化,受很多因素(如路由器,带宽)的影响,可能第一次RTT0是一个值,第二次RTT1的值又是另外一个值,那么如果把RTO的值固定写死那就行不通。

上图表面如果RTO固定的话会造成“TCP数据报文段1”发生不必要的重传
第二次的RTT1要大于第一次的RTT0,于是第一次的RT0的选择值在这里就不适合了。针对这一个复杂的问题,我们不能用某次测量的值来计算超时重传时间RTO。这时就需要借鉴中华名族的优秀传统-折中。利用每次测量的RTT样本,然后取一个加权平均值RTTs。
新的加权平均往返时间RTTs = (1 - a)x 旧的RTTs + a x 新的RTT样本。(其中0 < a < 1)
如果 a很小,趋近于0,说明新的RTT样本作用不大。
如果 a 很大,趋近于1,则说明旧的RTTs对新的RTTs的影响很小。
现在通用的a的取值为1/8,即0.125。
显然,新的RT0的值应该要略大于RTTs的值。
RTO = RTTs + 4 x RTTd(RTTd为RTT偏差的加权平均)
RTTd1 = RTT1 / 2
新的RTTd = (1-B) x 旧的RTTd+B x |RTTs-新的RTT样本| 。 (其中0< B<1)
B的建议取值为1/4,即0.25
从上面可以看出,新的RTT样本的计算正确与否特别重要。
RTT的测量容易出现下面图示的问题

解决上面问题的办法是:报文段每重传一次,就增大RTO的值,典型的做法是把新的RTO的值取值为旧RTO的两倍。
四---习题与总结
超时重传时间的问题比较复杂,但重要的是理解并记忆两个公式,最后,以一个练习来结束总结本文,如下图

TCP超时重传时间的选择的更多相关文章
- TCP/IP笔记 三.运输层(3)——TCP超时重传算法
TCP 每发送一个报文段,就对这个报文段设置一次计时器.只要计时器设置的重传时间到但还没有收到确认,就要重传这一报文段 1. 平均往返时延RTT 往返时延:一个报文段发出的时间,以及收到相应的确认报文 ...
- 【原创】TCP超时重传机制探索
TCP超时重传机制探索 作者:tll (360电商技术) 1)通信模型 TCP(Transmission Control Protocol)是一种可靠传输协议.在传输过程中当发送方(sender)向接 ...
- TCP超时重传、滑动窗口、拥塞控制、快重传和快恢复
TCP超时重传 原理是在发送某一个数据以后就开启一个计时器,在一定时间内如果没有得到发送的数据报的ACK报文,那么就重新发送数据,直到发送成功为止. 影响超时重传机制协议效率的一个关键参数是重传超时时 ...
- 《TCP/IP详解 卷一》读书笔记-----TCP超时重传
1.TCP提供的是可靠传输,它通过接收方发送一个确认报文ACK来提供这种可靠性.但是数据报文和确认报文都可能会丢失,所以TCP会给发出的数据报文设置一个时间,如果超时了则进行重传 2.Karn's A ...
- linux tcp超时重传实现分析
kernel version 3.18.20 1.函数调用关系 tcp_ack-> tcp_clean_rtx_queue-> tcp_ack_update_rtt-> tp-> ...
- 计算TCP链接的RTO超时重传时间
- TCP超时重传、序列号、滑动窗口简介
文章目录 12 TCP:传输控制协议(初步) 12.1 引言 12.1.1 ARQ和重传 12.1.2 分组窗口和滑动窗口 12.1.3 变量窗口:流量控制和拥塞控制 12.1.4 变量窗口:设置重传 ...
- TCP超时重传机制
TCP协议在能够发送数据之前就建立起了"连接".要实现这个连接,启动TCP连接的那一方首先将发送一个SYN数据包.这只是一个不包含数据的数据包, 然后,打开SYN标记.如果另一方同 ...
- 深入浅出图解【计算机网络】 之 【TCP可靠传输的实现2: 超时重传+拥塞控制】
[前言]上一篇文章介绍了关于TCP的基础知识,以及建立(释放)连接和滑动窗口的概念. 本篇文章将延续上一篇的思路,继续介绍TCP实现可靠传输的机制. 超时重传 上一篇文章里介绍过TCP采用停止等待协议 ...
随机推荐
- PyQt(Python+Qt)学习随笔:树型部件的QTreeWidgetItem项中列不同角色数据的有关访问方法
老猿Python博文目录 专栏:使用PyQt开发图形界面Python应用 老猿Python博客地址 树型部件QTreeWidget中的QTreeWidgetItem项中可以有多列数据,每列数据可以根据 ...
- 利用IDEA把Java项目打成jar包
第一步:按如下步骤或Ctrl+Shift+Alt+S打开 Project Structure第二步:第三步:选择要执行的文件, 依次选择项目, main方法所在的文件, 保存如果出现以下错误:则根据 ...
- 解压版mysql+免破解版Navicat,好用!
解压版mysql安装流程 获取mysql压缩包 获取地址: 链接:https://pan.baidu.com/s/1HqdFDQn_6ccPM0gOftApIg 提取码:n19t 获取压缩包后可安装压 ...
- Day5 - 05 函数的参数-关键字参数
可变参数可以传入任意个参数,并在函数调用时自动组为一个tuple,而关键字参数允许传入任意个携带参数名的参数,这些关键字参数在函数内部自动组为一个dict. >>> ...
- PHP代码审计学习-PHP-Audit-Labs-day2
filter_var()函数 filter_var() 函数通过指定的过滤器过滤一个变量.如果成功,则返回被过滤的数据.如果失败,则返回 FALSE. filter_var(variable, fil ...
- 解决idea 中web项目无法正常显示的问题
- MySQL锁(四)行锁的加锁规则和案例
在上一篇文章,我们学习了间隙锁和next-key lock,但是不知道怎么加锁,有哪些规则.间隙锁的概念不太好理解,尤其是配合上行锁后,很容易在判断是否会出现锁等待的问题上犯错. 今天我们就来学习一下 ...
- 2020年下征文+没有计算机经验的宝妈也可以轻松领证一次过关啦 nice !相信努力总会收获
2020年下征文+没有计算机经验的宝妈也可以轻松领证http://www.1634.com.cn/ruankao/forum.php?mod=viewthread&tid=5363&f ...
- Spring中BeanFactory与FactoryBean到底有什么区别?
一.BeanFactory BeanFactory是一个接口,它是Spring中工厂的顶层规范,是SpringIoc容器的核心接口,它定义了getBean().containsBean()等管理Bea ...
- 安利一波这12个IDEA插件,太香了!
这里补充一下常用的插件, 非常值得安利一波! 1.日晒主题 Solarized Themes 推荐指数:☆☆☆☆☆ 推荐理由:日晒主题本身是为vim定制的.后来移植到ide 非常酷!配色非常耐看. ...