本文共 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 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!