[网络通信基础]-03:心跳机制

心跳包

心跳包就是在客户端和服务器间定时通知对方自己状态的一个自己定义的命令字,按照一定的时间间隔发送,类似于心跳,所以叫做心跳包。使用心跳包的典型协议是IM,比如QQ/MSN/飞信等协议。

作用

心跳包主要也就是用于长连接的保活和断线处理。

保活

在长连接下,有可能很长一段时间都没有数据往来。理论上说,这个连接是一直保持连接的,但是实际情况中,如果中间节点出现什么故障是难以知道的。有的节点(防火墙)会自动把一定时间之内没有数据交互的连接给断掉。在这个时候,就需要我们的心跳包了,用于维持长连接,保活。

断线处理

心跳包一般来说都是在逻辑层发送空的包来实现的。下一个定时器,在一定时间间隔下发送一个空包给客户端,然后客户端反馈一个同样的空包回来,服务器如果在一定时间内收不到客户端发送过来的反馈包,那就只有认定说掉线了。

心跳实现

心跳包主一般应用下,判定时间在30-40秒,要求高的可以设为6-9秒。

方法1:应用层自己实现的心跳包 

  • 客户端每隔一个时间间隔发生一个探测包给服务器
  • 客户端发包时启动一个超时定时器
  • 服务器端接收到检测包,应该回应一个包
  • 如果客户机收到服务器的应答包,则说明服务器正常,删除超时定时器
  • 如果客户端的超时定时器超时,依然没有收到应答包,则说明服务器挂了

方法2:TCP的KeepAlive保活机制

用setsockopt将SOL_SOCKET.SO_KEEPALIVE设置为1打开TCP的KeepAlive机制,并设置三个参数

  • tcp_keepalive_time:连接闲置多久开始发keepalive的ack包
  • tcp_keepalive_probes:发几个ack包不回复才当对方死了
  • tcp_keepalive_intvl:两个ack包之间间隔多长,默认2小时

具体可参考C# Socket 长连接设置Keepalive https://blog.csdn.net/elie_yang/article/details/95197181

TCP本身的心跳包的机制,一般只用于保活,无法及时检查机器断电、网线拔出、防火墙这些断线,且心跳周期无法动态更改。

 

 

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值