心跳包&乒乓包【介绍】

心跳包&乒乓包(可以携带少量的信息)【应用层协议】

心跳检测机制:主要是用来检测用户是否处于连接的状态。

在TCP网络通信中客户端与服务器时常的非正常断开,所以需要检测client是否保持连接,常用的手段就是心跳机制。

Heart-Beat线程

就是运用守护进程https://blog.csdn.net/qq_44065088/article/details/109141683我已经讲过了 守护进程(线程)怎么编写,在接收和发送数据时个人设计一个守护进程(线程),定时发送 Heart-Beat包,client/server收到改小包后,立刻返回相应的包即可检测对方是否实时在线。【该方法的好处就是通用,但缺点就是会改变现有的通信协议!大家都使用业务层心跳来处理,主要时灵活可控。】

原理如图:

UNIX网络编程不推荐使用SO_KEEPALIVE【开发基本不用,但还是介绍一下】来做心跳检测,还是用业务层以心跳检测比较好,方便控制。

设置TCP属性

SO_KEEPALIVE保持连接检测对方主机是否崩溃,避免(服务器)永远阻塞于TCP连接的输入。设置该选项后,如果2小时内在此套接口的任一方向都没有数据交换, TCP就自动给对方发一个保持存满探测分节(keepalive probe)。这是一个对方必须响应的TCP分节.它会导致以下三种情况:对方接收一切正常:以期望的ACK响应。2小时后,TCP将发出另一个探测分节。对方己崩溃且己重新启动:以RST响应。套接口的待处理错误被置为ECONNRESET,套接口本身则被关闭。对方无任何响应:源自berkeley.的TCP发送另外8个探测分节,相隔75秒一个,试图得到一个响应。在发出第一个探测分节11分钟15秒后若仍无响应就放弃。套接口的待处理错误被置为ETIMEOUT,套接口本身则被关闭。如ICMP错误是“host unreachable(主机不可达)",说明对方主机并没有崩溃,但是不可达,这种情况下待处理错误被置为EHOSTUNREACH。
根据上面的介绍我们可以知道对端以一种非优雅的方式断开连接的时候,我们可以设置SO_KEEPALIVE属性使得我们在2小时以后发现对方的TCP连接是否依然存在。

2个小时对于 处理并发量高的服务器来说 可能 大量的 这样的文件描述符资源被浪费了。而且实时性不高。【但是还是介绍一下设置的方式】

int keepAlive = 1;

setsockopt(listenfd, SOL_SOCKET, SO_KEEPALIVE, (void*)&keepAlive,  sizeof(keepAlive));

猜你喜欢

转载自blog.csdn.net/qq_44065088/article/details/109287621