关于keepalive的学习

本文探讨了TCP的keepalive机制,以及在mina、netty、rocketmq客户端、openfire和mqtt中的实现方式。重点讲解了netty如何通过IdleStateHandler处理闲置连接,并分析了rocketmq客户端通过心跳保持长连接的策略。
摘要由CSDN通过智能技术生成

最近在跟着做一个开源xmpp iot项目,需要处理ping机制,所以学习了tcp是如何keepalive的以及常用mq的ping机制。特此记录。

tcp的keepalive

正常使用情况下,tcp为了维持长连接,在连接idle之后,会发送keepalive探针包,当发送一定次数都未收到ack时(idle时间、发送次数,发送间隔都可以在系统配置文件设置),会断开连接。但是系统默认不开放,而且不同系统对于keepalived的作用范围不一样,有的允许对单个连接开放,有的只能对所有连接开放。除此之外,keepalive参数也是问题,系统默认2个小时没有收到数据才会发送keepalive探针。但是如果keepalive不开放,如果产生大量半连接的tcp连接(客户端非正常关闭,如宕机),对于服务器会有影响。 如果tcp的一端非正常关闭(如机器突然重启),另一端是不知道的,此时tcp处于半开状态,如果向非正常关闭的那端发送数据,会收到rst,这时tcp也就断了。如果tcp连接的网络层断了(如无线网络情况下),tcp两端都是不知道网络状况的(icmp一般不开放),这是如果传输数据会收不到ack,直到超时重发启动,当超时重发达到一定阈值后,会放弃连接,但是这个时间会很长。
在java中,socket正常调用close方法,会走tcp fin流程,但是如果直接杀掉进程或者退出程序,退出的一方会直接发送rst,这时连接断开。
综上,所以需要在应用层加入ping机制来维持连接。

mina和netty中的idle状态

众所周知mina和netty是java中nio框架。那么在这些nio框架中,如何保持tcp的连接的呢?

先看看mina

mina框架中tcp读写事件的select轮询(NioSocketAcceptor作为ServerSocket时)在AbstractPollingIoProcessor中,AbstractPollingIoProce

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值