最近出现了网络超时的问题要排查,大致按照如图思路去排查
1.排除代码逻辑问题,TCP相关可能的BUG,内核参数等问题;
2.排查KVM问题时,在同一个宿主机的不同KVM上,复现了超时问题。
发现大部分异常连接时长都在1s左右,通过抓包分析,可以看到这部分的包被重传了,重传的时间固定为1秒。
这里重传时间为什么是1秒呢,相关的标准和实际实现是怎样的呢?
本文主要讨论的就是这部分内容(基于centos的2.6.32-358)
RFC标准
超时重传时间(RTO)是由当前网络状况(RTT),然后根据一个算法来决定。这部分相关内容《TCP/IP详解卷1》中有提到,但是已经过时了。
去RFC查了下,重传超时相关最新的是RFC6298,他更新了RFC1122并且废弃了RFC2988
稍微介绍一下其中内容,有兴趣的可以点进去看
1 重申了RTO的基本计算方法:
首先有个通过时钟得到的时间参数RTO_MIN
初始化:
第一次计算:
以后的计算:
RTO的最小值建议是1秒,最大值必须大于60秒
2 对于同一个包的多次重传,必须使用Karn算法,也就是刚才看到的双倍增长
另外RTT采样不能使用重传的包,除非开启了timestamps参数(利用该参数可以准确计算出RTT)
3 当4*RTTVAR趋向于0时,得到的值必须向RTO_MIN时间靠近
经验上时钟越准确越好,最好误差在100ms内
4 RTO计时器的管理
(1)发送数据(包括重传时),检查计时器是否启动,若没有则启动。当收到该数据的ACK时删除计时器
(2)使用RTO = RTO * 2的方式进行退避
(3)新的FALLBACK特性:当计时器在等待SYN报文时过期,且当前TCP实现使用了小于3秒的RTO,那么该连接对的RTO必须被重设为3秒,重设的RTO将用在正式数据的传输上(就是三次握手结束以后)
对linux的实际实现进行抓包分析
三次握手的syn包发送
1
2
3
4
5
6
|
01:00:00.129688 IP 172.16.3.14.1868 > 172.16.10.40.80: Flags [S], seq 3774079837, win 14600, options [mss 1460,nop,nop,sackOK,nop,wscale 7], length 0
01:00:01.129065 IP 172.16.3.14.1868 > 172.16.10.40.80: Flags [S], seq 3774079837, win 14600, options [mss 1460,nop,nop,sackOK,nop,wscale 7], length 0
01:00:03.129063 IP 172.16.3.14.1868 > 172.16.10.40.80: Flags [S], seq 3774079837, win 14600, options [mss 1460,nop,nop,sackOK,nop,wscale 7], length 0
01:00:07.129074 IP 172.16.3.14.1868 > 172.16.10.40.80: Flags [S], seq 3774079837, win 14600, options [mss 1460,nop,nop,sackOK,nop,wscale 7], length 0
01:00:15.129072 IP 172.16.3.14.1868 > 172.16.10.40.80: Flags [S], seq 3774079837, win 14600, options [mss 1460,nop,nop,sackOK,nop,wscale 7], length 0
01:00:31.129128 IP 172.16.3.14.1868 > 172.16.10.40.80: Flags [S], seq 3774079837, win 14600, options [mss 1460,nop,nop,sackOK,nop,wscale 7], length 0
|
从1秒起双倍递增
值得注意是实质上第五次超时以后等到第六次,才会通知上层连接超时,那一共是63秒
三次握手的syncak包发送
1
2
3
4
5
6
7
|
01:17:20.084839 IP 172.16.3.15.2535 > 172.16.3.14.80: Flags [S], seq 1297135388, win 14600, options [mss 1460,nop,nop,sackOK,nop,wscale 7], length 0
01:17:20.084908 IP 172.16.3.14.80 > 172.16.3.15.2535: Flags [S.], seq 1194120443, ack 1297135389, win 14600, options [mss 1460,nop,nop,sackOK,nop,wscale 7], length 0
01:17:21.284093 IP 172.16.3.14.80 > 172.16.3.15.2535: Flags [S.], seq 1194120443, ack 1297135389, win 14600, options [mss 1460,nop,nop,sackOK,nop,wscale 7], length 0
|