一 基本原理

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 -------------->--->--->---|

|---

|--->--->--->-------------- ACK -------------->--->--->---|

|                                                        |

|                                      system crash ---> X

|

|                                    system restart ---> ^

|                                                        |

|--->--->--->-------------- PSH -------------->--->--->---|

|---

|                                                        |

2. 在网络断开的情况下阻止与对端的TCP连接断开。

_____          _____                                    _____

|    |        |    |                                  |    |

|  A  |        | NAT |                                  |  B  |

|_____|        |_____|                                  |_____|

^              ^                                        ^

|--->--->--->---|----------- SYN ------------->--->--->---|

|---

|--->--->--->---|----------- ACK ------------->--->--->---|

|              |                                        |

|              |

|              |                                        |

|--->- PSH ->---|

|              |                                        |

二 在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

Keepalived 的详细介绍:请点这里

Keepalived 的下载地址:请点这里

linux tcp keepalive,Linux下TCP的Keepalive相关参数学习相关推荐

  1. RedHat Linux AS 5.3 下DNS的配置步骤----为学习Oracle网络管理埋下伏笔

    转载请注明出处:http://blog.csdn.net/guoyjoe/article/details/16982179 RedHat Linux AS 5.3 下DNS的配置与RedHat Lin ...

  2. linux tcp前景,linux – 为什么在Xen下TCP接受()性能如此糟糕?

    在Xen下,我的服务器可以接受()新的传入TCP连接的速度非常糟糕.裸机硬件上的相同测试显示3-5倍的加速. >在Xen下怎么会这么糟糕? >您是否可以调整Xen以提高新TCP连接的性能? ...

  3. Linux下Tcp保活时间默认多少,C/C++网络编程中的TCP保活

    在默认的情况下,TCP连接是没有保活的心跳的.这就是说,当一个TCP的socket,客户端与服务端谁也不发送数据,会一直保持着连接.这其中如果有一方异常掉线,另一端永远也不可能知道.这对于一些服务型的 ...

  4. linux tcp 断线检测,CentOS下TCP断线监测

    TCP正常的断开,通信双方(服务端和客户端)都是能知道的.但是非正常的断开,比如直接拔掉了网线,就只能靠如下两种方法,实现短时间内的检测. 一,心跳包机制 心跳包机制,是网游设计中的常用机制.从用户层 ...

  5. Linux下TCP最大连接数受限问题

    一. 文件数限制修改 1.用户级别 查看Linux系统用户最大打开文件限制: # ulimit -n 1024 (1) vi /etc/security/limits.conf mysql soft ...

  6. linux下TCP通信简单实例

    linux下TCP通信简单实例 基于TCP(面向连接)的socket编程,分为服务器端和客户端 服务器端的流程如下: (1)创建套接字(socket) (2)将套接字绑定到一个本地地址和端口上(bin ...

  7. LINUX 下tcp 和 udp 套接字收发缓冲区的大小决定规则 .

    const int udp_recvbufsize = 384 * 1024 ; int result = ::setsockopt(m_hSocket, SOL_SOCKET, SO_RCVBUF, ...

  8. linux tcp 多路复用,linux下 C++ 使用 epoll 多路复用 实现高性能的tcpserver

    linux系统中,实现socket多路复用的技术有select .poll .epoll 等多种方式.这些不同方式个有优缺点和适用场景,这不是本文讨论的重点,又兴趣的可以自己搜索学习一下.但是在高并发 ...

  9. linux tcp文件分包_畅谈linux下TCP(下)

    三.TCP传输阶段 1 .TCP 包头 先认识一下TCP包头, 常规TCP包头为20个字节. 图一.png 可以通过TCP OPTION 扩展包头内容.TCP OPTION 是一个比较灵活的TLV结构 ...

最新文章

  1. shell中循环安装软件包
  2. 利用python进行数据分析 百度云-利用Python进行数据分析 原书第2版.pdf
  3. contos LINUX搭建LAMP笔记
  4. 【正一专栏】疯狂溢价的转会市场,中国足球最奇葩
  5. Java使用BTrace动态替换线上class文件
  6. 建标库标准怎么导出pdf_保存和导出PDF文档,这款OCR文字识别软件能做到
  7. 网易裁员事件,除了气愤,我们还该思考些什么?
  8. Linux压缩那些事
  9. 如何建议一个数据库内的定时任务
  10. java脚本含义_set -e在bash脚本中的含义是什么?
  11. 摩托罗拉再裁员!仍坚守模块化手机业务
  12. 科学网—语音识别技术发展史
  13. ZOJ 1654 二分匹配基础题
  14. 浅谈c语言函数调用指针
  15. linux卸载jdk方法
  16. 2018年第九届蓝桥杯决赛JAVA B 题解(全)
  17. 对数的matlab代码,Matlab的对数
  18. Javascript基础语法总结
  19. Banner本地图片轮播图
  20. JAVA漫天星星之菱形

热门文章

  1. Prompt learning 教学[进阶篇]:简介Prompt框架并给出自然语言处理技术:Few-Shot Prompting、Self-Consistency等;项目实战搭建知识库内容机器人
  2. QML AbstractButton | Button | ButtonGroup | Action
  3. python svg2rlg,Convert SVG to PNG with Python on Windows
  4. Java实验5 -- 银行计算利息
  5. docker 监控报警以及日志分析
  6. ts 格式化日期输出
  7. Android NDK使用之--用pthread实现多线程
  8. python合并excel相同元素的不同数据,python 合并多张excel 处理重复数据
  9. 大数据系列-CDH环境中SOLR入数据
  10. FlashBack闪回技术