TCP系列12—重传—2、Linux超时重传引入示例
在前面我们概述了TCP的超时重传之后我们简单的看一下tcp超时重传的示例。首先简单的描述一下测试过程
1、设置/proc/sys/net/ipv4/tcp_early_retrans为2,关掉TLP功能(后面内容介绍TLP)。设置/proc/sys/net/ipv4/tcp_retries2为8,减少重传次数,这样方便wireshark抓包演示。同时设置/proc/sys/net/ipv4/tcp_discard_on_port为9877,以让client可以精确的控制发出的TCP报文,而不受到内核TCP模块的影响。
2、client通过raw socket直接在IP层之上构造TCP报文,与server通过三次握手建立连接,其中client为127.0.0.1:10000,server为127.0.0.1:9877。这个步骤对应No1--No3报文。
3、TCP连接建立后client发送"hello"消息给服务器,服务器则回复ACK,这个步骤对应No4--No5报文。
4、server发送“hello”给client,这个步骤对应No6报文。
5、client收到server的"hello"报文后,直接丢弃并不回复ACK。
6、server在没有收到ACK报文的情况下,过了大约1.5s后,server端RTO超时,触发超时重传。client同样在收到这些重传报文的时候直接丢弃而不回复ACK,这样server持续重传。一共重传了6次。
这个过程的wireshark截图如下(为了方便观察RTO,我把No6初传设置为时间参考点,后面数据包的Time时间都是相对于No6包的时间):

