TCP保活机制说明
在TCP中有一个Keep-alive的机制可以检测死连接,原理很简单,TCP会在空闲了一定时间后发送数据给对方:
- 如果主机可达,对方就会响应ACK应答,就认为是存活的。
- 如果可达,但应用程序退出,对方就发RST应答,发送TCP撤消连接。
- 如果可达,但应用程序崩溃,对方就发FIN消息。
- 如果对方主机不响应ack, rst,继续发送直到超时,就撤消连接。这个时间就是默认的二个小时。
TCP保活的目的:
就是为了保证长连接的可靠性,可以通过自己定义的探测频率,对长期无数据交互的长连接进行通道探测,保证连接的可靠和通畅。
TCP保活的优点:
- 在代码层面只需要打开或者关闭保活的开关就可以使用
- 不需要对方进行任何的回复或者解析,不会增加对方的负担,尤其是在与硬件通信时,不会增加多余的心跳包收发
Windows下TCP KeepAlive 的参数设置
-
KeepAliveTime: 连接创建之后,经过一段静默时间开始发送keepalive的探测包,KeepAliveTime就代表静默时间长度,单位是ms
缺省情况下,如果空闲连接在7200000毫秒(2小时)内没有活动,系统就会发送保持连接的消息。 通常建议把该值设
为1800000毫秒,从而丢失的连接会在30分钟内被检测到。
具体操作:
浏览至HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\TCPIP\Parameters注册表子键,在Parameters
子键下创建或修改名为KeepAliveTime的REG_DWORD值 -
KeepAliveInterval:keepAlive没有收到回复之后,重复发送keepAlive的时间间隔,KeepAliveInterval就代表未收到回复的探测时间
间隔,单位是ms
缺省情况下,在未收到响应而重新发送“保持连接”的信号之前,系统会等待1000毫秒(1秒),可以根据具体需求修
改
具体操作:
浏览至HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\TCPIP\Parameters注册表子键,在
Parameters子键下创建或修改名为KeepAliveInterval的REG_DWORD值。 -
TcpMaxDataRetransmissions:在KeepAlive未收到回复之后,重复发送keepAlive的次数,TcpMaxDataRetransmissions就代表这个
重发次数
缺省情况下,系统会重新发送未返回应答的数据段10次,可以根据具体需求修改
具体操作:
浏览至HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\TCPIP\Parameters注册表子
键,在Parameters子键下创建或修改名为TcpMaxDataRetransmissions的REG_DWORD值,该值的范围
是从0到4294967295,缺省值为5,根据实际情况进行设置。
实际测试时发现,windows下修改重发次数根本就没有效果,系统依然会默认发送10次,所以想缩短探测时常,只能在参数1和参数2进行修改
Netty打开TCP KeepAlive的开关
bootstrap.childOption(ChannelOption.SO_KEEPALIVE,true);
bootstrap.childOption(NioChannelOption.of(StandardSocketOptions.SO_KEEPALIVE), true);