参考:
https://download.youkuaiyun.com/download/qq_31567335/10213200
简介:一个令大多数新手吃惊的事实是,当TCP连接空闲的时候,它们之间不会有任何数据流动。一旦连接建立起来,就算过去了几天,几个月,就算中间的网络断开了,但是只要两端的主机没有重启,连接就一直存在。
但是有很多场景,需要了解连接的另一端是否还存在,比如说服务端需要了解客户端是否还存在。大多数的TCP实现都有保活定时器,来提供这个功能。
但是,从保活定时器并不是TCP规范中的一部分。Host Requirements RFC提供了3个不使用保活定时器的理由: 1.一个好的连接可能会因为网络出现短暂的差错而释放掉,2耗费不必要的带宽 3在分组计费的情况下会花费更多的钱。
描述
一般都是服务器端开启保活定时器,当TCP连接之间超过一定的时间(可以设定,系统默认2小时)没有发送任何数据之后,就会发送一个探测报文段),
客户端会有以下4种情况:
1.客户端和网络都正常。那么客户端接收到探测报文之后会正常返回。保活定时器重新开始计时,当然,数据的交互也会导致保活定时器重新计时。
2.客户端崩溃。这种情况下客户端不会有任何响应。服务端发送的报文在75s之后会超时,然后重试最多9次,如果全部失败,则关闭连接。
3.客户端崩溃过但是已经重启完毕。那么客户端会回复reset报文,服务器端收到回复后关闭连接
4.客户主机正常运行,但是从服务器不可达 ,这在服务器看来与情况2是相同的。
报文格式
发送一个数据为空的报文,序列号为另一端期待的序列号减1。这会导致另一端重新发送ack确认报文,告诉另一端自己期待的序列号。