http://www.orczhou.com/index.php/2011/10/tcpip-protocol-start-rto/

概述:本文讨论主机在发送一个TCP数据包后,如果迟迟没有收到ACK,主机多久后会重传这个数据包。主机从发出数据包到第一次TCP重传开始,RFC中这段时间间隔称为retransmission timeout,缩写做RTO。本文会先看看RFC中如何定义RTO,然后看看Linux中如何实现。本文旨在分享:当遇到了TCP层问题改如何去查找、阅读文档,该如何去在Linux源码中寻求答案。

1. 起源

在分析MySQL Semi-sync故障时,我们用Tcpdump+Wireshark(感谢淘宝雕梁)抓住当时的网络包传送细节,观察到了一次TCP重传最终导致了Semi-sync超时:

第一次传输13:55:11.893291 master => slave Binlog pos:319890197重传:13:55:12.094596 master => slave Binlog pos:319890197

看到两次传送间隔约201毫秒,即第一次传输201毫秒后,还没有收到ACK响应,TCP认为传输超时,开始重传。

疑问:host和host之间的RTT大约是0.5毫秒,为什么第一次重传需要等200毫秒?(我希望是<20ms)socket程序可以配置吗RTO吗?TCP有参数可配置RTO吗?

2. Google/书籍/RFC

翻开TCP/IP详解找到关于TCP Retransmission章节,较详细的介绍TCP的超时机制,书中是个概述,于是又找到RFC1122。

RFC1122的4.2.2.15和4.2.3.1都介绍了Retransmission Timeout的处理(说来惭愧,这是第一次阅读TCP相关RFC)。

在RFC中搜索Retransmission发现RFC 793 1122 2988 6298都有对重传算法、和初次重传超时的描述。于是开始阅读这个四个RFC,耗时约2小时,了解了大致的重传超时算法。

3. RFC中如何计算RTO(Retransmission Timeout)
3.1 RFC-793如何计算RTO

概述:先根据该socket的RTT计算出SRTT(Smoothed Round Trip Time),然后根据一个最大、最小超时时间确定当前RTO。说明:srtt可以理解为“平滑化”的RTT,即在保持计算简单的情况尽量考虑历史RTT。

详细计算:SRTT = ( ALPHA * SRTT ) + ((1-ALPHA) * RTT)

基于SRTT,我们再来计算RTO:RTO = min[UBOUND,max[LBOUND,(BETA*SRTT)]]

UBOUND是RTO上线,ALPHA是平滑因子(smoothing factor, e.g., .8 to .9),BETA是一个延迟方差因子(BETA is a delay variance factor (e.g., 1.3 to 2.0))。

仔细看这两个公式大概就能理解了RTO的计算了。

这里对上面两个公式做一个简单的注释:公式1中计算SRTT,ALPHA越接近于0,则表示SRTT越相信这一次的RTT;越接近于1,则表示SRTT越相信上次统计的RTT。公式二给RTO分别设置了一个上限和下限。

3.2 RTO重传间隔是指数增加的

上面我们介绍的是初次重传时的RTO,如果重传后还没收到另一端的响应,下一次重传RTO则会指数增加,例如第一次重传RTO是1,之后分别2,4,8,16...。

3.3 RFC-2988和RFC-6298中的RTO计算

在RFC-2988和RFC-6298中又重新改进了RTO的计算方法,Linux中的实现即使参考RFC-2988。算法核心公式:

初始:SRTT <- RRTTVAR <- R/2RTO <- SRTT + max (G, K*RTTVAR)where K = 4.根据RTT计算SRTT:RTTVAR <- (1 - beta) * RTTVAR + beta * |SRTT - R'|SRTT <- (1 - alpha) * SRTT + alpha * R' 最后RTO:RTO <- SRTT + max (G, K*RTTVAR)
4. Linux中的RTO(Retransmission Timeout)

这里说的是RHEL5.4的2.6.18内核,RFC-2988实现参考net/ipv4/tcp_input.c中的tcp_rtt_estimator和tcp_set_rto。可以看到,在Linux中alpha=1/8,RTO最小为TCP_RTO_MIN。因为我们的系统中RTT总是很小,所以RTO取值总是能够取到TCP_RTO_MIN。

在看看TCP_RTO_MIN在Linux中的定义:

123#define TCP_RTO_MAX ((unsigned)(120*HZ))124#define TCP_RTO_MIN ((unsigned)(HZ/5))

(这里简单的介绍介绍一下HZ,HZ可以理解为1s,所以120*HZ就是120秒,HZ/5就是200ms。详细的:HZ表示CPU一秒种发出多少次时间中断--IRQ-0,Linux中通常用HZ来做时间片的计算,参考)

5. 其他:Linux中可配置重传参数

/proc/sys/net/ipv4/tcp_retries1 (integer; default: 3)

TCP尝试了3次(tcp_retries1默认3)重传后,还没有收到ACK的话,则后续每次重传都需要network layer先更新路由。

/proc/sys/net/ipv4/tcp_retries2 (integer; default: 15)

TCP默认最多做15次重传。根据RTO(retransmission timeout)不同,最后一次重传间隔大概是13到30分钟左右。如果15次重传都做完了,TCP/IP就会告诉应用层说:“搞不定了,包怎么都传不过去!”

6. 最后

回答前面的问题:即使RTT很小(0.8ms),但是因为RTO有下限,最小必须是200ms,所以这是RTT再小也白搭;RTO最小值是内核编译是决定的,socket程序中无法修改,Linux TCP也没有任何参数可以改变这个值。

参考文献

