关于keepalive的学习

最近在跟着做一个开源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中,AbstractPollingIoProcessor有一个内部类Processor,专门处理读写事件,其中读事件利用NIO的selector去处理(将channel和SelectionKey.OP_READ注册进selector),写事件会被注册成不感兴趣。那么如何知道连接是否idle?
这里需要看Processor是如何处理消息的,因为一个连接是否idle,

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值