TCP/IP重传超时--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 <- R
RTTVAR <- R/2
RTO <- 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也没有任何参数可以改变这个值。

好了,不容易。

时间: 2024-10-30 20:22:27

TCP/IP重传超时--RTO的相关文章

libjingle源码解析(6)-【PseudoTcp】建立UDP之上的TCP(4):超时与重传

超时与重传       TCP是面向连接的可靠的运输层.当数据丢失时,TCP需要重传包.TCP通过设置定时器解决这种问题.     对每个连接,TCP有4个不同的定时器:         1)重传定时器:用于当希望收到另一端的确认,而没有收到时.         2)坚持定时器:使窗口大小信息保持不断流动.         3)保活定时器:可检测空闲连接另一端何时崩溃或重启.         4)2MSL定时器:测量TIME_WAIT状态的时间.       PTCP本身是没有提供定时器的,而通

TCP/IP学习笔记(7)

一.SNMP:简单网络管理协议 基于TCP/IP的网络管理包括两部分:网络管理站(manager)和被管理的网络单元(被管设备).这些被管设备的共同点就是都运行TCP/IP协议.管理进程和代理进程之间的通信有两种方式,一种是管理进程向代理进程发出请求,询问参数值,另一种方式是代理进程主动向管理进程报告某些重要的事件. 基于TCP/IP的网络管理包含3个组成部分: (1)一个管理信息库(MIB).管理信息库包含所有代理进程的所有可被查询和修改的参数. (2)关于MIB的公用结构和表示符号,叫做管理

如何强化TCP/IP 堆栈安全教程

目标 使用本模块可以实现: • 强化服务器的 TCP/IP 堆栈安全 • 保护服务器免遭"拒绝服务"和其他基于网络的攻击 • 在检测到攻击时启用 SYN 洪水攻击保护 • 设置用于确认是什么构成攻击的阈值 适用范围 本模块适用于下列产品和技术: • Microsoft Windows 2000 Server 和 Windows 2000 Advanced Server 如何使用本模块 默认情况下,本模块中的一些注册表项和值可能不存在.在这些情况下,请创建这些注册表项.值和数值数据. 注

深入浅出--iOS的TCP/IP协议族剖析&amp;amp;&amp;amp;Socket

简介 该篇文章主要回顾--TCP/IP协议族中的TCP/UDP.HTTP:还有Socket.(--该文很干,酝酿了许久!你能耐心看完吗?) 我在这个文章中,列举了常见的TCP/IP族中的协议,今天主角是--传输层协议. 传输层(Transport Layer)是OSI(七层模型)中最重要.最关键的一层,它负责总体的数据传输和数据控制的一层,传输层提供端到端(应用会在网卡注册一个端口号)的交换数据的机制,检查分组编号与次序.传输层对其上三层如会话层等,提供可靠的传输服务,对网络层提供可靠的目的地站

计算机网络-nagle算法疑问 tcp/ip nagle 网络

问题描述 nagle算法疑问 tcp/ip nagle 网络 最近在学习tcp/ip,在拥塞控制部分出现了nagle算法,网上看了一些资料http://b.baidu.com/view/2468335.htm Nagle算法的基本定义是任意时刻,最多只能有一个未被确认的小段. 所谓"小段",指的是小于MSS尺寸的数据块,所谓"未被确认",是指一个数据块发送出去后,没有收到对方发送的ACK确认该数据已收到. Nagle算法的规则(可参考tcp_output.c文件里t

tcp/ip重温记录

这几天重温了下tcp/ip,做一下记录,有不正确或者有遗漏的地方,请大家指正哈   一.网络层 1. ip协议 1.1 ip协议头中的TTL字段 TTL字段有8位.每经过一个路由器,TTL就会减一,当TTL为0时,数据包还没有到达目的ip的话,这个数据包就会被丢弃.从这可以看出,ip协议不提供可靠性保障. 1.2 ip路由选择 ip的路由选择可以看成是从路由表进行匹配的过程, · 从路由表中进行匹配,当路由表中有目的ip的话,直接发送数据包到目的ip · 如果没有目的ip的话,如果有与目的ip处

TCP/IP滑动窗口

T C P使用一种窗口(w i n d o w)机制来控制数据流.当一个连接建立时,连接的每一端分配一个缓冲区来保存输入的数据,并将缓冲区的尺寸发送给另一端.当数据到达时,接收方发送确认,其中包含了自己剩余的缓冲区尺寸.剩余的缓冲区空间的大小被称为窗口( w i n d o w) ,指出窗口大小的通知称为窗口通告(window advertisement) .接收方在发送的每一确认中都含有一个窗口通告.   如果接收方应用程序读数据的速度能够与数据到达的速度一样快,接收方将在每一确认中发送一个正

《Linux高性能服务器编程》——第1章 TCP/IP协议族 1.1 TCP/IP协议族体系结构以及主要协议

第1章 TCP/IP协议族 现在Internet(因特网)使用的主流协议族是TCP/IP协议族,它是一个分层.多协议的通信体系.本章简要讨论TCP/IP协议族各层包含的主要协议,以及它们之间是如何协作完成网络通信的. TCP/IP协议族包含众多协议,我们无法一一讨论.本书将在后续章节详细讨论IP协议和TCP协议,因为它们对编写网络应用程序具有最直接的影响.本章则简单介绍其中几个相关协议:ICMP协议.ARP协议和DNS协议,学习它们对于理解网络通信很有帮助.读者如果想要系统地学习网络协议,那么R

《CCNP ROUTE 300-101学习指南》——1.4节路由和TCP/IP操作

1.4 路由和TCP/IP操作 路由协议是TCP/IP协议栈的一部分,主要工作在第3层.网络通信需要借助大量协议来处理广泛的任务,以实现设备之间的通信. 1.4.1 MSS.分段和PMTUD IP协议的设计初衷是应用于广泛的传输介质.IPv4数据包的最大长度为65535字节.带有逐跳扩展头部和巨型帧负载选项的IPv6数据包最长可以支持4294967295字节.但多数传输链路都会强制使用一个比较小的最大数据包长度,这个长度称为最大传输单元(Maximum Transmission Unit,MTU