设置TCP的keepalive来进行网络联调

转载:设置TCP的keepalive来进行网络联调_北雨南萍的博客-CSDN博客

使用TCP的keepalive来检查网络错误 

为了检测网络错误和信令连接问题,你可以开启TCP的keep alive 功能。 
它会增加信令使用的带宽,但信令通道使用的带宽要小于它的实际带宽,增加得并不多。 
而且,还可以控制它keep alive的超时时长。 

问题是大多数的系统对TCP keepalive的超时时长为7200秒,约两个小时。 
你可能会想要这个时间更短此,如一分钟等。 
对于每个系统,调整这个参数的方式是不一样的。 

在设置完所有的相关参数后,需要检测下这些设置是否生效, 
就需要生成一个测试调用,然后拔出网线,看这个调用是否在超时时长后结束。 

一、Linux 系统 
使用 sysctl -A 命令查看所有有效的内核变量,使用 grep net.ipv4 过滤。 
$ sysctl -A | grep net.ipv4 

应当有下列变量 
- net.ipv4.tcp_keepalive_time   - 在第一次keep alive请求发送后,不活动连接的时间                                
- net.ipv4.tcp_keepalive_probes - 在这个连接被认为是断开之前,keep alive请求被重发的次数 
- net.ipv4.tcp_keepalive_intvl  - keep alive探测的时间间隔 

可以使用下面的命令操作这些变量: 
$ sysctl -w net.ipv4.tcp_keepalive_time=60 net.ipv4.tcp_keepalive_probes=3 net.ipv4.tcp_keepalive_intvl=10 

这个命令将TCP keepalive的超时设为60秒,并有三次重发,每次间隔10秒。 
因此,你的应用程序90秒(60  + 10 + 10 + 10)后检测到TCP断开 

二、FreeBSD and MacOS X 
For the list of available TCP settings (FreeBSD 4.8 an up and 5.4): 
sysctl -A | grep net.inet.tcp 

net.inet.tcp.keepidle - Amount of time, in milliseconds, that the (TCP)  
                                 connection must be idle before keepalive probes (if enabled) are sent. 
net.inet.tcp.keepintvl - The interval, in milliseconds, between  keepalive probes sent to remote machines. 
                         After TCPTV_KEEPCNT (default  8) probes are sent, with no response,  
                         the (TCP)connection is dropped. 
net.inet.tcp.always_keepalive - Assume that SO_KEEPALIVE is set on all  TCP connections,  
                                the kernel will periodically send a packet to the  remote host to  
                                verify the connection is still up. 

therefore formula to calculate maximum TCP inactive connection time is  
following: 
net.inet.tcp.keepidle + (net.inet.tcp.keepintvl x 8) 
the result is in milliseconds. 
therefore, by setting 
net.inet.tcp.keepidle = 10000 
net.inet.tcp.keepintvl = 5000 
net.inet.tcp.always_keepalive =1 (must be 1 always) 
the system will disconnect a call when TCP connection is dead for: 
10000 + (5000 x 8) = 50000 msec (50 sec) 

To make system remember these settings at startup, you should add them  
to /etc/sysctl.conf file 

Solaris 
For the list of available TCP settings: 
ndd /dev/tcp \? 
Keepalive related variables: 
- tcp_keepalive_interval - idle timeout 
Example: 
ndd -set /dev/tcp tcp_keepalive_interval 60000 
​ 
三、Windows 
Search Knowledge Base for article ID 120642: 
http://support.microsoft.com/kb/120642/EN-US 
Basically, you need to tweak some registry entries under 
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters 

Linux 
net.ipv4.tcp_keepalive_time = 300 
net.ipv4.tcp_keepalive_probes = 10 
net.ipv4.tcp_keepalive_intvl = 30 
​ 
The procedures involving keepalive use three user-driven variables: 
tcp_keepalive_time 
the interval between the last data packet sent (simple ACKs are not considered data)  
and the first keepalive probe; after the connection is marked to need keepalive,  
this counter is not used any further 
tcp_keepalive_intvl 
the interval between subsequential keepalive probes,  
regardless of what the connection has exchanged in the meantime 
tcp_keepalive_probes 
the number of unacknowledged probes to send before considering the connection dead  
and notifying the application layer 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值