1. RFC 1122 ... (在哪儿查找RFC) TCP协议相关的RFC:
RFC 675 - Specification of Internet Transmission Control Program, December 1974 Version
RFC 793 - TCP v4
RFC 1122 - includes some error corrections for TCP
RFC 1323 - TCP-Extensions
RFC 1379 - Extending TCP for Transactions—Concepts
RFC 1948 - Defending Against Sequence Number Attacks
RFC 2018 - TCP Selective Acknowledgment Options
RFC 2988 - Computing TCP's Retransmission Timer
RFC 4614 - A Roadmap for TCP Specification Documents
RFC 5681 - TCP Congestion Control

TCP/IP重传超时--RTO - SRTT (Smoothed Round Trip Time)相关推荐

  1. 在深谈TCP/IP三步握手四步挥手原理及衍生问题—长文解剖IP

    如果对网络工程基础不牢,建议通读<细说OSI七层协议模型及OSI参考模型中的数据封装过程?> 下面就是TCP/IP(Transmission Control Protoco/Interne ...

  2. 再深谈TCP/IP三步握手四步挥手原理及衍生问题—长文解剖IP

    转载地址: https://www.zhoulujun.cn/html/theory/ComputerScienceTechnology/network/2015_0708_65.html 如果对网络 ...

  3. 面试TCP/IP被虐了?

    作者:NingG1 链接:http://ningg.top/nginx-series-principle/ 先亮出这篇文章的思维导图 TCP 作为传输层的协议,是一个软件工程师素养的体现,也是面试中经 ...

  4. TCP/IP研究(2)-TCB

    TCB结构中各变量统计   Date Author Description 2006-11-20 Kevin First Draft TCB结构取自kernel 2.6.16.27, RX       ...

  5. TCP/IP详解:TCP——超时和重传

    1.TCP一般拥有两套独立机制来完成重传,一是基于时间,即超时重传,而是基于确认信息的构成,即快速重传. 2.RTT(Round Trip Time) 往返时延,数据包从发出到收到对应ACK的时间,每 ...

  6. 《TCP/IP详解 卷2》 笔记:TCP的输入函数:tcp_input

    TCP输入处理是系统中最长的一部分代码,tcp_input函数约有1100行代码(预警!).它完全遵循RFC793中定义的输入事件处理步骤,这些步骤详细定义了如何根据连接的当前状态,处理不同的输入报文 ...

  7. 面试热点|理解TCP/IP传输层拥塞控制算法

    来自:后端技术指南针 0x00.前言 这是TCP/IP协议栈系列的第二篇文章,之前的一篇理解TCP/IP协议栈之HTTP2.0感兴趣可以看下,今天一起来学习下一个热点问题. 通过本文你将了解到以下内容 ...

  8. 万字长文 | 全(小区局域)网最强 TCP/IP 拥塞控制总结

    来源 | 后端技术指南针 头图 | CSDN付费下载自视觉中国 先唠唠嗑 在正式开始文章技术点之前,想先聊一下我对面试中的TCP/IP问题的一些拙见,希望对盆友们有所帮助. 在招聘岗位描述中,几乎必然 ...

  9. TCP/IP协议栈:TCP超时重传机制

    目录 基础概念 重传超时时间RTO RTO的设定 连接往返时间RTT RTT的计算 Karn算法 往返时间测量 重传 拥塞避免算法 快速重传和快速恢复算法 重新分组 网络数据包丢失,重传和重复确认 是 ...

  10. lwip路由实现_TCP超时与重传《LwIP协议栈源码详解——TCP/IP协议的实现》

    在TCP两端交互过程中,数据和确认都有可能丢失.TCP通过在发送时设置一个定时器来解决这种问题.如果当定时器溢出时还没有收到确认,它就重传该数据.对任何TCP协议实现而言,怎样决定超时间隔和如何确定重 ...

最新文章

  1. mysql nextval同步锁_mysql中实现类似oracle中的nextval函数
  2. 计算机模型机设计实验报告,基本模型机设计与实现 实验报告
  3. 漫画 | 你真的会用烙铁焊接吗?
  4. .net 笔记尝试(二)
  5. php quick,Gitee 极速下载
  6. 11月23日python笔记(python基础2.6-3.0)
  7. 第二周函数-的基本格式:
  8. 【STM32F429】第6章 ThreadX操作系统移植(IAR)
  9. web测试的基本测试点
  10. java利用复循环洗牌算法_实现不重复取数两种算法(洗牌算法)
  11. WordPress插件教程-WPS Limit Login限制登录次数
  12. 个人经历:谈一谈的程序员求职途径
  13. 多边形(polygon)
  14. 硬件知识:台式电脑主机各种接口介绍
  15. 吴恩达机器学习——反向传播算法
  16. Unity UI框架的搭建
  17. linux使用Quota配额之须配额目录为非独立文件系统并无可分配分区解决办法
  18. python--dict容器
  19. 华三防火墙添加web用户_H3C F1000-C-G防火墙开web功能
  20. H2/H∞半车悬架控制仿真分析

热门文章

  1. uboot - 配置过程1(分析国产君正的ingenic-linux-kernel3.10.14-x1000-v8.2-20181116\u-boot\mkconfig脚本)
  2. MySql根据字段名查询重复记录并删除!只保留一条
  3. 什么是bug(软件缺陷)
  4. php5.6安装php-gd,centos73下php5.6安装GD库
  5. python树莓派_树莓派python
  6. 关闭Cadence Orcad Capture CIS原理图弹出startpage页面的方法
  7. mybatis PageHelper.startPage出现limit错误
  8. 「经济读物」第一本经济书 罗伯特.墨菲
  9. 罗马音平假字复制_急求Bigbang的日文版bangbangbang的罗马音啊!有日文平假歌词我现在复制下...
  10. ieee期刊的科技写作思路曹文平_如何写好一篇高质量的IEEE/ACM Transaction级别的计算机科学论文?...