7.1、服务器安全-过往总结、心跳包

1、心跳包概念
心跳包其实就是一个普通的数据包,一般每隔几十秒最常一般是一分钟,由客户端主动发送给服务器,服务器也会返回一个心跳包。
三路握手,tcp连接建立之后,才存在发送心跳包的问题。如果客户端不给服务器发送心跳包,服务器会着怎样处理。服务器会在约定时间的三倍内主动关闭该客户端的socket连接。
如果客户端在三倍的约定时间还没有收到服务器回应的心跳包,客户端应该主动关闭与服务器端的连接,如果需要重连,关掉连接后还需要主动尝试重连。如果连接断开,则需要提示使用者连接已断开。

2、为什么引入心跳包
常规客户端关闭,服务器端能够感知到,epoll会收到。
有一种特殊情况,连接断开,客户端服务器都感知不到。如果客户端和服务器不在统一台机器,如果拔掉客户端和服务器的网线。这种情况对方无法感知是否已经断开。
tcp本身提供keepalive机制。可以检测,但时间不好控制。
其它作用:检测网络延迟等。

3、心跳包代码实战。
3.1、接收心跳包与返回结果
规定消息代码,暂时规定为0.一般来讲心跳包不需要包体。只有包头就足够。
引入_handleping函数。
3.2、处理不发送心跳包的客户端
超过约定时间3倍+10秒没发送心跳包,就把tcp连接断开。
增加2个配置项。修改读取配置信息
新建文件ngx_c_socket_time.cpp
用户三路握手进来成功,开启定时时钟,消息头加入时间队列。使用multimap做定时器。键值可以重复。自动排序。

          * 谁来处理时间队列中的数据呢?
          创建一个新线程处理。处理到期不发心跳包的踢出。
          释放内存。

你可能感兴趣的:(7.1、服务器安全-过往总结、心跳包)