理解tcp connect timeout

tcp socket创建之后,可以对fd进行设置recv 和send的超时时间,但是没有设置connect timeout的时间的选项,以前见过一个说法,connect timeout = send timeout,好像并不正确。

实际上,connect的超时时间在任意的内核实现上都有一个可以设置的最大值,你的代码中设置的超时值并不能超过这个最大值(即使你设置的值超过这个最大值,其仍然会在最大超时时间后time out)。

           tcp建立连接的过程从客户端发送syn包开始。如果客户端没有收到这个syn包的回复,内核会重试多次发送syn包,每次重试的间隔都会逐渐增加,避免发送太多的syn包影响网络。
             所有的内核对syn包发送的重复次数都有一个上限值。在BSD衍生的内核中(包括Mac OS X),会在第一次发送syn包后的6秒重试第二次,在第二次尝试后的18秒尝试第三次,如果第3次还不能成功就认为connect超时(此时经过了75秒)。
            通过以上信息就可以看出来了,tcp的connect timeout和系统内核发送几次syn数据包有关,和内核发送syn数据包的间隔有关,发送次数由这个值决定的net.ipv4.tcp_syn_retries,每一次重传SYN包的间隔时间分别是1s,2s,4s,8s,16s,这些时间累积加起来总共为31s,tcp_syn_retries的值设置为0,则超时时间为1秒,设置为4则超时时间为31s。此值默认为5,也在openwrt上见过6,建议设置为2,重发三次syn,耗时7s。

参考:https://ms2008.github.io/2017/04/14/tcp-timeout/

https://www.cnblogs.com/1024Planet/p/8184455.html

发表评论

电子邮件地址不会被公开。 必填项已用*标注