TCP的keepalive
一般是服务端开启这个功能,当然双方都可以使用。对于客户端来说会处于以下四种状态之一:
1.客户主机依然正常运行,并从服务器可达。客户端的TCP响应正常,而服务端也知道对方是正常工作的,服务器再两小时以后将keepalive定时器复位。如果在两个小时定时器时间达到之前有应用程序的通信量通过此连接,则定时器在交换数据后的未来2小时再复位。
2.客户端主机已崩溃,并且关闭或者正在重启。在任何一种情况下,客户端的TCP都没有响应。服务器将不能够收到对探查的响应,并在75秒后超时。服务器总共发送10个这样的探查,每个间隔75秒,如果服务器没有收到一个响应,它就认为客户端主机已经关闭并终止连接。
3.客户端主机崩溃并重新启动。这时服务端将收到一个对其keepalive活动探查的响应,但是这个响应是一个复位,使得服务端终止这个连接。
4.客户端主机正常运行,但是从服务端不可达,这与状态2相同,因为TCP不能够区分状态2和状态4的区别,它所能发现的就是没有收到探查的响应。
修改TCP的keepalive相关参数:
# cat /proc/sys/net/ipv4/tcp_keepalive_time 7200 # cat /proc/sys/net/ipv4/tcp_keepalive_intvl 75 # cat /proc/sys/net/ipv4/tcp_keepalive_probes 9
第一个是多长时间做一次keepalive检查,默认是2小时
第二个是当触发keepalive检查后连接不同,再触发一个探查(一个另外的检查),每次探查的时间间隔
第三个是触发多少次探查
修改之后需要重启网络
/etc/init.d/network restart
对于java的服务端来说,需要指定打开keepalive选项
使用tcpdump辅助观察,抓包命令
tcpdump -i lo port 7040 -nn -X
使用iptables封住ip
#封ip iptables -t filter -A INPUT -s ip_addr -j DROP #封进入的端口 iptables -t filter -A INPUT -p tcp --dport 8000 -j DROP #封出去的端口 iptables -t filter -A OUTPUT -p tcp --dport 8000 -j DROP #允许某个出去的端口 iptables -t filter -A OUTPUT -p tcp --dport 9999 -j ACCEPT #查看iptables内容 iptables -L -n #清空iptables iptables -F
1.正常的keepalive如下:
首先这里修改了keepalive检查时间为30秒。
最上面三行是三次握手,三次握手之后客户端(客户端是1135)和服务端没有任何应用层的数据交换。
过了一段时间(实际是上超过了30秒,不知道为何)看到服务端发送一个keepalive给客户端,客户端在返回一个ack。之后又过了一段时间又是一个keepalive检查包和ack应答。
这里可以看到keepalive确实起到作用了,它相当于一个后台线程,某某的运行,一段时间之后就会发送一个心跳包检查对方是否存活。
2.keepavlie检查超时
当服务端触发keepalive检查后,发现客户端无法连接,就会尝试经过75秒后(默认值)再次尝试发送一个心跳包检查,一直发送9次,如果这期间没有一个响应的话,就认为对方不可达,发送一个复位标志。(图片中绿色遮住的是服务端,红色遮住的是客户端,之后图片也是一样)
而客户端的连接还保持着在,如果恢复网络(iptables解封),服务端不会发送任何数据给客户端了。因为服务端认为客户端已经死掉了。此时如果客户端再给服务端发送数据的话,服务端会返回一个复位标志。
3.客户端已经崩溃或者重启
以上两个主机之间用iptables相互封住了,互相ping都ping不同。
在图中可以看到服务端发送了几次keepalive检查后发现无法连同,然后发起了75秒一次的探查,最后客户端kill -9 强行杀掉了这个连接。最后红色的遮住的线,也就是客户端发送了一个fin包,这个可能是操作系统发送的包,所以iptables没有拦住,最后导致服务端发送复位标志。
这里的演示和《TCP/IP详解》里面的还不同,那里的演示中是直接拔掉了网线,然后关闭进程再插上网线,如果之后服务端触发了keepalive的话,会收到客户端的复位标志。
4.另一端不可达
两段的主机都是正常的,进程也正常,但是中间的网络不通,比如途径的路由器突然重启了等情况。
这时候服务端发送keepalive检查的时候,会收到一个ICMP差错报文,但是这个错误对于TCP来说只是一个软错误,它会继续尝试9次(每隔75秒一次的探查)如果每次都是ICMP不可达或者对方主机无响应,那么最终会发送一个复位报文段,将这个连接终止。
参考:
闲说HeartBeat心跳包和TCP协议的KeepAlive机制
相关推荐
TCP存活可以通过修改系统设置或者在tcp...设置keepalive之后,若tcp断开,则在使用该socket读写时立即失败。全部源代码,直接gcc命令就可以编译;运行本测试代码,然后拔掉主从之间的网线,主和从都可以检测到tcp断开。
TCP Keepalive和HTTP keepalive是一个东西吗 617 - 629
AnyCloud示例:WLAN TCP Keepalive卸载 此代码示例演示了赛普拉斯Wi-Fi设备使用PSoC:registered:6 MCU提供的TCP Keepalive卸载功能。 它采用了(LPA)中间件库,可帮助开发赛普拉斯器件的低功耗应用。 TCP ...
Linux内置支持keepalive机制,为了使用它,你需要使能TCP/IP网络,为了能够配置内核在运行时的参数,你还需要procfs和sysctl的支持。 这个过程涉及到keepalive使用的三个用户驱使的变量: tcp_keepalive_time...
SimpleTcp ... 由于某些平台上的不兼容和问题,默认情况下默认禁用TCP keepalive 帮助或反馈 需要帮助或有反馈吗? 请在这里提出问题! 简单的例子 服务器实例 using SimpleTcp ; void Main ( string []
TCP keepalive:TCP keepalive:参考于RFC1122 TCP内建的option,由c socket或kernel设置参数: TCP_KEEPCNT - tcp_keepalive_probes (重试几次决定断线) TCP_KEEPINTVL - tcp_keepalive_intvl(ACK传了多久没回应要重试)...
如果大量的 Time_wait ...使用 TCP Keepalive:TCP Keepalive 可以在服务器端和客户端之间建立持久连接,避免连接断开后导致的 TIME_WAIT 状态。 使用传输层网关:传输层网关可以代替服务器端和客户端之间的直接连接,
帮助您理解TCP穿透,NAT穿透,网络通信如何通过防火墙
cluster是一套golang开发的实时消息推送集群轻量级高性能纯Golang实现支持消息过期支持离线消息存储支持全量推送和单个私信推送支持单个Key多个订阅者(可限制订阅者最大人数)心跳支持(应用心跳和tcp keepalive)...
设置好keepalive以后,我们通过实验来看看当client异常退出或是网络断掉的情况下,keepalive怎么通知我们异常断开的情况。这里采用select模式,实验环境为XP系统和Win7系统,几种情况返回值如下: 1. 正常断开 ...
这是关于WinSock_TCP_keepalive内容的知识。 通信机制中,对方是否断开,有两种判断方法。 一种就是使用心跳包,另一种就是使用KEEPALIVE.这就是关于keepalive的介绍资料
UIP协议栈 for8051。内含注释。
KeepAlive
在Linux上测试TCP Keepalive 环境测试 # Kernel 4.19.121 # uname -a Linux b441e0a92c23 4.19.121-linuxkit #1 SMP Thu Jan 21 15:36:34 UTC 2021 x86_64 x86_64 x86_64 GNU/Linux # Ubuntu 16.04.7 LTS # cat /etc...
springboot keepalive 服务端,客户端测试
Delphi之TClientSocket和TServerSocket进行TCP长连接通讯,使用KeepALive自动发送心跳包检测断网,并实现断线重连,经测试可以及时检测到拔掉网线断网情况,具有较高的参考价值
:link: 净keepalive 使用模块的Node缺少的( TCP_KEEPINTVL和TCP_KEEPCNT ) SO_KEEPALIVE套接字选项设置程序和获取程序。 经过测试 :penguin: linux & :green_apple: osx ( amd64和arm64都应该) :smiling_face_...
该值允许TCP keepalive执行其工作,因为发送keepalive数据包之前的时间间隔“”,从而为keepalive提供了4分钟的时间来挽救连接。 这个想法是建立到服务器的一些TCP连接,等待一段时间,然后发送一些数据以测试连接...
TCP keepalive移至套接字而不是侦听器 测试应用 包含针对客户端和服务器的测试项目,这将帮助您理解和练习类库。 SSL协议 WatsonTcp支持使用或不使用SSL的数据交换。 服务器和客户端类包括构造函数,可让您包括PFX...
角色:MongoDB 用其他语言查看 描述 翻转以安装 。...# Ajusta o valor do tcp keepalive de acordo com https://docs.mongodb.com/manual/faq/diagnostics/#adjusting-the-tcp-keepalive-value mongodb_t