TCP 的 keeplive保活机制

在一般情况下,TCP在网路为了避免半连接状态(比如客户端已经掉线服务器还在提供资源),会在长时间没有数据传输时主动关闭连接,但很多应用场景下,如websocket,连接需要一直保持,以便于客户端随时能接收到服务器的消息。只要客户端每隔一段时间向服务器发送一条保活数据,这样服务器就不会主动关闭连接。

为了不影响业务数据,一方会发送与前一个seq相同的数据包,而另一方则会回复同样的ack,如果另一方没有回复,就说明连接有问题。这就是保活的原理。

TCP默认没有数据情况下2小时后发送一次保活消息,在/proc/sys/net/ipv4目录下的 tcp_keepalive_time 文件中可以设置。tcp_keepalive_intvl 文件表示保活消息的间隔,默认是75s,tcp_keepalive_probes 文件表示累计没有收到的回复数算掉线。也可以针对某个socket来设置:

int keeplive = 1; // 打开keepkive属性
int keepidle = 60; // 60s没有数据keeplive激活
int keepinterval = 5; // keeplive间隔5s
int keepcount = 3; // 探测失败尝试次数
setsocket(fd,SOL_SOCKET,SO_KEEPALIVE,(void*)&keeplive,sizeof(keeplive);
setsocket(fd,SOL_SOCKET,SO_KEEPPIDLE,(void*)&keeppidle,sizeof(keeppidle);
setsocket(fd,SOL_SOCKET,SO_KEEPINTVL,(void*)&keepintvl,sizeof(keepintvl);
setsocket(fd,SOL_SOCKET,SO_KEEPCNT,(void*)&keepcount,sizeof(keepcount);

在保活情况中,有三种情况

你可能感兴趣的:(计算机网络)