一 基本原理
TCP的Keepalive可以简单理解成为keep tcp alive,用来检测TCP sockets的连接是否正常或是已经断开。
Keeplived的原理很简单,当建立一个TCP连接时,发送端就会创建一些计时器,其中一些计时器就是处理keeplaive相关问题的。当keepalive的计时器计数到0时,发送端就会向对端发送一些不含数据的keepalive数据包并开启ACK标志。如果得到keepalive探测包的回复,就可以认为当前的TCP连接正常,不用担心用户层面的具体实现。事实上,TCP允许处理数据流,而不是数据包,所以对于用户程序来说零字节的数据包没有危害。
开启keepalive会对防火墙或者路由器产生额外的流量。
keepalive主要承担两个任务:
检测死掉的对端连接
keepalive可以用于在对端死掉并发送通知之前检测到对端的连接状态。内核错误或者强制终止对端的应用程序进程都可能造成这种情况发生。还有一种情况使用keepalive来检测对端是否死掉是对端依然存活但是连接到对端之前的网络已经断开。
假想主机A和主机B之前一个简单的TCP连接:在A与B之间有一个简单的三次握手,A发送SYN到B,然后B发送SYN+ACK到A,最后A发送ACK到B。现在就建立起了一个稳定的TCP连接,等待某方通过这个通道传输数据。现在问题就来了:拔掉主机B的电源,主机B在没有任何通知主机A当前连接即将关闭的情况会立即关机。对于主机A,正准备接收数据,但是不知道主机B已经关机。现在主机B开机,主机A和主机B又处于正常状态,主机A知道还有一个与主机B的活动连接,但是主机B不知道。当主机A尝试通过这个死掉的连接向主机B发送数据时,主机B会返回RST,主机A就会主动关掉这个连接。
keepalived可以在对端主机不可达的情况通知发送端,减少误报的风险。实际上,如果网络中的两个主机存在这种问题,keepalive会在标记一个连接端口之前等待一段时间并重新尝试发送keepalive数据包
_____ _____
| | | |
| A | | B |
|_____| |_____|
^ ^
|--->--->--->-------------- SYN -------------->--->--->---|
|---<---<---<------------ SYN/ACK ------------<---<---<---|
|--->--->--->-------------- ACK -------------->--->--->---|
| |
| system crash ---> X
|
| system restart ---> ^
| |
|--->--->--->-------------- PSH -------------->--->--->---|
|---<---<---<-------------- RST --------------<---<---<---|
| |
2. 在网络断开的情况下阻止与对端的TCP连接断开。
_____ _____ _____
| | | | | |
| A | | NAT | | B |
|_____| |_____| |_____|
^ ^ ^
|--->--->--->---|----------- SYN ------------->--->--->---|
|---<---<---<---|--------- SYN/ACK -----------<---<---<---|
|--->--->--->---|----------- ACK ------------->--->--->---|
| | |
| | <--- connection deleted from table |
| | |
|--->- PSH ->---| <--- invalid connection |
| | |
二 在Linux下使用TCP的keepalive
tcp_keepalive_time
一个连接需要TCP开始发送keepalive探测数据包之前的空闲时间。以秒为单位
tcp_keepalive_probes
发送TCP keepalive探测数据包的最大数量,默认是9.如果发送9个keepalive探测包后对端仍然没有响应,就关掉这个连接
tcp_keepalive_intvl
发送两个TCP keepalive探测数据包的间隔时间,默认是75秒
$ cat /proc/sys/net/ipv4/tcp_keepalive_time
7200
$ cat /proc/sys/net/ipv4/tcp_keepalive_probes
9
$ cat /proc/sys/net/ipv4/tcp_keepalive_intvl
75
可以通过echo临时修改
echo "300" > /proc/sys/net/ipv4/tcp_keepalive_time
也可以通过修改/etc/sysctl.conf永久生效
$ grep net.ipv4.tcp_keepalive_time /etc/sysctl.conf
net.ipv4.tcp_keepalive_time = 300
$ sysctl -p|grep net.ipv4.tcp_keepalive_time
net.ipv4.tcp_keepalive_time = 300
- 浏览: 44885 次
相关推荐
在默认参数下,若tcp对端不通知就掉线需要等待超过2个小时本端才能确认对端掉线。使用keepalive之后,多次keepalived探测失败表明链路已经断开,可及时得到链路是否存活的信息。这样做的好处是不需要自己实现心跳...
Linux 下 TCP 参数优化 Linux 操作系统的网络性能优化是提高服务器性能的关键所在。其中,TCP 参数的优化对网络性能的影响非常大。本文将详细介绍 Linux 下 TCP 参数的优化,包括 CLOSE_WAIT 状态的生成原因、proc/...
Linux内置支持keepalive机制,为了使用它,你需要使能TCP/IP网络,为了能够配置内核在运行时的参数,你还需要procfs和sysctl的支持。 这个过程涉及到keepalive使用的三个用户驱使的变量: tcp_keepalive_time...
通过调整 Linux TCP 参数提高服务器性能 Linux 作为一个开源操作系统,具有高度的可配置性和可扩展性,在服务器性能优化中扮演着重要角色。 TCP(Transmission Control Protocol)是 Linux 中的一个核心协议,负责...
TCP keepalive:TCP keepalive:参考于RFC1122 TCP内建的option,由c socket或kernel设置参数: TCP_KEEPCNT - tcp_keepalive_probes (重试几次决定断线) TCP_KEEPINTVL - tcp_keepalive_intvl(ACK传了多久没回应要重试)...
C语言在Linux环境下实现TCP心跳包功能,主要涉及以下几个关键点: 1. **套接字编程**:首先,需要使用`socket()`函数创建套接字,`bind()`函数绑定本地地址和端口,`listen()`函数监听连接请求,`accept()`函数接收...
在 Linux 和 Windows 2000 平台下,可以使用两种方法来检测非正常断开的 TCP 连接:1. 双方定时发送握手消息;2. 使用 TCP 协议栈中的 KeepAlive 探测。第二种方法简单可靠,只需对 TCP 连接的两个 Socket 设定 ...
在IT领域,特别是网络优化和运维中,LINUX TCP优化...其他文档,如关于TCP初始窗口大小、窗口缩放选项、MTU值检测以及TCP参数的Linux内核详解,提供了丰富的理论知识和实际操作指南,对于提升网络运维技能非常有价值。
在Linux系统中,C语言编程时可以利用内核提供的接口来设置和管理TCP保活定时器,以及相关的IP选项。下面将详细介绍TCP保活定时器的原理、用途以及如何在C程序中进行设置。 1. **TCP保活定时器原理** TCP保活...
在Linux系统中,可以通过以下步骤来查看和调整“判定断开前的KeepAlive探测次数”: 1. **查看当前配置**: 使用`sysctl net.ipv4.tcp_keepalive_cnt`命令,可以查看当前系统中TCP KeepAlive探测的默认次数。 2. ...
8. **TCP Keepalive时间和Fin超时**:`sysctl -w net.ipv4.tcp_keepalive_time=300`设置TCP保持活动检查的时间间隔,`sysctl -w net.ipv4.tcp_fin_timeout=30`则设定TCP FIN状态的超时时间。 9. **TCP滑动窗口大小...
Linux内核参数优化是提升系统性能的关键步骤,尤其是在运行虚拟化环境或高负载网络服务时。本文主要讨论如何针对Linux内核进行优化,重点关注TCP网络性能和磁盘缓存策略。 首先,关于磁盘缓存策略,KVM虚拟化环境下...
本文主要关注的是与TCP/IP相关的内核参数,特别是那些影响数据传输效率和连接管理的设置。在Ubuntu 12.04 LTS Desktop (x64)系统中,这些参数位于`/proc/sys/net`目录下。 首先,我们关注接收和发送缓冲区的大小。...
例如,Keepalive参数的设定应根据网络延迟和应用特性来确定,Twemproxy的配置文件需精确规划各个Redis实例的角色和权重,而Redis主从的复制策略也需要根据数据的重要性和更新频率来优化。 通过以上详述,我们可以...
Linux内核参数调优是优化服务器性能的关键环节,特别是在硬件资源有限的情况下,通过调整内核参数可以有效地提高服务器的并发处理能力。对于Web服务器,如Nginx和Apache,它们的并发模型对于处理高负载至关重要。...
其中一种方法就是调整Linux内核参数,特别是那些与TCP/IP协议栈相关的参数,因为它们直接影响网络通信的效率。 #### 如何识别并解决问题 首先,我们需要确定服务器是否存在大量TIME_WAIT状态的连接。可以通过以下...
在Linux系统中,Keepalive是一种网络连接保持工具,主要用于TCP连接。它允许应用程序发送周期性的空数据包到网络连接上,以确保连接在无数据传输时仍保持活动状态。这在许多场景下都非常有用,例如远程登录、持续的...
2. **网络优化**:网络相关的参数如`net.core.somaxconn`决定了服务器可以同时处理的最大TCP连接数,这对于高并发的Web服务至关重要。`net.ipv4.tcp_fin_timeout`和`net.ipv4.tcp_keepalive_time`等参数可以优化连接...
在 Linux 系统中,可以通过调整 tcp_keepalive_time 参数来控制 keepalive 消息的发送频率。默认值是 7200 秒(2 小时)。 3. TCP 连接重试:当服务器无法建立连接时,需要进行多次重试。在 Linux 系统中,可以通过...