zoukankan      html  css  js  c++  java
  • 设置linux中tcp默认的20秒connect超时时间(转)

    无论你用任何语言或者是网络库,你都可以设置网络操作的超时时间,特别是connect、read、write的超时时间。

    你可以在代码中把超时时间设置任意大小值,但是connect方法会有一点特殊。
    connect的超时时间在任意的内核实现上都有一个可以设置的最大值,你的代码中设置的超时值并不能超过这个最大值(即使你设置的值超过这个最大值,其仍然会在最大超时时间后time out)。
     
    tcp建立连接的过程从客户端发送syn包开始。如果客户端没有收到这个syn包的回复,内核会重试多次发送syn包,每次重试的间隔都会逐渐增加,避免发送太多的syn包影响网络。
    所有的内核对syn包发送的重复次数都有一个上限值。在BSD衍生的内核中(包括Mac OS X),会在第一次发送syn包后的6秒重试第二次,在第二次尝试后的18秒尝试第三次,如果第3次还不能成功就认为connect超时(此时经过了75秒)。
    然而,在linux系统上,整个syn包发送的事件过程才差不多20几秒。linux系统比bsd类系统重发syn包的时间间隔要密。linux在20多秒内发送5个syn包(其中包括原始的syn包和后面的重发包),其依次在首包发送的3s,6s,12s,24s后发送。
    如果你的程序设置的connect超时时间比20s小,那么没有问题。但是如果你的设置值大于20s,那么你会发现内核会将该值截断为20s。
     
    改变这个系统上限值也比较容易,由于需要改变系统配置参数,你需要root权限。
    相关的命令是sysctl net.ipv4.tcp_syn_retries(针对于ipv4)。
    在设置该值时还是要比较保守的,因为每次syn包重试的间隔都会增大(比如BSD类的系统实现中间隔会以2到3倍增加),所有tcp_syn_retries的一个微小变化对connect超时时间的影响都非常大,不过扩大这个值也不会有什么坏处,因为你代码中设置的超时值都能够生效。但是如果代码中没有设置connect的超时值,那么connect就会阻塞很久,你发现对端机器down掉的间隔就更长。
     
    查看该值的命令是:
    sysctl net.ipv4.tcp_syn_retries
     
    4,timeout是31秒。
    5,timeout是75秒。
    6,timeout是127秒。
     
    默认是:
    net.ipv4.tcp_syn_retries = 4
     
    你能通过以下命令修改该值:
    sysctl -w net.ipv4.tcp_syn_retries=5
     
    如果希望重启后生效,将net.ipv4.tcp_syn_retries = 4放入/etc/sysctl.conf中。

    英文原文:http://www.sekuda.com/overriding_the_default_linux_kernel_20_second_tcp_socket_connect_timeout

    系统调优:http://blog.csdn.net/largetalk/article/details/16863689

  • 相关阅读:
    ZOJ 1002 Fire Net
    Uva 12889 One-Two-Three
    URAL 1881 Long problem statement
    URAL 1880 Psych Up's Eigenvalues
    URAL 1877 Bicycle Codes
    URAL 1876 Centipede's Morning
    URAL 1873. GOV Chronicles
    Uva 839 Not so Mobile
    Uva 679 Dropping Balls
    An ac a day,keep wa away
  • 原文地址:https://www.cnblogs.com/1024Planet/p/8184455.html
Copyright © 2011-2022 走看看