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

本文共 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 基础入门

发表评论

最新留言

感谢大佬
[***.8.128.20]2024年04月13日 04时45分39秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章

Hourglass Network 沙漏网络 (pose estimation姿态估计) 2019-04-30
OpenCV实战(二)——答题卡识别判卷 2019-04-30
目标检测神经网络的发展历程(52 个目标检测模型) 2019-04-30
Boundary loss 损失函数 2019-04-30
神经网络调参实战(一)—— 训练更多次数 & tensorboard & finetune 2019-04-30
tensorflow使用tensorboard进行可视化 2019-04-30
神经网络调参实战(二)—— activation & initializer & optimizer 2019-04-30
凸优化 convex optimization 2019-04-30
数据库索引 & 为什么要对数据库建立索引 / 数据库建立索引为什么会加快查询速度 2019-04-30
IEEE与APA引用格式 2019-04-30
research gap 2019-04-30
pytorch训练cifar10数据集查看各个种类图片的准确率 2019-04-30
Python鼠标点击图片,获取点击点的像素坐标 2019-04-30
路径规划(一) —— 环境描述(Grid Map & Feature Map) & 全局路径规划(最优路径规划(Dijkstra&A*star) & 概率路径规划(PRM&RRT)) 2019-04-30
神经网络调参实战(四)—— 加深网络层次 & 批归一化 batch normalization 2019-04-30
数据挖掘与数据分析(三)—— 探索性数据分析EDA(多因子与复合分析) & 可视化(1)—— 假设检验(μ&卡方检验&方差检验(F检验))&相关系数(皮尔逊&斯皮尔曼) 2019-04-30
RRT算法(快速拓展随机树)的Python实现 2019-04-30
路径规划(二) —— 轨迹优化(样条法) & 局部规划(人工势能场法) & 智能路径规划(生物启发(蚁群&RVO) & 强化学习) 2019-04-30
D*算法 2019-04-30
强化学习(四) —— Actor-Critic演员评论家 & code 2019-04-30