Tcp Syn重试
RTO (retransmission timeout)
Tcp three-way handshake(三次握手),当client发出 syn 包, 在RTO时间内, server端没有回应 ack+syn, client端会触发重试. 关于重试的实现,不同的OS有不同的标准.
关于RTO, 有两个RFC标准
- 1989, http://www.rfcreader.com/#rfc1122
-
2011, http://www.rfcreader.com/#rfc6298
- RFC1122中, RTO = 3s
-
RFC6298中, RRO = 1s
- win10之前, RTO=3s, MaxSynRetransmissions=2, tcp 创建连接超时 21s。
-
win10开始, RTO=1s, MaxSynRetransmissions=4, tcp 创建连接超时 21s(按rfc6298指数退避算法标准,应该是31s,但是windows特殊兼容了 retry=4, 仍然是21s)
- linux, RTO=1s, MaxSynRetransmissions = 6, tcp 创建连接超时 127s
cat /proc/sys/net/ipv4/tcp_syn_retries
retry 次数 和实际超时时间
1,2 = 3
2,4 = 7
3,8 = 15
4,16 = 31 (windows 10 default, 实际效果是21s; 测试windows只在n=4时不符合算法,其他都符合)
5,32 = 63
6,64 = 127 (linux default)
7,128 = 255
8,256 = 511
windows 默认配置
修改配置: netsh interface tcp set global MaxSynRetransmissions=3
// winServer 2112R2
C:\Users\Administrator>netsh interface tcp show global
查询活动状态...
TCP 全局参数
----------------------------------------------
初始 RTO : 3000
最大 SYN 重新传输次数 : 2
// win10
PS D:\Users\admin> netsh interface tcp show global
查询活动状态...
TCP 全局参数
----------------------------------------------
初始 RTO : 1000
最大 SYN 重新传输次数 : 4
windows 发布时间
- winxp, 2001.10.25
- win7, 2009.10.22
- win8, 2012.10.25; win8.1 and winServer2012R2, 2013.10.18
- win10, 2015.7.29
抓包分析
linux
shell 1> date && telnet 192.168.1.254 88 || date
shell 2> tcpdump -i any port 88
windows
- Network Monitor //微软写的网络抓包工具, 最好用
- RawCap.exe //依赖dotnet, 抓包后,保存成pcap格式, 然后用wireShark分析
cmd /v:on /c "echo !TIME! & telnet 192.168.1.254 88 & echo !TIME!"
linux 重试 6次, 超时130s
win7 重试2次,超时21s
相关文章链接
- TCPView, UI, 查看网络链接
- psping.exe -n 10 10.32.118.18:63657 , 支持TCP ping
- TCP wikipedia
- linux 默认打开 tcp timestamp
- windows 默认关闭 tcp timestamp
- windows 网络问题调试
- win7发布时关闭了调整tcp重传次数的配置,后边通过hotfix修复