TCP通讯重试机制
1、Linux下重试机制
Linux下重试机制由net.ipv4.tcp_syn_retries配置确定,net.ipv4.tcp_syn_retries 的设置,表示客户端进行connect()服务端时,在对方不返回SYN + ACK的情况下(也就是超时的情况下),第一次发送之后,内核最多重试几次发送SYN包。
例如net.ipv4.tcp_syn_retries=5
第 1 次发送 SYN 报文后等待 1s(2 的 0 次幂),如果超时,则重试;
第 2 次发送后等待 2s(2 的 1 次幂),如果超时,则重试;
第 3 次发送后等待 4s(2 的 2 次幂),如果超时,则重试;
第 4 次发送后等待 8s(2 的 3 次幂),如果超时,则重试;
第 5 次发送后等待 16s(2 的 4 次幂),如果超时,则重试;
第 6 次发送后等待 32s(2 的 5 次幂),如果超时,则超时失败。
2、Windows下重试机制
Windows下重试机制由TcpMaxConnectRetransmissions(重试次数)和TcpInitialRTT(超时时间)控制,TcpMaxConnectRetransmissions默认值一般为2,TcpInitialRTT默认是3秒。
TcpMaxConnectRetransmisstions的值表示TCP连接重发,TCP退出前重发非确认连接请求(SYN)的次数。对于每次尝试,重发超时是成功重发的两倍。
TCPInitialRTT值表示超时时间。
第 1 次连接后等待 3s,如果超时,则重试;
第 2 次连接后等待 6s(3*2),如果超时,则重试;
第 3 次连接后等待 12s((3*2)*2),如果超时,则失败。
netsh interface tcp show global查看tcp配置信息
注:
开发过程中,建议程序设置连接超时时间,不建议使用操作系统的超时时间。
超时时间分创建连接超时时间、数据传输超时时间、从连接池中获取到连接的超时时间。