前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >SYN和RTO

SYN和RTO

作者头像
LA0WAN9
发布于 2021-12-14 00:47:19
发布于 2021-12-14 00:47:19
84700
代码可运行
举报
文章被收录于专栏:火丁笔记火丁笔记
运行总次数:0
代码可运行

前两天,我在微博上推荐了一篇朝花夕拾的文章:The story of one latency spike,文章中介绍了 cloudflare 工程师如何一步一步 debug 网络延迟问题,细细读来受益良多,不过我并不打算详细介绍那篇文章的细枝末节, 本文只摘录一个点:

When debugging network problems the delays of 1s, 30s are very characteristic. They may indicate packet loss since the SYN packets are usually retransmitted at times 1s, 3s, 7s, 15, 31s.

为什么是 1 秒、3 秒、7 秒、15 秒、31 秒?说来惭愧,我以前从没有注意过 SYN 重建时的时间特征,知耻而后勇,正好借此机会来一探究竟。

下面让我们通过一个实验来重现一下 SYN 超时重传的现象:

  1. 在服务端屏蔽请求:「iptables -A INPUT –dport 1234 –syn -j DROP」
  2. 在服务端监听 1234 端口:「nc -l 1234」
  3. 在客户端开启抓包:「tcpdump -nn -i any port 1234」
  4. 在客户端发起请求:「date; nc <SERVER> 1234; date」

经过一段时间的等待后,我们可以看到 tcpdump 输出如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
12:53:15.511826 IP CLIENT.53384 > SERVER.1234: Flags [S], ...
12:53:16.511042 IP CLIENT.53384 > SERVER.1234: Flags [S], ...
12:53:18.511058 IP CLIENT.53384 > SERVER.1234: Flags [S], ...
12:53:22.511042 IP CLIENT.53384 > SERVER.1234: Flags [S], ...
12:53:30.511065 IP CLIENT.53384 > SERVER.1234: Flags [S], ...
12:53:46.511068 IP CLIENT.53384 > SERVER.1234: Flags [S], ...

第一行是正常发出的 SYN,后面五行是超时重传发出的 SYN,相对于正常发出的 SYN,它们的延迟分别是:1 秒、3 秒、7 秒、15 秒、31 秒,正好符合开头的描述。之所以重传五次是因为 net.ipv4.tcp_syn_retries 的缺省值是 5。

此外,我们可以看到两次 date 命令输出的时间如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Sun Aug 13 12:53:15 CST 2017
Sun Aug 13 12:54:18 CST 2017

可见整个握手过程从开始到超时一共持续了 63 秒,其中 31 秒是总计五次 SYN 发送的时间,剩下的 32 秒是确认第五次 SYN 超时的时间(2 的 5 次方)。由此可见,在握手阶段一旦出现严重丢包,网络延迟会非常久,很多时候这是没有必要的,比如 Web 服务器,可以考虑设置 net.ipv4.tcp_syn_retries 为 2 或者 3 比较合适,一旦出现严重丢包,与其不断重传,不如及时放弃。

如果要研究得更深入些,我们还需要了解 RTO(retransmission timeout),即超时重传时间,具体计算方法很复杂,我就不多说了,有兴趣的可以参考本文解决的推荐链接,你只要知道系统会根据网络连接的情况动态调整该值的大小即可。不过在 SYN 握手阶段,网络连接还没有建立起来,如果此时发生丢包,那么因为系统没有可以参照的 RTT(Round-Trip Time),所以此时只能给出系统缺省设置的 RTO:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#define TCP_RTO_MAX	((unsigned)(120*HZ))
#define TCP_RTO_MIN	((unsigned)(HZ/5))
#define TCP_TIMEOUT_INIT ((unsigned)(1*HZ))

...

unsigned long timeo;

if (req->num_timeout++ == 0)
    atomic_dec(&queue->young);
timeo = min(TCP_TIMEOUT_INIT << req->num_timeout, TCP_RTO_MAX);
mod_timer(&req->rsk_timer, jiffies + timeo);
return;

可见 RTO 的最大值是 120 秒,最小值是 200 毫秒,在连接建立前的初始值是 1 秒,如果经过多次重传,每次 RTO 的值翻倍,但最大不得超过 120 秒:

  1. 第 1 次重传:超时时间是 2 的 0 次方,也就是 1 秒。 延迟:1 秒
  2. 第 2 次重传:超时时间是 2 的 1 次方,也就是 2 秒。 延迟:1 + 2 = 3 秒
  3. 第 3 次重传:超时时间是 2 的 2 次方,也就是 4 秒。 延迟:1+ 2 + 4 = 7 秒
  4. 第 4 次重传:超时时间是 2 的 3 次方,也就是 8 秒。 延迟:1 + 2 + 4 + 8 = 15 秒
  5. 第 5 次重传:超时时间是 2 的 4 次方,也就是 16 秒。 延迟:1 + 2 + 4 + 8 + 16 = 31 秒

