`

TCP的keepalive

 
阅读更多

 

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不可达或者对方主机无响应,那么最终会发送一个复位报文段,将这个连接终止。

 

 

 

 

 

 

 

 

 

参考:

TCP-Keepalive-HOWTO

闲说HeartBeat心跳包和TCP协议的KeepAlive机制

linux下IPTABLES配置详解

iptables详解

 

 

 

 

 

  • 大小: 70 KB
  • 大小: 93.2 KB
  • 大小: 25.2 KB
  • 大小: 108.5 KB
分享到:
评论

相关推荐

    linux tcp keepalive存活代码设置

    TCP存活可以通过修改系统设置或者在tcp...设置keepalive之后,若tcp断开,则在使用该socket读写时立即失败。全部源代码,直接gcc命令就可以编译;运行本测试代码,然后拔掉主从之间的网线,主和从都可以检测到tcp断开。

    TCP Keepalive和HTTP keepalive是一个东西吗 617 - 629

    TCP 的 Keepalive 其实就是 TCP 的保活机制,它的工作原理是如果两端的 TCP 连接一直没有数据交互,达到了触发 TCP 保活机制的条件,那么内核里的 TCP 协议栈就会发送探测报文。如果对端程序是正常工作的,当 TCP ...

    WinSock_TCP_keepalive.rar_Keepalive_tcp 心跳_心跳 C_心跳包 c+_心跳包机制

    TCP Keepalive主要是由服务器端启动,向客户端定期发送“空”的TCP段,这些段不携带应用层数据,但包含了TCP头部的ACK标志,以确认连接的活性。默认情况下,Keepalive机制会在建立连接后的一段时间内保持沉默,直到...

    mtb-example-anycloud-offload-tcp-keepalive:此代码示例演示了赛普拉斯Wi-Fi设备使用PSoC:registered:6 MCU提供的TCP Keepalive卸载功能。 它采用了AnyCloud低功耗助手(LPA)中间件库,该库有助于为赛普拉斯设备开发低功耗无线应用程序。

    AnyCloud示例:WLAN TCP Keepalive卸载 此代码示例演示了赛普拉斯Wi-Fi设备使用PSoC:registered:6 MCU提供的TCP Keepalive卸载功能。 它采用了(LPA)中间件库,可帮助开发赛普拉斯器件的低功耗应用。 TCP ...

    W5500 Keepalive 应用笔记

    "W5500 Keepalive 应用笔记"是一个针对W5500网络接口芯片的专题,旨在探讨如何在TCP连接中有效地使用Keepalive机制。W5500是一款集成的以太网控制器,广泛应用于嵌入式系统,如物联网设备和工业自动化。 TCP ...

    在Linux环境下使用TCP的keepalive机制

    Linux内置支持keepalive机制,为了使用它,你需要使能TCP/IP网络,为了能够配置内核在运行时的参数,你还需要procfs和sysctl的支持。  这个过程涉及到keepalive使用的三个用户驱使的变量:  tcp_keepalive_time...

    SimpleTcp:具有SSL支持的C#中的TCP客户端和服务器的简单包装

    SimpleTcp ... 由于某些平台上的不兼容和问题,默认情况下默认禁用TCP keepalive 帮助或反馈 需要帮助或有反馈吗? 请在这里提出问题! 简单的例子 服务器实例 using SimpleTcp ; void Main ( string []

    tcp_keepalive:测试tcp保持活动模式

    TCP keepalive:TCP keepalive:参考于RFC1122 TCP内建的option,由c socket或kernel设置参数: TCP_KEEPCNT - tcp_keepalive_probes (重试几次决定断线) TCP_KEEPINTVL - tcp_keepalive_intvl(ACK传了多久没回应要重试)...

    socket的keepalive介绍

    Socket的Keepalive机制是TCP/IP通信中用于保持连接活跃性的一种技术。它的主要目标是确保在TCP连接上,即使在长时间无数据交换的情况下,也能检测到连接是否仍然有效。这在服务器与客户端通信中尤其重要,因为如果...

    判定断开前的KeepAlive探测次数

    当两个网络节点建立连接后,为了防止因网络故障或长时间无数据传输导致连接意外断开,TCP协议会周期性地发送KeepAlive探测包,以确认对方节点是否仍处于活动状态。如果在设定的时间内没有收到回应,系统会认为连接已...

    WinSockTCPkeepalive的原理学习及使用方法借鉴.pdf

    WinSock TCP keepalive机制是一种用于检测TCP连接状态的技术,它主要解决了在长时间无数据传输时判断对方是否仍在线的问题。TCP连接在设计上是可靠的,但在实际应用中,可能会遇到对端异常关闭或网络中断的情况,...

    测试解决TCP TIME-WAIT状态导致多链接失败问题.rar

    如果大量的 Time_wait ...使用 TCP Keepalive:TCP Keepalive 可以在服务器端和客户端之间建立持久连接,避免连接断开后导致的 TIME_WAIT 状态。 使用传输层网关:传输层网关可以代替服务器端和客户端之间的直接连接,

    关于TCP心跳检测共2页.pdf.zip

    - 对于服务器管理员,可以根据具体场景调整TCP Keepalive参数,例如减少`keepalive_time`以更快检测到短暂的网络故障。 - 注意,频繁的心跳检测可能导致不必要的网络拥堵,因此需要平衡检测效率与网络资源消耗。 ...

    tcp同步连接发消息心跳检测

    TCP Keepalive功能主要是为了探测一个TCP连接是否还活跃,防止因长时间无数据交换导致的连接丢失。 TCP心跳检测的工作方式如下: 1. 双方在建立连接时可以协商Keepalive的参数,如心跳间隔时间(keepalive_...

    TCP穿透NAT和防火墙的特点与测评

    帮助您理解TCP穿透,NAT穿透,网络通信如何通过防火墙

    tcp连接出现close_wait状态?_tcp_close_

    - 配置TCP Keepalive选项,定期发送探测报文检查连接是否活跃。 总之,TCP的Close_Wait状态是正常关闭过程的一部分,但长时间停留可能表示潜在的问题。通过理解TCP连接状态机和四次挥手过程,以及进行有效的故障...

    tcp.rar_TCP 心跳_TCP心跳_tcp 心跳_心跳_心跳 TCP

    心跳TCP,也称为TCP心跳检测或TCP Keepalive,是TCP协议的一个可选特性,它允许两个端点周期性地发送“心跳”消息,以确认连接的活跃状态。当一方长时间没有收到对方的数据或心跳响应时,可以判断连接可能已中断,...

    安卓版TCP/IP

    - 通过复用已存在的TCP连接(TCP KeepAlive),减少连接建立和释放的开销。 - 使用合适的缓冲区大小,避免频繁的小数据传输带来的性能损失。 9. **心跳机制**: - 为了检测网络连接的健康状态,可以在TCP连接上...

    keepalive+twemproxy+ redis主从安装配置的例子(linux)

    `Keepalive`是TCP协议的一个特性,用于在连接空闲时发送心跳包,以维持网络连接的活跃状态。在Redis中,启用Keepalive可以防止因长时间无数据传输而导致的网络连接中断。在Linux系统中,可以通过修改`/etc/sysctl....

    TCP/IP -- 探寻影响业务性能的隐形杀手

    定期进行TCP Keepalive探测,或者合理设置TCP连接的保持时间,有助于维护连接的健康性。 5. **拥塞控制**:TCP使用拥塞窗口(cwnd)和慢启动阈值(ssthresh)来控制数据发送速率,防止网络过载。拥塞避免阶段的线性...

Global site tag (gtag.js) - Google Analytics