首页 > 代码库 > 设置TCP的keepalive来进行网络联调
设置TCP的keepalive来进行网络联调
使用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
为了检测网络错误和信令连接问题,你可以开启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
设置TCP的keepalive来进行网络联调
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。