文章目录
一、TCP KeepAlive 初衷
交互双方建立 TCP 连接,但并不是一直都有数据交互,有些连接在数据交互完毕后会被立即释放,有些则不会,那么在长时间无数据交互的情况下,双方都有可能发生主机宕机、网络异常等各种意外,当这些意外发生后,连接并未来得及被正常释放,另一方在不知道对端异常的情况下会一直维护这个连接,长时间的积累会占用过多的系统资源,尤其是服务端,为了避免资源浪费,于是就有了 TCP「保活」机制
从 NAT 角度理解 TCP KeepAlive 的必要性
网络基础 - NAT 篇有提到过转换表(如下),其中,202.244.174.37:1025/1026 的 1025/1026 是临时分配的端口
由于端口数量有限([0, 65535]),再加上维护转换表需要额外开销,因此不能无休止地向转换表中增加记录,对于过期的记录,需要将其删除
如何判断哪些是过期记录?
一段时间内无活动的连接,其对应记录就是过期的,NAT 路由器应定时检查转换表中的非活动连接,并将其丢弃,注意,这个丢弃的动作并不会告知该连接的任何一方
问题来了,如果一个客户端应用因业务需要必须与服务端维持长连接,那么该连接在长时间没有任何数据交互的情况下,NAT 路由器会将其对应记录从转换表中删除,客户端和服务端对此是毫无感知的,连接被丢弃后,服务端再也收不到客户端发送的数据包,显然客户端也收不到服务端的数据推送