从这个超时重传示例中我们重点关注几个方面
1、可以看到No7第一次重传与No6初传间隔大约为1.5s,No8第二次重传与No7时间间隔大约是3.0s,No9第三次重传与No8时间间隔大约是6.0s。可以看到每次重传后,重传的时间间隔(即RTO)都是上次重传时间间隔的2倍。实际我们从server端程序可以获取到Linux内核中TCP模块计算的RTO分别为1.504s、3.008s、6.016s。也可以精确的看到RTO的倍增关系。这种RTO倍增关系就是)
timeout = ((2 << tcp_retries2) - 1) * rto_base; else timeout = ((2 << 9) - 1) * rto_base + (tcp_retries2 - 9) * TCP_RTO_MAX;在RFC1122中有两个门限R1和R2,当重传次数超过R1的时候,TCP向IP层发送negative advice,指示IP层进行MTU探测、刷新路由等过程,以防止由于网络链路发生变化而导致TCP传输失败。当重传次数超过R2的时候,TCP放弃重传并关闭TCP连接。其中R1和R2也可以表述为时间,即总重传时间超过R1或者R2的时候触发响应的操作。在linux中对于普通数据报文状态下的TCP,R1对应/proc/sys/net/ipv4/tcp_retries1,R2对应/proc/sys/net/ipv4/tcp_retries2参数。这两个参数都是根据上面的计算流程计算出一个timeout值,当总重传时间超过这个timeout值还没有收到ack的时候触发响应的操作。对于SYN报文如我们之前所讲,则是由tcp_syn_retries和tcp_synack_retries这两个参数控制。
补充说明:
1、linux中根据tcp_retries1和tcp_retries2计算timeout的过程参考代码retransmits_timed_out。
2、网上很多资料以及man 7 tcp和第二版的tcpip详解中对于tcp_retries1或tcp_retries2描述都是按照重传次数来描述的,实际上是错误的。
TCP系列12—重传—2、Linux超时重传引入示例的更多相关文章
- 深入浅出图解【计算机网络】 之 【TCP可靠传输的实现2: 超时重传+拥塞控制】
[前言]上一篇文章介绍了关于TCP的基础知识,以及建立(释放)连接和滑动窗口的概念. 本篇文章将延续上一篇的思路,继续介绍TCP实现可靠传输的机制. 超时重传 上一篇文章里介绍过TCP采用停止等待协议 ...
- TCP系列45—拥塞控制—8、SACK关闭的拥塞撤销与虚假快速重传
一.概述 这篇文章介绍一下TCP从Recovery状态恢复到Open状态的时候cwnd的更新.我们在tcp重传部分的文章中曾经介绍过虚假重传的概念,Linux在探测到虚假重传的时候就会执行拥塞撤销操作 ...
- TCP系列16—重传—6、基础快速重传(Fast Retransmit)
一.快速重传介绍 按照TCP协议,RTO超时重传是一个非常重要的事件,当RTO超时的时候,TCP会同时通过两种方式非常谨慎的降低发送数据包的速率,一种是基于拥塞控制削减发送窗口的大小,另外一个是通过指 ...
- TCP系列21—重传—11、TLP
一.介绍 Tail Loss Probe (TLP)是同样是一个发送端算法,主要目的是使用快速重传取代RTO超时重传来处理尾包丢失场景.在一些WEB业务中,如果TCP尾包丢失,如果依靠RTO超时进行重 ...
- TCP系列42—拥塞控制—5、Linux中的慢启动和拥塞避免(二)
在本篇中我们继续上一篇文章wireshark的示例讲解,上一篇介绍了一个综合示例后,本篇介绍一些简单的示例,在读本篇前建议先把上一篇读完,为了节省篇幅,本篇只针对一些特殊的场景点报文进行讲解,不会像上 ...
- TCP具体解释(3):重传、流量控制、拥塞控制……
传输数据 在TCP的数据传送状态.非常多重要的机制保证了TCP的可靠性和强壮性.它们包括:使用序号.对收到的TCP报文段进行排序以及检測反复的数据:使用校验和来检測报文段的错误.使用确认和计时器来检測 ...
- TCP系列44—拥塞控制—7、SACK关闭的快速恢复
) return; delta = ssthresh - in_flight; prr_delivered += newly_acked_sacked; if (delta < 0 ...
- TCP系列54—拥塞控制—17、AQM及ECN
一.概述 ECN的相关内容是在RFC3168中定义的,这里我简单描述一下RFC3168涉及的主要内容. 1.AQM和RED 目前TCP中多数的拥塞控制算法都是通过缓慢增加拥塞窗口直到检测到丢包来进行慢 ...
- TCP系列48—拥塞控制—11、FRTO拥塞撤销
一.概述 FRTO虚假超时重传检测我们之前重传章节的文章已经介绍过了,这里不再重复介绍,针对后面的示例在说明两点 1.FRTO只能用于虚假超时重传的探测,不能用于虚假快速重传的探测. 2.延迟ER重传 ...
随机推荐
- day 13 内置函数
内置函数思维导图:https://www.processon.com/view/link/5c13ad2de4b0ed122da75668 内置函数 作用域相关: locals() 返回当前作用域 ...
- hive 查看表结构和属性
1.查看数据库/表 show databases/tables; 2.切换数据库 use database_name; 3.查看表结构 desc table_name; 4.查看表详细属性 desc ...
- django创建第一个子应用-3
在Web应用中,通常有一些业务功能模块是在不同的项目中都可以复用的,故在开发中通常将工程项目拆分为不同的子功能模块,各功能模块间可以保持相对的独立,在其他工程项目中需要用到某个特定功能模块时,可以将该 ...
- 『Python基础-14』匿名函数 `lambda`
匿名函数和关键字lambda 匿名函数就是没有名称的函数,也就是不再使用def语句定义的函数 在Python中,如果要声匿名函数,则需要使用lambda关键字 使用lambda声明的匿名函数能接收任何 ...
- PHP实现识别带emoji表情的字符串
function have_special_char($str) { $length = mb_strlen($str); $array = []; for ($i=0; $i<$length; ...
- dfs 队列
题目来源 poj 1562 Description The GeoSurvComp geologic survey company is responsible for detecting unde ...
- 【NAS】CIFS用户场景需求分析
1.everyone用户 1.1: 场景描述:共享目录为rule,所有用户都可以查看,但是不能修改: 解决方法:在smb.conf里配置read only = yes,具体示例如下: [rule] p ...
- CentOS下安装Tomcat环境
一.安装JAVA环境 1.安装JAVA mkdir -p /usr/local/java 下载jdk1.7.0_67.tar.gz包,并解压到 tar xf jdk1.7.0_67.tar.gz -C ...
- 03-JVM内存模型:堆与方法区
一.堆(Heap) 1.1.什么是堆 堆是用于存放对象的内存区域.因此,它是垃圾收集器(GC)管理的主要目标.其具有以下特点: 堆在逻辑上划分为“新生代”和“老年代”.由于JAVA中的对象大部分是朝生 ...
- selenium--特殊元素定位
该篇博客总结特殊元素(select.radio\checkbox.时间控件.文件上传.图片验证码.模拟鼠标操作.Js 或 JQuery调用)操作. 1.select @Test public void ...