在前面我们概述了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超时重传引入示例的更多相关文章

    1. 深入浅出图解【计算机网络】 之 【TCP可靠传输的实现2: 超时重传+拥塞控制】

      [前言]上一篇文章介绍了关于TCP的基础知识,以及建立(释放)连接和滑动窗口的概念. 本篇文章将延续上一篇的思路,继续介绍TCP实现可靠传输的机制. 超时重传 上一篇文章里介绍过TCP采用停止等待协议 ...

    2. TCP系列45—拥塞控制—8、SACK关闭的拥塞撤销与虚假快速重传

      一.概述 这篇文章介绍一下TCP从Recovery状态恢复到Open状态的时候cwnd的更新.我们在tcp重传部分的文章中曾经介绍过虚假重传的概念,Linux在探测到虚假重传的时候就会执行拥塞撤销操作 ...

    3. TCP系列16—重传—6、基础快速重传(Fast Retransmit)

      一.快速重传介绍 按照TCP协议,RTO超时重传是一个非常重要的事件,当RTO超时的时候,TCP会同时通过两种方式非常谨慎的降低发送数据包的速率,一种是基于拥塞控制削减发送窗口的大小,另外一个是通过指 ...

    4. TCP系列21—重传—11、TLP

      一.介绍 Tail Loss Probe (TLP)是同样是一个发送端算法,主要目的是使用快速重传取代RTO超时重传来处理尾包丢失场景.在一些WEB业务中,如果TCP尾包丢失,如果依靠RTO超时进行重 ...

    5. TCP系列42—拥塞控制—5、Linux中的慢启动和拥塞避免(二)

      在本篇中我们继续上一篇文章wireshark的示例讲解,上一篇介绍了一个综合示例后,本篇介绍一些简单的示例,在读本篇前建议先把上一篇读完,为了节省篇幅,本篇只针对一些特殊的场景点报文进行讲解,不会像上 ...

    6. TCP具体解释(3):重传、流量控制、拥塞控制……

      传输数据 在TCP的数据传送状态.非常多重要的机制保证了TCP的可靠性和强壮性.它们包括:使用序号.对收到的TCP报文段进行排序以及检測反复的数据:使用校验和来检測报文段的错误.使用确认和计时器来检測 ...

    7. TCP系列44—拥塞控制—7、SACK关闭的快速恢复

      ) return;    delta = ssthresh - in_flight;     prr_delivered += newly_acked_sacked; if (delta < 0 ...

    8. TCP系列54—拥塞控制—17、AQM及ECN

      一.概述 ECN的相关内容是在RFC3168中定义的,这里我简单描述一下RFC3168涉及的主要内容. 1.AQM和RED 目前TCP中多数的拥塞控制算法都是通过缓慢增加拥塞窗口直到检测到丢包来进行慢 ...

    9. TCP系列48—拥塞控制—11、FRTO拥塞撤销

      一.概述 FRTO虚假超时重传检测我们之前重传章节的文章已经介绍过了,这里不再重复介绍,针对后面的示例在说明两点 1.FRTO只能用于虚假超时重传的探测,不能用于虚假快速重传的探测. 2.延迟ER重传 ...

    随机推荐

    1. Centos7 安装ipython 和 ipython3

      [root@localhost ~]# wget https://pypi.python.org/packages/79/63/b671fc2bf0051739e87a7478a207bbeb45cf ...

    2. php比较两个数组的差异array_diff()函数

      下面简单介绍php比较两个数组的差异array_diff()函数. 原文地址:小时刻个人技术博客 > http://small.aiweimeng.top/index.php/archives/ ...

    3. python类的封装

      Python之类的封装 1. 什么是封装 装:往容器/名称空间里存入名字 封:代表将存放于名称空间中的名字给藏起来,这种隐藏对外不对内(怎么做到的,在下文解释) 2. 为何要封装 封数据属性:不想要给 ...

    4. 分布式专题(二)——Zookeeper的ZAB协议介绍

    5. CakePHP2.x 发送邮件

      cake提供了多种发送邮件的方法,并且简单实用.以2.x为例 第一步 创建并添加邮件配置信息 拷贝app\Config\email.php.default 为email.php 打开在EmailCon ...

    6. centos配置ip地址 添加多个ip地址的方法

      操作如下,登陆SSH: vi /etc/sysconfig/network-scripts/ifcfg-eth0: 第二个IP,就是 vi /etc/sysconfig/network-scripts ...

    7. oradebug 的学习 一

          说明 oradebug主要是给oracle支持人员使用的,尽管很早便有,但oracle官网很少有记载.他是个sql*plus命令行工具,有sysdba的权限就可以登入,无需特别设置.他可以被用 ...

    8. OSG-简单模型控制

      本文转至http://www.cnblogs.com/shapherd/archive/2010/08/10/osg.html 作者写的比较好,再次收藏,希望更多的人可以看到这个文章 互联网是是一个相 ...

    9. 记录---Testin上新手测试用例设计实战---碎乐3.2.0

      平台上给的版本是碎乐3.12版的,但是平台上给的安装包下载不了,所以加群咨询之后给出了直接去手机应用商店下载搜索到的版本的对策.所以就那应用商店中找到的3.2.0版本来设计测试用例.因为任务中没有给出 ...

    10. Linux命令应用大词典-第12章 程序编译

      12.1 gcc:GNU项目的C和C++编译器 12.2 gdberver:为GNU调试的远程服务器 12.3 cmake:跨平台的Makefile生成工具 12.4 indent:更改通过插入或删除 ...