保活机制:是一种在不影响数据流内容的情况下探测对方的方式。它是由一个保活计时器实现的。当计时器被激发, 连接端将发送一个保活探测(简称保活)报文 , 另一端接收报文的同时会发送一个ACK作为响应。
保活机制
保活功能在默认情况下是关闭的,TCP连接的任何一端都可以请求打开这一功能。保活功能可以被设置在连接的一端、两端,或者两端都没有。
但是保活机制也存在一定的争议:保活机制是一个可选择激活的功能。它可能会导致一个好的连接由于两端系统之间网络的短暂断开而终止。
机制
在一段时间(称为保活时间,keepalive time)内连接处于非活动状态,开启保活功能的一端将向对方发送一个保活探测报文。如果发送端没有收到响应报文,那么经过一个已经提前配置好的保活时间间隔(keepalive interval),将继续发送保活探测报文,直到发送探测报文的次数达到保活探测数(keepalive probe),这时对方主机将被确认为不可到达,连接也将被中断。
报文
保活探测报文为一个空报文段(或1个字节),序列号等于对方主机发送的ACK报文的最大序列号减1。
因为这一序列号的数据段已经被成功接收,所以不会对到达的报文段造成影响,但探测报文返回的响应可以确定连接是否仍在工作。接收方收到该报文以后,会认为是之前丢失的报文,所以不会添加进数据流中。但是仍然要发送一个ACK确认。
探测及其响应报文丢失后都不会重传。探测方主动不重传,相应方的ACK报文并不能自己重传,所以需要保活探测数。
保活检测的结果
TCP保活功能工作过程中, 开启该功能的一端会发现对方处于以下四种状态之一:
1. 对方主机仍在工作
服务器端正常收到ACK,说明客户端正常工作。
请求端将保活计时器重置。重新计时。
- 对方主机已经崩溃
对方的TCP将不会响应ACK。
超过保活探测数以后,认为对方主机已经关闭,连接也将被断开。 - 客户主机崩溃并且已重启
客户端响应是一个重置报文段,请求端将会断开连接。 - 对方主机仍在工作
但是因为其他原因(网络问题)就是没有收到ACK。
总结
现在所有主流TCP版本都实现保活功能。应用层可以选择是否开启这一功能来建立连接。
若某个连接长时间处于空闲状态( 通常这段时间设定为2 小时) , 在该连接的一端会发送一个探测数据包( 虽然这个数据包可以包含任何数据, 但通常情况下会包含“ 垃圾” 字节) , 从而实现保活功能。可能会发4种不同的情况:另一端仍在工作; 另一端已经崩溃; 另一端崩溃并且已经重新启动; 另一端当前无法到达。