RTO (retransmission timeout)

Tcp three-way handshake(三次握手),当client发出 syn 包, 在RTO时间内, server端没有回应 ack+syn, client端会触发重试. 关于重试的实现,不同的OS有不同的标准.

关于RTO, 有两个RFC标准

  1. 1989, http://www.rfcreader.com/#rfc1122
  2. 2011, http://www.rfcreader.com/#rfc6298

  3. RFC1122中, RTO = 3s
  4. RFC6298中, RRO = 1s

  5. win10之前, RTO=3s, MaxSynRetransmissions=2, tcp 创建连接超时 21s
  6. win10开始, RTO=1s, MaxSynRetransmissions=4, tcp 创建连接超时 21s(按rfc6298指数退避算法标准,应该是31s,但是windows特殊兼容了 retry=4, 仍然是21s)

  7. linux, RTO=1s, MaxSynRetransmissions = 6, tcp 创建连接超时 127s
  8. 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 发布时间

  1. winxp, 2001.10.25
  2. win7, 2009.10.22
  3. win8, 2012.10.25; win8.1 and winServer2012R2, 2013.10.18
  4. win10, 2015.7.29

抓包分析

linux

shell 1> date && telnet 192.168.1.254 88 || date
shell 2> tcpdump -i any port 88

windows

  1. Network Monitor //微软写的网络抓包工具, 最好用
  2. RawCap.exe //依赖dotnet, 抓包后,保存成pcap格式, 然后用wireShark分析
  3. cmd /v:on /c "echo !TIME! & telnet 192.168.1.254 88 & echo !TIME!"

linux 重试 6次, 超时130s linux-retry-6-times

win7 重试2次,超时21s win7-retry-2-times

相关文章链接

  1. TCPView, UI, 查看网络链接
  2. psping.exe -n 10 10.32.118.18:63657 , 支持TCP ping
  3. TCP wikipedia
    • linux 默认打开 tcp timestamp
    • windows 默认关闭 tcp timestamp
  4. windows 网络问题调试
  5. win7发布时关闭了调整tcp重传次数的配置,后边通过hotfix修复