`

什么是TCP keepalive

阅读更多

keep tcp alive,从字面上看,它能够检测你的 TCP socket  并检测连接是否在运行或者是否已经被破坏。

keepalive概念很简单:当建立一个TCP连接时,你将一系列的定时器与该连接相关联。这些定时器中某些用于处理keepalive过程。当keepalive定时器变为0时,你给你的同伴(也就是对方)发送一个keepalive 探针包(probe packet),包内没有数据并且ACK标识打开。另一方面,你会收到一个来自远方主机的回应,该回应没有数据并且设置ACK标识。

 如果你收到一个对于你的keepalive探针的响应,那么就说明连接正在运行,不必担心用户级别的实现。事实上,TCP允许你控制流,没有包及零长度的数据包对于用户程序而言没有危险。

这个过程是有用的。因为如果其他主机失去连接,你就可以注意到连接时断开的。如果keepalive探针没有被响应,那么就可以断言连接不能被认为是有效的,那么就需要采取正确的操作。

整个keepalive过程很简单,就是client给server发送一个包,server返回给用户一个包。注意包内没有数据,只有ACK标识 被打开。这就有点像小情侣聊QQ,常常是小女生向小男生发送一个窗口抖动,男生再给小女生发送一个窗口抖动,这就说明对方在呢,那就继续下面的聊天。如果 男生不发送,那么聊天中止。

为什么使用TCP keepalive

没有keepalive依旧生活很美好,不过既然你在读这篇文章,那就说明你在尝试keepalive是否能解决你现在的问题。

keepalive是无攻击性的,不过它会产生多余的网络带宽,这就会对于路由和防火墙产生影响。

接下来,我们会区别keepalive的两项任务:

  • checking for dead peers
  • Preventing disconnection due to network inactivity

检测dead peers

Keepalive can be used to advise you when your peer dies before it is able to notify you. This could happen for several reasons, like kernel panic or a brutal termination of the process handling that peer. Another scenario that illustrates when you need keepalive to detect peer death is when the peer is still alive but the network channel between it and you has gone down. In this scenario, if the network doesn't become operational again, you have the equivalent of peer death. This is one of those situations where normal TCP operations aren't useful to check the connection status.

Think of a simple TCP connection between Peer A and Peer B: there is the initial three-way handshake, with one SYN segment from A to B, the SYN/ACK back from B to A, and the final ACK from A to B. At this time, we're in a stable status: connection is established, and now we would normally wait for someone to send data over the channel. And here comes the problem: unplug the power supply from B and instantaneously it will go down, without sending anything over the network to notify A that the connection is going to be broken. A, from its side, is ready to receive data, and has no idea that B has crashed. Now restore the power supply to B and wait for the system to restart. A and B are now back again, but while A knows about a connection still active with B, B has no idea. The situation resolves itself when A tries to send data to B over the dead connection, and B replies with an RST packet, causing A to finally to close the connection.

Keepalive can tell you when another peer becomes unreachable without the risk of false-positives. In fact, if the problem is in the network between two peers, the keepalive action is to wait some time and then retry, sending the keepalive packet before marking the connection as broken.

暂不翻译,先看看。

01 _____                                                     _____
02 |     |                                                   |     |
03 |  A  |                                                   |  B  |
04 |_____|                                                   |_____|
05    ^                                                         ^
06    |--->--->--->-------------- SYN -------------->--->--->---|
07    |---<---<---<------------ SYN/ACK ------------<---<---<---|
08    |--->--->--->-------------- ACK -------------->--->--->---|
09    |                                                         |
10    |                                       system crash ---> X
11    |
12    |                                     system restart ---> ^
13    |                                                         |
14    |--->--->--->-------------- PSH -------------->--->--->---|
15    |---<---<---<-------------- RST --------------<---<---<---|
16    |                                                         |

阻止因网络连接不活跃

阻止因网络连接不活跃(长时间没有数据包)而导致的连接中断,说的是,很多网络设备,尤其是NAT路由器,由于其硬件的限制(例如内存、CPU处理 能力),无法保持其上的所有连接,因此在必要的时候,会在连接池中选择一些不活跃的连接踢掉。典型做法是LRU,把最久没有数据的连接给T掉。通过使用 TCP的KeepAlive机制(修改那个time参数),可以让连接每隔一小段时间就产生一些ack包,以降低被T掉的风险,当然,这样的代价是额外的 网络和CPU负担。

01 _____           _____                                     _____
02 |     |         |     |                                   |     |
03 |  A  |         | NAT |                                   |  B  |
04 |_____|         |_____|                                   |_____|
05    ^               ^                                         ^
06    |--->--->--->---|----------- SYN ------------->--->--->---|
07    |---<---<---<---|--------- SYN/ACK -----------<---<---<---|
08    |--->--->--->---|----------- ACK ------------->--->--->---|
09    |               |                                         |
10    |               | <--- connection deleted from table      |
11    |               |                                         |
12    |--->- PSH ->---| <--- invalid connection                 |
13    |               |                                         |
分享到:
评论

相关推荐

    linux tcp keepalive存活代码设置

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

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

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

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

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

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

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

    W5500 Keepalive 应用笔记

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

    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连接上,即使在长时间无数据交换的情况下,也能检测到连接是否仍然有效。这在服务器与客户端通信中尤其重要,因为如果...

    springboot-keepalive设置测试

    对于keepalive,我们需要关注`keep-alive-timeout`属性,它设定了在服务器关闭空闲连接之前等待新请求的时间。 例如,我们可以在`application.properties`或`application.yml`文件中添加以下配置: ```properties ...

    WinSock_TCP_keepalive.zip_ keepalive_Keepalive_select recv_tcp

    设置好keepalive以后,我们通过实验来看看当client异常退出或是网络断掉的情况下,keepalive怎么通知我们异常断开的情况。这里采用select模式,实验环境为XP系统和Win7系统,几种情况返回值如下: 1. 正常断开 ...

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

    TCP协议的KeepAlive机制与HeartBeat心跳包.docx

    KeepAlive

    判定断开前的KeepAlive探测次数

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

    Delphi之TClientSocket和TServerSocket进行TCP长连接通讯使用KeepAlive自动发送心跳包检测断网

    Delphi之TClientSocket和TServerSocket进行TCP长连接通讯,使用KeepALive自动发送心跳包检测断网,并实现断线重连,经测试可以及时检测到拔掉网线断网情况,具有较高的参考价值

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

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

    keepalive--aarch64.rar

    “keepalive”是一个广泛使用的网络概念,主要涉及TCP/IP协议栈中的机制。在TCP连接中,Keepalive机制用于保持长时间无数据传输的连接活跃。当两个通信节点之间建立了一个TCP连接后,如果有一段时间没有数据交换,...

    怎样及时检测出非正常断开的TCP连接.DOC

    首先定义一个结构体 TCP_KEEPALIVE,用于存储 KeepAlive 的配置信息。然后,使用 WSAIoctl 函数将 KeepAlive 配置信息发送到 Socket 中。在 Linux 平台下,可以使用 setsockopt 函数来设置 KeepAlive 探测。 在使用...

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

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

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

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

    keepalive中文文档

    从提供的信息来看,"keepalive中文文档"很可能是关于TCP的`Keepalive`机制以及Keepalived软件的详细指南。这份文档对于理解网络连接的维护、提高系统可靠性,特别是对于需要搭建高可用服务的IT从业者来说,是一份...

    VC TCP多连接

    首先,让我们理解什么是Winsock。Winsock是Windows操作系统提供的一个API(应用程序编程接口),用于实现TCP/IP协议栈。它使得开发者能够编写与平台无关的网络应用程序,支持各种网络协议,包括TCP。 在VC++中实现...

Global site tag (gtag.js) - Google Analytics