精华内容
下载资源
问答
  • TCP keepalive机制分析

    2019-07-29 00:29:02
    如果打开这个功能特性,如果一条已建立的TCP连接一段时间没有收到报文,就会开始发送TCP keepalive报文,如果keepalive报文多次没有获得响应,则判定连接的对端已经断开,本地协议栈会将连接关闭。 TCP keepalive...

    TCP keepalive是由TCP协议栈提供的连接存活性检测功能。如果打开这个功能特性,如果一条已建立的TCP连接一段时间没有收到报文,就会开始发送TCP keepalive报文,如果keepalive报文多次没有获得响应,则判定连接的对端已经断开,本地协议栈会将连接关闭。

    TCP keepalive一般用于服务器软件中,目的是避免客户端异常断开连接造成服务端大量无效连接残留,消耗过多资源。

    TCP标准

    虽然TCP keepalive在几乎所有主流协议栈(Windows、Linux、BSD)中都有支持,但它并不是TCP标准的一部分,而是由协议栈实现者提供的扩展实现,在RFC1122《Requirements for Internet Hosts -- Communication Layers》中讨论了keepalive未能成为TCP协议标准的原因,以及实现此功能时必须遵守的基本条件。

    TCP协议制定者认为keepalive机制不应该成为TCP标准的一部分,主要原因如下:

    (1)可能由于暂时的网络故障破坏可以继续正常工作的连接;

    (2)消耗不必要的带宽(如果没人用这个连接,它到底是否有效根本无所谓)

    (3)如果网络链路按报文数收费会产生额外的费用

    从今天看来上述原因几乎是可以忽略不计的,与大量无效却永远存在的连接造成的存储与计算开销相比,几个额外的keepalive报文的代价可以忽略。但仍然有人认为如果想要发现无效连接,应该由应用层协议来实现这个探测和关闭的功能。笔者认为,从逻辑上说TCP作为可靠传输协议,能够自行发现无效传输连接并汇报错误也是符合协议定位的,从工程角度来说在更底层实现一个通用功能也能减轻上层实现复杂度。

    实现规范

    由于TCP keepalive没有标准规范,因此不同的协议栈对其实现有一定的差异,RFC1122提出了实现keepalive功能必须满足的基本要求:

    (1)keepalive功能必须在连接粒度可开关,并且必须默认关闭

    (2)keepalive包只能在一段时间没有收到数据报文后发送,这个时间间隔必须是可配置的,且默认长度不能短于2小时

    (3)由于不含载荷的ACK分段是不保证可靠传输的,因此keepalive机制不能通过一次检测没收到回应就判定连接失效

    标准的TCP keepalive报文应当将seq置为SND.NXT-1,并不包含任何载荷。但由于部分TCP协议栈实现有问题,不能响应这样的keepalive报文,因此也允许发送的keepalive报文中携带1个字节的无效数据来触发对端回应ACK,一般填0。

    linux内核协议栈实现

    linux内核协议栈实现了TCP keepalive功能,通过setsockopt(..., SO_KEEPALIVE, ...)接口来打开或关闭。对于keepalive检测时延、检测报文间隔长度、检测报文数量,linux提供了内核和socket两个级别的配置。

    内核的配置为:

    net.ipv4.tcp_keepalive_time = 7200

    net.ipv4.tcp_keepalive_intvl = 75

    net.ipv4.tcp_keepalive_probes = 9 

    socket的配置为:

    setsockopt(..., TCP_KEEPIDLE, ...)

    setsockopt(..., TCP_KEEPINTVL, ...)

    setsockopt(..., TCP_KEEPCNT, ...)

    在4.9内核中,keepalive功能在tcp_keepalive_timer函数中实现。通过tcp_write_wakeup函数发送keepalive检测报文,如果多次没有收到回应,调用tcp_send_active_reset发送一个RST报文并产生一个ETIMEDOUT错误。最后发送检测报文的函数是tcp_xmit_probe_skb,可以看到其中将报文seq设置为snd_una - 1,且不包含载荷。

    展开全文
  • crypto isakmp keepalive

    千次阅读 2013-10-19 15:33:06
    建议两端都启用,虽然都说这个机制是协商的,但如果一端没有启用,则未启用端收到对端的keepalive后,仍然会发送keepalive报文,但不会主动发送,因为没有配置这个功能。当发送报文后没有在2s内收到回复,则认为vpn...

    建议两端都启用,虽然都说这个机制是协商的,但如果一端没有启用,则未启用端收到对端的keepalive后,仍然会发送keepalive报文,但不会主动发送,因为没有配置这个功能。当发送报文后没有在2s内收到回复,则认为vpn不可用,并清除前两个阶段的sa,但没有启用功能的一端不会清除SA。而按需发送DPD的模式是在加密数据发送后10s没有收到回应才发送DPD进行检测,从而节约资源,也就是说,如果已经建立好的vpn在没有普通加密流传输时,即使中间物理设备down,这两端也不会发现,直到再次传输加密数据没有得到回应时才会清除记录。

    展开全文
  • KeepAlive

    2020-01-21 16:50:49
    什么是KeepAlive? 首先,我们要明确我们谈的是TCP的 KeepAlive 还是HTTP的 Keep-Alive。TCP的KeepAlive和HTTP的Keep-Alive是完全不同的概念,不能混为一谈。实际上HTTP的KeepAlive写法是Keep-Alive,跟TCP的...

    什么是KeepAlive?

    首先,我们要明确我们谈的是TCPKeepAlive 还是HTTPKeep-Alive。TCP的KeepAlive和HTTP的Keep-Alive是完全不同的概念,不能混为一谈。实际上HTTP的KeepAlive写法是Keep-Alive,跟TCP的KeepAlive写法上也有不同。

    • TCP的keepalive是侧重在保持客户端和服务端的连接,一方会不定期发送心跳包给另一方,当一方端掉的时候,没有断掉的定时发送几次心跳包,如果间隔发送几次,对方都返回的是RST,而不是ACK,那么就释放当前链接。设想一下,如果tcp层没有keepalive的机制,一旦一方断开连接却没有发送FIN给另外一方的话,那么另外一方会一直以为这个连接还是存活的,几天,几月。那么这对服务器资源的影响是很大的。
    • HTTP的keep-alive一般我们都会带上中间的横杠,普通的http连接是客户端连接上服务端,然后结束请求后,由客户端或者服务端进行http连接的关闭。下次再发送请求的时候,客户端再发起一个连接,传送数据,关闭连接。这么个流程反复。但是一旦客户端发送connection:keep-alive头给服务端,且服务端也接受这个keep-alive的话,两边对上暗号,这个连接就可以复用了,一个http处理完之后,另外一个http数据直接从这个连接走了。减少新建和断开TCP连接的消耗。

    二者的作用简单来说:

    HTTP协议的Keep-Alive意图在于短时间内连接复用,希望可以短时间内在同一个连接上进行多次请求/响应。

    TCP的KeepAlive机制意图在于保活、心跳,检测连接错误。当一个TCP连接两端长时间没有数据传输时(通常默认配置是2小时),发送keepalive探针,探测链接是否存活。

    总之,记住HTTP的Keep-Alive和TCP的KeepAlive不是一回事。

    tcp的keepalive是在ESTABLISH状态的时候,双方如何检测连接的可用行。而http的keep-alive说的是如何避免进行重复的TCP三次握手和四次挥手的环节。

    TCP的KeepAlive

    1.为什么要有KeepAlive?

    在谈KeepAlive之前,我们先来了解下简单TCP知识(知识很简单,高手直接忽略)。首先要明确的是在TCP层是没有“请求”一说的,经常听到在TCP层发送一个请求,这种说法是错误的。

    TCP是一种通信的方式,“请求”一词是事务上的概念,HTTP协议是一种事务协议,如果说发送一个HTTP请求,这种说法就没有问题。也经常听到面试官反馈有些面试运维的同学,基本的TCP三次握手的概念不清楚,面试官问TCP是如何建立链接,面试者上来就说,假如我是客户端我发送一个请求给服务端,服务端发送一个请求给我。。。

    这种一听就知道对TCP基本概念不清楚。下面是我通过wireshark抓取的一个TCP建立握手的过程。(命令行基本上用TCPdump,后面我们还会用这张图说明问题):

    TCP抓包

    现在我看只要看前3行,这就是TCP三次握手的完整建立过程,第一个报文SYN从发起方发出,第二个报文SYN,ACK是从被连接方发出,第三个报文ACK确认对方的SYN,ACK已经收到,如下图:

    TCP建立连接过程

    但是数据实际上并没有传输,请求是有数据的,第四个报文才是数据传输开始的过程,细心的读者应该能够发现wireshark把第四个报文解析成HTTP协议,HTTP协议的GET方法和URI也解析出来,所以说TCP层是没有请求的概念,HTTP协议是事务性协议才有请求的概念,TCP报文承载HTTP协议的请求(Request)和响应(Response)。

    现在才是开始说明为什么要有KeepAlive。链接建立之后,如果应用程序或者上层协议一直不发送数据,或者隔很长时间才发送一次数据,当链接很久没有数据报文传输时如何去确定对方还在线,到底是掉线了还是确实没有数据传输,链接还需不需要保持,这种情况在TCP协议设计中是需要考虑到的。

    TCP协议通过一种巧妙的方式去解决这个问题,当超过一段时间之后,TCP自动发送一个数据为空的报文给对方,如果对方回应了这个报文,说明对方还在线,链接可以继续保持,如果对方没有报文返回,并且重试了多次之后则认为链接丢失,没有必要保持链接。

    2.怎么开启KeepAlive?

    KeepAlive并不是默认开启的,在Linux系统上没有一个全局的选项去开启TCP的KeepAlive。需要开启KeepAlive的应用必须在TCP的socket中单独开启。Linux Kernel有三个选项影响到KeepAlive的行为:

    • tcp_keepalive_time 7200// 距离上次传送数据多少时间未收到新报文判断为开始检测,单位秒,默认7200s
    • tcp_keepalive_intvl 75// 检测开始每多少时间发送心跳包,单位秒,默认75s
    • tcp_keepalive_probes 9// 发送几次心跳包对方未响应则close连接,默认9次

    TCP socket也有三个选项和内核对应,通过setsockopt系统调用针对单独的socket进行设置:

    • TCPKEEPCNT: 覆盖 tcpkeepaliveprobes
    • TCPKEEPIDLE: 覆盖 tcpkeepalivetime
    • TCPKEEPINTVL: 覆盖 tcpkeepalive_intvl

    举个例子,以我的系统默认设置为例,kernel默认设置的tcpkeepalivetime是7200s, 如果我在应用程序中针对socket开启了KeepAlive,然后设置的TCP_KEEPIDLE为60,那么TCP协议栈在发现TCP链接空闲了60s没有数据传输的时候就会发送第一个探测报文。

    3. 需要注意,KeepAlive的不足和局限性

    其实,tcp自带的keepalive还是有些不足之处的。

    keepalive只能检测连接是否存活,不能检测连接是否可用。例如,某一方发生了死锁,无法在连接上进行任何读写操作,但是操作系统仍然可以响应网络层keepalive包。

    TCP keepalive 机制依赖于操作系统的实现,灵活性不够,默认关闭,且默认的 keepalive 心跳时间是 两个小时, 时间较长。

    代理(如socks proxy)、或者负载均衡器,会让tcp keep-alive失效

    基于此,我们旺旺需要加上应用层的心跳。这个需要自己实现,这里就不展开了。

    HTTP的Keep-Alive

    1. HTTP为什么需要Keep-Alive?

    通常一个网页可能会有很多组成部分,除了文本内容,还会有诸如:js、css、图片等静态资源,有时还会异步发起AJAX请求。只有所有的资源都加载完毕后,我们看到网页完整的内容。然而,一个网页中,可能引入了几十个js、css文件,上百张图片,如果每请求一个资源,就创建一个连接,然后关闭,代价实在太大了。

    基于此背景,我们希望连接能够在短时间内得到复用,在加载同一个网页中的内容时,尽量的复用连接,这就是HTTP协议中keep-alive属性的作用。

    • HTTP的Keep-Alive是HTTP1.1默认开启的功能。通过headers设置"Connection: close "关闭
    • 在HTTP1.0中是默认关闭的。通过headers设置"Connection: Keep-Alive"开启。

    对于客户端来说,不论是浏览器,还是手机App,或者我们直接在Java代码中使用HttpUrlConnection,只是负责在请求头中设置Keep-Alive。Keep-Alive属性保持连接的时间长短是由服务端决定的,通常配置都是在几十秒左右。

    TCP连接建立之后,HTTP协议使用TCP传输HTTP协议的请求(Request)和响应(Response)数据,一次完整的HTTP事务如下图:

    HTTP请求

     

    这张图简化了HTTP(Req)和HTTP(Resp),实际上的请求和响应需要多个TCP报文。
    从图中可以发现一个完整的HTTP事务,有链接的建立,请求的发送,响应接收,断开链接这四个过程,早期通过HTTP协议传输的数据以文本为主,一个请求可能就把所有要返回的数据取到,但是,现在要展现一张完整的页面需要很多个请求才能完成,如图片.JS.CSS等,如果每一个HTTP请求都需要新建并断开一个TCP,这个开销是完全没有必要的。

    开启HTTP Keep-Alive之后,能复用已有的TCP链接,当前一个请求已经响应完毕,服务器端没有立即关闭TCP链接,而是等待一段时间接收浏览器端可能发送过来的第二个请求,通常浏览器在第一个请求返回之后会立即发送第二个请求,如果某一时刻只能有一个链接,同一个TCP链接处理的请求越多,开启KeepAlive能节省的TCP建立和关闭的消耗就越多。

    当然通常会启用多个链接去从服务器器上请求资源,但是开启了Keep-Alive之后,仍然能加快资源的加载速度。HTTP/1.1之后默认开启Keep-Alive, 在HTTP的头域中增加Connection选项。当设置为Connection:keep-alive表示开启,设置为Connection:close表示关闭。

     

    链接:https://www.jianshu.com/p/9fe2c140fa52

    展开全文
  • BGP的5种消息报文

    2021-07-22 17:46:15
    2、KEEPALIVE 报文 用于邻居状态检查,确保TCP连接正常。 3、UPDATE 报文 用于路由的更新,BGP使用触发增量更新。 4、NOTIFICATION 报文 用于对出现错误状态时的提示消息。 5、ROUTEREFRESH 报文 用于发送路由更新...

    1、OPEN 报文
    相当于是HELLO报文,用于邻居发现。
    2、KEEPALIVE 报文
    用于邻居状态检查,确保TCP连接正常。
    3、UPDATE 报文
    用于路由的更新,BGP使用触发增量更新。
    4、NOTIFICATION 报文
    用于对出现错误状态时的提示消息。
    5、ROUTEREFRESH 报文
    用于发送路由更新请求,请求邻居重新发送路由。

    展开全文
  • BGP对等体间通过以下5种报文进行交互,其中Keepalive报文为周期性发送,其余报文为触发式发送: (1)Open报文:用于建立BGP对等体连接; Marker:标记 Length:长度 Type:数据包类型 Version:版本 My AS:本地AS...
  • BGP五种报文抓包解析

    千次阅读 2020-06-12 22:34:11
    2、Keepalive报文: 当双方通过Open报文携带的参数信息协商成功时,会回复一个keep alive报文以作确认 周期性的发送keep alive报文,用于刷新保活计时器,保持邻居关系 3、Update报文: 向对等体通过路由...
  • 从长链接说起 TCP是长链接的,也就是说连接建立后,及时数年没有...服务器为了探测对端是否还活着,于是每隔两小时发送一个keepalive报文(携带一个字节的Data)。个人觉得保活机制也就是在局域网中用用,路由器表...
  • (1)TCP在建链过程中收到异常报文时,会发送RST报文: 如在Listen状态时收到的SYN报文中有ACK...(4)KeepAlive报文在连续发送5次之后,都没有收到对端的KeeAliveReply报文时,会发送RST报文。 (5)当socket设置了L
  • Keepalive

    2017-02-14 10:48:00
    链接建立之后,如果应用程序或者上层协议一直不发送数据,或者隔很长时间才发送一次数据,当链接很久没有数据报文传输时如何去确定对方还在线,到底是掉线了还是确实没有数据传输,链接还需不需要保持,这种情况在...
  • 一、BGP的报文 1、Open报文:用于建立BGP对等体连接。...4、Keepalive报文:用于保持BGP连接。//保活报文(60s) 5、Route-refresh报文:用于在改变路由策略后请求对等体重新发送路由信息。只有支持路由刷新(Rou
  • HTTP的KeepAlive和TCP的KeepAlive区别

    千次阅读 2018-03-05 19:25:54
    1 Http的KeepAlive1.1 应用场景...,才能启用KeepAlive。http 1.1中默认启用KeepAlive,如果加入"Connection:close ",才关闭。1.2 语义解析若Http关闭KeepAlive,每个http请求都要求打开一个tcp sock...
  • tcp keepalive

    2020-01-18 09:36:22
    TCP_KEEPALIVE选项只是一个开关,Linux中默认的Keepalive的选项如下: $sudo sysctl -a | grep keepalive net.ipv4.tcp_keepalive_time = 7200 net.ipv4.tcp_keepalive_probes = 9 ...
  • 默认http1.1协议的请求头是默认开启keepalive,如...sk->keepalive_time 探测的心跳间隔,TCP链接在多少秒之后没有数据报文传输启动探测报文 sk->keepalive_intvl 探测间隔,未收到回复时,重试的时间间隔 默认配置查看
  • KeepAlive详解

    2020-02-19 16:08:45
    什么是KeepAlive? TCP的KeepAlive 1.为什么要有KeepAlive? 2.怎么开启KeepAlive? 3. 需要注意,KeepAlive的不足和局限性 HTTP的Keep-Alive 1. HTTP为什么需要Keep-Alive? 什么是KeepAlive? 首先,我们...
  • keepalive机制TCP keepalive概念在使用TCP长连接(复用已建立TCP连接)的场景下,需要对TCP连接进行保活,避免被网关干掉连接。在应用层,可以通过定时发送心跳包的方式实现。而Linux已提供的TCP KEEPALIVE,在应用...
  • Keepalive 是我们经常会讨论到的知识,也是程序员应该掌握的知识点。本文从实际的应用场景和源码的角度去讲解和分析 HTTP Keepalive 和 TCP Keepalive 的内容。 包括: HTTP Keepalive的使用场景 TCP Keepalive 的...
  • Keepalive介绍

    2021-07-21 18:29:47
    Keepalive是Linux下一个轻量级高可用解决方案。高可用(High Avaliability简称HA)就是主机的冗余和接管。 基本功能:心跳检测、资源接管、检测集群中的服务、在集群节点转移共享IP地址的所有者。 Keepalive主要是...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 14,873
精华内容 5,949
关键字:

keepalive报文