为什么要保活定时器
保活定时器是为了判断链接是否正常,比如对端是否在线,是否重启,路径是否可达等等。
保活定时器判断tcp链接是否处于正常状态。包括
1、判断对端状态是否正常;
2、判断网络路径是否可达
认识保活探测报文
特定链接中,如果对端在两小时以内没有任何动作,服务器会发送一个保活探测报文,探测客户端是否正常。(本文假设只有服务器开了保活)
如果客户端正常并且网路可达,客户端会回保活响应。
认识一下探测报文,即keeplive报文,
服务器向客户端发送一个Keeplive请求,该报文包括1个字节的payload,但是请求序列号会比正常序列号小1。
客户端接收到请求,判断序列号小1,并带有1个字节的payload,做Keeplive响应。
如图,报文43为保活请求,请求序列号为9428
链接中,正常下一个序列号应该为9429,保活请求序列号比正常序列号小1
报文44为保活响应,保活响应没有payload,但是携带希望的下一个正确的序列号,即9429
保活探测的四种场景
服务器保活探测流程中,客户端存在以下四种可能的状态:
1、 客户端正常
客户端正常响应保活探测。
服务器重置保活定时器,两小时(系统变量,可以修改)后再探测
服务器的应用程序感知不到这个探测,这种情况,保活探测对应用透明
2、 客户端已经崩溃、关闭、或者正在重启
这种情况客户端不会有响应。
服务器会每隔75秒发送一个保活探测,发送十次后仍然没有收到客户端响应,则关闭连接,并向应用程序发送差错报告,报告类型”连接超时”
由于间隔了两小时,通常每次发送保活,会触发arp请求,如果在局域网内,由于对方已经崩溃,arp请求不会收到响应(假设网关也没有缓存arp),协议设计十次保活请求,而现实中只会看到十次arp请求。
如果在广域网,arp代理服务器可以获得arp响应,并发送出保活请求,但是最终这个报文还是到达不了客户端,没有任何响应。
3、 客户端正常,但是网络中断了。
客户端不会响应保活,服务器每隔75秒发送一个探测,尝试10次后没反应关闭连接,
给应用程序反馈错误信息。
这种情况下,一般也会先发送arp请求。
如果是局域网,会看到10个arp请求,而不是10个保活,这种情况和第二种相同;
如果出局域网,网关做arp代理,会响应这个arp请求,会看到发送了10个保活请求。
但是客户端没有路径可达,路由器会回icmp差错,错误类型为路径不可达。我们会看到10次保活请求,和对应10次icmp路径不可达差错通告
4、 客户端已经重启
客户端收到保活探测,发现没有这个链接,发送一个RST复位链接。
应用程序收到反馈“被对方复位”