说点题外话,很多人在应用层实现失败重试逻辑的时候,往往是单纯的循环重试,这样过于生硬,重试的成功率往往也不高,可以考虑一下 TCP 的翻翻算法。

还有一点需要说明的是,在建立连接后,因为目前网络都很快,所以大部分连接的 RTO 都会接近 TCP_RTO_MIN,也就是 200ms,可以通过「ss -int」命令来确认。关于超时重传还有很多细节需要考虑,下面列出一些资料:

本文相当于快餐,建议仔细阅读如上正餐。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2017-08-13,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
从linux源码看socket(tcp)的timeout
网络编程中超时时间是一个重要但又容易被忽略的问题,对其的设置需要仔细斟酌。在经历了数次物理机宕机之后,笔者详细的考察了在网络编程(tcp)中的各种超时设置,于是就有了本篇博文。本文大部分讨论的是socket设置为block的情况,即setNonblock(false),仅在最后提及了nonblock socket(本文基于linux 2.6.32-431内核)。
无毁的湖光-Al
2020/01/15
4.9K0
从linux源码看socket(tcp)的timeout
深入解析常见三次握手异常
在后端接口性能指标中一类重要的指标就是接口耗时。具体包括平均响应时间 TP90、TP99 耗时值等。这些值越低越好,一般来说是几毫秒,或者是几十毫秒。如果响应时间一旦过长,比如超过了 1 秒,在用户侧就能感觉到非常明显的卡顿。如果长此以往,用户可能就直接用脚投票,卸载我们的 App 了。
开发内功修炼
2022/03/24
1.1K0
深入解析常见三次握手异常
解Bug之路-记一次对端机器宕机后的tcp行为
机器一般过质保之后,就会因为各种各样的问题而宕机。而这一次的宕机,让笔者观察到了平常观察不到的tcp在对端宕机情况下的行为。经过详细跟踪分析原因之后,发现可以通过调整内核tcp参数来减少宕机造成的影响。
无毁的湖光-Al
2018/09/28
2.7K0
解Bug之路-记一次对端机器宕机后的tcp行为
深入分析网络编程中踩过的坑
网络编程中经常会遇到一些异常的情况,定位问题需要了解协议栈的实现,以下是工作中遇到的一些常见问题的深入分析和解决思路。 问题1:server端业务进程响应心跳超时被监控进程kill,导致数据或者逻辑异常 我们的后台框架采用的是proxy,worker模型,proxy处理连接和会话,worker处理业务,proxy和worker之间通过共享内存队列进行通信,并有监控进程扫描proxy和worker的运行情况。管理进程会定时向worker发起心跳查询,防止业务进程挂起。业务worker的心跳默认是60s,如
QQ音乐技术团队
2018/01/30
2.3K0
深入分析网络编程中踩过的坑
Linux 内核参数
对于TCP的初始接收窗口大小,linux和centos的实现是不一样的,如linux内核3.10版本的初始接收窗口定义为10mss,但centos 3.10内核中的初始窗口大小定义为TCP_INIT_CWND * 2,即20*MSS大小。(看着linux源码在centos7.4系统上测试,纠结了好久。。)
charlieroro
2020/03/23
8.5K0
处理网络超时问题的最佳实践
对于云上的用户来说,业务日志里面报超时问题处理起来往往比价棘手,因为1) 问题点可能在云基础设施层,也有可能在业务软件层,需要排查的范围非常广;2) 这类问题往往是不可复现问题,抓到现场比较难。在本文里就分析下如何来分辨和排查这类问题的根本原因。
JavaQ
2019/05/17
3.1K0
字节一面:服务端挂了,客户端的 TCP 连接还在吗?
收到一位读者的私信,说字节面试有这么一个问题:服务端挂了,客户端的 TCP 连接会发生什么?
小林coding
2022/10/27
1.6K0
字节一面:服务端挂了,客户端的 TCP 连接还在吗?
TCP 的那些事儿
TCP是一个巨复杂的协议,因为他要解决很多问题,而这些问题又带出了很多子问题和阴暗面。所以学习TCP本身是个比较痛苦的过程,但对于学习的过程却能让人有很多收获。关于TCP这个协议的细节,我还是推荐你去看W.Richard Stevens的《TCP/IP 详解 卷1:协议》(当然,你也可以去读一下RFC793以及后面N多的RFC)。另外,本文我会使用英文术语,这样方便你通过这些英文关键词来查找相关的技术文档。 之所以想写这篇文章,目的有三个, 一个是想锻炼一下自己是否可以用简单的篇幅把这么复杂的TCP协议描清
用户1263954
2018/01/30
1.5K0
TCP 的那些事儿
浅析TCP协议中的疑难杂症
前言 说到TCP协议,相信大家都比较熟悉了,对于TCP协议总能说个一二三来,但是TCP协议又是一个非常复杂的协议,其中有不少细节点让人头疼点。本文就是来说说这些头疼点的,浅谈一些TCP的疑难杂症。那么从哪说起呢?当然是从三次握手和四次挥手说起啦,可能大家都知道TCP是三次交互完成连接的建立,四次交互来断开一个连接,那为什么是三次握手和四次挥手呢?反过来不行吗? 疑症 1 :TCP 的三次握手、四次挥手 下面两图大家再熟悉不过了,TCP的三次握手和四次挥手见下面左边的”TCP建立连接”、”TCP数据传送
用户1263954
2018/06/22
1.7K0
TCP:“哥哥(giegie)你真的懂TCP吗?”
面向大厂jd(职位描述)学习一直是阿巩秉承的原则,技术岗位的jd通常有要求"熟悉TCP/IP等网络协议"这样的字样。我们普遍对TCP的了解是“TCP是一种面向连接的、可靠的、基于字节流的传输层通信协议”。那么连接是如何创建的呢?是什么支持了TCP的可靠性呢?两主机性能差很多时,TCP又是如何做流量控制的呢?TCP做拥塞控制有哪些方式呢?等等问题需要我们去探索,事不宜迟,日拱一卒,让我们开始吧!
才浅Coding攻略
2022/12/12
3900
TCP:“哥哥(giegie)你真的懂TCP吗?”
Linux tcp/ip 源码分析 - connect
由第一篇文章可以知道,sock->ops->connect指向的方法为inet_stream_connect。
KINGYT
2019/05/30
2.1K0
tcp_tw_recycle和tcp_timestamps导致connect失败问题
转载自: http://blog.sina.com.cn/s/blog_781b0c850100znjd.html
shirishiyue
2021/08/08
1.7K0
干货!云网络丢包故障定位全景指南
本期分享一个比较常见的⽹络问题--丢包。例如我们去ping⼀个⽹站,如果能ping通,且⽹站返回信息全⾯,则说明与⽹站服务器的通信是畅通的,如果ping不通,或者⽹站返回的信息不全等,则很可能是数据被丢包了,类似情况想必⼤家都不陌⽣。针对⽹络丢包,本⽂提供⼀些常见的丢包故障定位⽅法,希望能够帮助⼤家对⽹络丢包有更多的认识,遇到丢包莫要慌,且跟着⼀起来涨姿(知)势(识)···
网络工程师笔记
2021/05/17
5.9K0
干货!云网络丢包故障定位全景指南
从 TCP 三次握手说起:浅析TCP协议中的疑难杂症 ( 2 )
本文主要介绍了在Linux系统中,如何通过配置TCP参数来优化网络性能。主要包括了TCP的四次挥手释放连接、TCP的慢启动和快速恢复、TCP的保活机制以及TCP的延迟应答机制等方面的内容。通过这些优化措施,可以大大提高Linux网络性能,减少网络拥堵和丢包现象,提高整体的网络吞吐量和连接的稳定性。
小时光
2016/09/28
4.1K0
从 TCP 三次握手说起:浅析TCP协议中的疑难杂症 ( 2 )
能将三次握手理解到这个深度,面试官拍案叫绝!
在后端相关岗位的入职面试中,三次握手的出场频率非常的高,甚至说它是必考题也不为过。一般的答案都是说客户端如何发起 SYN 握手进入 SYN_SENT 状态,服务器响应 SYN 并回复 SYNACK,然后进入 SYN_RECV,...... , 吧啦吧啦诸如此类。
开发内功修炼
2022/03/24
4710
能将三次握手理解到这个深度,面试官拍案叫绝!
网络显形计(实战TCP三次握手)
上述表述的信息还是比较少的,我们在linux服务器上抓取的包一般会保存为pcap文件,然后导出到本地利用WireShark工具进行分析。
shysh95
2021/12/21
7550
网络显形计(实战TCP三次握手)
万字长文 | 23 个问题 TCP 疑难杂症全解析
这篇文章我想由浅到深地过一遍 TCP,不是生硬的搬出各个知识点,从问题入手,然后从发展、演进的角度来看 TCP。
敖丙
2020/09/14
8750
万字长文 | 23 个问题 TCP 疑难杂症全解析
有赞TCP网络编程最佳实践
本文是根据有赞中间件团队多年的TCP网络编程实践经验总结而来,目的是为了避免应用因各种网络异常而出现各种非预期行为,从而造成非预期的影响,影响系统稳定性与可靠性。
用户1278550
2021/06/16
9580
有赞TCP网络编程最佳实践
【图文讲解】TCP为啥要3次握手和4次挥手?握两次手不行吗?
客户端向服务器发出连接请求报文,这时报文首部中的同部位SYN=1,同时随机生成初始序列号 seq=x
ConardLi
2019/12/02
1.6K0
实战!我用“大白鲨”让你看见 TCP
为了让大家更容易「看得见」 TCP,我搭建不少测试环境,并且数据包抓很多次,花费了不少时间,才抓到比较容易分析的数据包。
小林coding
2020/05/26
1.7K0
相关推荐
从linux源码看socket(tcp)的timeout
更多 >
领券
社区富文本编辑器全新改版!诚邀体验~
全新交互,全新视觉,新增快捷键、悬浮工具栏、高亮块等功能并同时优化现有功能,全面提升创作效率和体验
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文