java socket-keepalive理解
发布日期:2021-06-29 22:24:14 浏览次数:2 分类:技术文章

本文共 2324 字,大约阅读时间需要 7 分钟。

socket keepalive理解

参考URL: https://www.cnblogs.com/xiao-tao/p/9718017.html

java socket编程中有个keepalive选项,看到这个选项经常会误解为长连接,不设置则为短连接,实则不然。

socket连接建立之后,只要双方均未主动关闭连接,那这个连接就是会一直保持的,就是持久的连接。keepalive只是为了防止连接的双方发生意外而通知不到对方,导致一方还持有连接,占用资源。

其实这个选项的意思是TCP连接空闲时是否需要向对方发送探测包,实际上是依赖于底层的TCP模块实现的,java中只能设置是否开启,不能设置其详细参数,只能依赖于系统配置。

SocketOptions.java 部分源码

/**     * When the keepalive option is set for a TCP socket and no data     * has been exchanged across the socket in either direction for     * 2 hours (NOTE: the actual value is implementation dependent),     * TCP automatically sends a keepalive probe to the peer. This probe is a     * TCP segment to which the peer must respond.     * One of three responses is expected:     * 1. The peer responds with the expected ACK. The application is not     *    notified (since everything is OK). TCP will send another probe     *    following another 2 hours of inactivity.     * 2. The peer responds with an RST, which tells the local TCP that     *    the peer host has crashed and rebooted. The socket is closed.     * 3. There is no response from the peer. The socket is closed.     *     * The purpose of this option is to detect if the peer host crashes.     *     * Valid only for TCP socket: SocketImpl     *     * @see Socket#setKeepAlive     * @see Socket#getKeepAlive     */    @Native public final static int SO_KEEPALIVE = 0x0008;

源码的意思是,如果这个连接上双方任意方向在2小时之内没有发送过数据,那么tcp会自动发送一个探测探测包给对方,这种探测包对方是必须回应的,回应结果有三种:

1.正常ack,继续保持连接;

2.对方响应rst信号,双方重新连接。
3.对方无响应。

这里说的两小时,其实是依赖于系统配置

在linux系统中(windows在注册表中,可以自行查询资料),tcp的keepalive参数

linux下查看相关命令

[root@VM_0_14_centos ~]# echo /proc/sys/net/ipv4/tcp_keepalive* | xargs   -n 1  strings -1 -f/proc/sys/net/ipv4/tcp_keepalive_intvl: 75/proc/sys/net/ipv4/tcp_keepalive_probes: 9/proc/sys/net/ipv4/tcp_keepalive_time: 7200[root@VM_0_14_centos ~]#

/proc/sys/net/ipv4/tcp_keepalive_time 当keepalive起用的时候,TCP发送keepalive消息的频度。默认是2小时。

/proc/sys/net/ipv4/tcp_keepalive_intvl 当探测没有确认时,keepalive探测包的发送间隔。缺省是75秒。
/proc/sys/net/ipv4/tcp_keepalive_probes 如果对方不予应答,keepalive探测包的发送次数。缺省值是9。

总结:net.ipv4.tcp_keepalive_intvl = 75 (发送探测包的周期,前提是当前连接一直没有数据交互,才会以该频率进行发送探测包,如果中途有数据交互,则会重新计时tcp_keepalive_time,到达规定时间没有数据交互,才会重新以该频率发送探测包)

net.ipv4.tcp_keepalive_probes = 9 (探测失败的重试次数,发送探测包达次数限制对方依旧没有回应,则关闭自己这端的连接
net.ipv4.tcp_keepalive_time = 7200 (空闲多长时间,则发送探测包)

转载地址:https://docker.blog.csdn.net/article/details/105735064 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:jackson 快速开始
下一篇:Ceph 基础入门

发表评论

最新留言

关注你微信了!
[***.104.42.241]2024年05月02日 21时40分33秒