大话keepalive

大话keepalive

我们说到keepalive的时候,需要先明确一点,这个keepalive说的是tcp的还是http的。

tcp的keepalive是侧重在保持客户端和服务端的连接,一方会不定期发送心跳包给另一方,当一方端掉的时候,没有断掉的定时发送几次心跳包,如果间隔发送几次,对方都返回的是RST,而不是ACK,那么就释放当前链接。设想一下,如果tcp层没有keepalive的机制,一旦一方断开连接却没有发送FIN给另外一方的话,那么另外一方会一直以为这个连接还是存活的,几天,几月。那么这对服务器资源的影响是很大的。

http的keep-alive一般我们都会带上中间的横杠,普通的http连接是客户端连接上服务端,然后结束请求后,由客户端或者服务端进行http连接的关闭。下次再发送请求的时候,客户端再发起一个连接,传送数据,关闭连接。这么个流程反复。但是一旦客户端发送connection:keep-alive头给服务端,且服务端也接受这个keep-alive的话,两边对上暗号,这个连接就可以复用了,一个http处理完之后,另外一个http数据直接从这个连接走了。

tcp层的keepalive

tcp的keepalive就是为了检测链接的可用性。主要调节的参数有三个:

  • tcp_keepalive_time // 距离上次传送数据多少时间未收到判断为开始检测
  • tcp_keepalive_intvl // 检测开始每多少时间发送心跳包
  • tcp_keepalive_probes // 发送几次心跳包对方未响应则close连接

基本上的流程:

在客户端和服务端进行完三次握手之后,客户端和服务端都处在ESTABLISH状态,这个时候进行正常的PSH和ACK交互,但是一旦一方服务中断了,另一方在距离上次PSH时间tcp_keepalive_time发现对方未发送数据,则开始心跳检测。心跳检测实际就是发送一个PSH的空心跳包,这里说的空心跳包就是包的数据为空,但是TCP包的头部的数据和标识和正常包一样。如果这个包获取到的是RST返回的话,下面就会继续每隔tcp_keepalive_intval的时长发送一个空心跳包,如果tcp_keepalive_probes次心跳包对方都是返回RST而不是ACK,则心跳发起方就判断这个连接已经失效,主动CLOST这个连接。

这三个参数可以每个TCP连接都不同,使用tcp设置变量的函数可以设置当前tcp连接的这三个对应的值。

int setsockopt(int s, int level, int optname,
                 const void *optval, socklen_t optlen)

tcp层的keepalive会在两个场景下比较有用

检测连接的一方是否断了

这里说的连接的一方是否断了包含几种情况:

  • 连接一方服务中止
  • 网络不好导致的服务长时间无响应
  • 连接一方服务重启中

结合这三种方式就很好理解为什么会有 tcp_keepalive_time, tcp_keepalive_intval, tcp_keepalive_probes三种的设置了。如果是对方服务器进行重启的时候,我们不能根据一次的tcp返回重置信号就判定这个连接失效。相反的,重启之后,这个心跳包一旦正常,这个连接仍然可以继续使用。

防止因为长时间不用链接导致连接失效

这个往往在代理或者内网状况下会使用到。一般NAT网络为了资源,会和外网保持一定的资源连接数,而且采用的是淘汰机制,淘汰掉旧的,不用的连接,创建和使用新的连接。如果我们没有心跳检测机制,那么我们的连接在一段时间没有使用的时候,NAT对外的机制会判断对应的对外网络是无用的,淘汰掉旧的,即使这个时候客户端和服务端都还正常服务着,只是长时间未联络了而已。keepalive的机制由于有定时心跳包,自然就能解决这个问题了。

http层的keep-alive

http层有个keep-alive, 它主要是用于客户端告诉服务端,这个连接我还会继续使用,在使用完之后不要关闭。

这个设置会影响web服务的哪几个方面呢?

性能

这个设置首先会在性能上对客户端和服务器端性能上有一定的提升。很好理解的是少了TCP的三次握手和四次挥手,第二次传递数据就可以通过前一个连接直接进行数据交互了。当然会提升服务性能了。

服务器TIME_WAIT的时间

由于HTTP服务的发起方一般都是浏览器,即客户端。但是先执行完逻辑,传输完数据的一定是服务端。那么一旦没有keep-alive机制,服务端在传送完数据之后会率先发起连接断开的操作。由于TCP的四次挥手机制,先发起连接断开的一方会在连接断开之后进入到TIME_WAIT的状态达到2MSL之久。设想,如果没有开启HTTP的keep-alive,那么这个TIME_WAIT就会留在服务端,由于服务端资源是非常有限的,我们当然倾向于服务端不会同一时间hold住过多的连接,这种TIME_WAIT的状态应该尽量在客户端保持。那么这个http的keep-alive机制就起到非常重要的作用了。

所以

基本上基于这两个原因,现在的浏览器发起web请求的时候,都会带上connection:keep-alive的头了。

总结

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

时间: 2024-10-15 20:36:28

大话keepalive的相关文章

在C#中利用Keep-Alive处理Socket网络异常断开的方法

断开|网络 最近我负责一个IM项目的开发,服务端和客户端采用TCP协议连接.服务端采用C#开发,客户端采用Delphi开发.在服务端开发中我碰到了各种各样的网络异常断开现象.在处理这些异常的时候有了一些心得,现在写出来和大家分享一下. 那网络异常断开原因主要有那些呢?归纳起来主要有以下两种: 1.客户端程序异常. 对于这种情况,我们很好处理,因为客户端程序异常退出会在服务端引发ConnectionReset的Socket异常(就是WinSock2中的10054异常).只要在服务端处理这个异常就可

ASP.NET Pre-Compilation and Keep-Alive

asp.net ASP.NET Pre-Compilation and Keep-Alive 1.Pre-Compilation in Whidbey ASP.NET一大特色就是Dynamic Compilation,但是有些场合Pre-Compilation却是更好的选择,比如,你不想访问你的站点的第一个用户痴痴的等待,或者你根本不想把任何源码(包括HTML的内容)给你的用户. Pre-Compilation在ASP.NET 2.0中支持得很彻底,你可以选择In-Place Pre-Compi

tcp连接探测Keepalive和心跳包

采用TCP连接的C/S模式软件,连接的双方在连接空闲状态时,如果任意一方意外崩溃.当机.网线断开或路由器故障,另一方无法得知TCP连接已经失效,除非继续在此连接上发送数据导致错误返回.很多时候,这不是我们需要的.我们希望服务器端和客户端都能及时有效地检测到连接失效,然后优雅地完成一些清理工作并把错误报告给用户. 如何及时有效地检测到一方的非正常断开,一直有两种技术可以运用.一种是由TCP协议层实现的Keepalive,另一种是由应用层自己实现的心跳包. TCP默认并不开启Keepalive功能,

大话VPS0.2-VPS/VPD的傻瓜式LNMP安装

开篇 话说VPS远程连接控制入门后很多像笔者一样的小菜鸟就开始磨刀霍霍了,接下在就是那动人心魄的LNMP一键安装的过程了希望大家给个掌声啊.还有你们VPS达人.高手就不要看了,毕竟我也是垃圾一个.这里以host1free的永久免费VPS也参考演示,一下只介绍了Linux VPS的安装教程. 登入 一般Linux VPS的登入用SSH或者SFTP不过本次安装用SFTP显然太过笨拙而且不方便.下面就以putty来演示Linux VPS的LNMP一键安装教程,希望大家好好看着. 点击打开即可 进入SS

Linux下关于keepalive的内核参数说明

  tcp_keepalive_time - INTEGER 在连接被标记为需要keepalive后,最后数据被发送和第一个keepalive探测包的间隔. 默认值: 2hours. tcp_keepalive_probes - INTEGER 在决定连接被断掉,通知应用层前,发送keepalive探测包的次数. 默认值: 9. tcp_keepalive_intvl - INTEGER 在keepalive探测包开始后,探测包每隔多长时间发送一次. 默认值: 75s 根据上述参数来看,如果一个

《大话Oracle Grid:云时代的RAC》——1.3 环境准备

1.3 环境准备 大话Oracle Grid:云时代的RAC RAC的环境准备可以分成4个方面:主机.用户.存储和网络.在准备阶段中,Oracle 11.2和10.2 RAC之间最重要的区别体现在用户这一方面.在Oracle 11.2之前的版本中,只需要创建一个用户oracle和一个用户组dba.而在Oracle 11.2中,需要创建两个操作系统用户oracle和grid,以及至少4个操作系统用户组.这么做的原因会在后面的章节中介绍. 1.3.1 主机环境 主机环境包括硬件环境.软件环境,硬件中

大话设计模式系列

原文:大话设计模式系列 1.设计模式之前奏(UML类图) 2.设计模式之一(单例模式) 3.设计模式之二(简单工厂模式) 4.设计模式之三(工厂方法模式) 5.设计模式之四(抽象工厂模式第一回合) 6.设计模式之四(抽象工厂模式 第二回合) 7.设计模式之四(抽象工厂模式 第三回合) 8.设计模式原则(单一.开放封 闭.里氏代换.依赖倒转.迪米特法则五大原则) 9.设计模式之五(策略模式) 10.设计模式之六(装饰模式) 11.设计模式之七(代理模式) 12.设计模式之八(原型模式) 13.设计

大话设计模式之外观模式

        年年作品展,岁岁不同样,鹅黄新绿涟漪泛起思想的火花却不尽相同,十期的作品展,从13年3月20号开始到完美落幕,时至今日,她已经在我的记忆中成为过去,这朵小小的浪花激起的涟漪渐渐褪去,也许已没有也许,但那抹如琉璃般的记忆也在这片平静中渐渐凝成永恒.当再次凝眸十一期的那群孩子,笑意浅浅,心事微澜.今天是十一期作品展的日子,看到她们多像去年的我,揣测激情与梦想来到这淡紫色蒲公英飞舞的土地.昨天晚上抽空去看了看十一期的作品展彩排,彩排的过程中,有五彩的灯光,有展示作品的大屏幕,投影仪,还

大话设计模式之建造者模式

        盘古开辟了天地,用身躯造出日月星辰.山川草木.那残留在天地间的浊气慢慢化作虫鱼鸟兽,为这寂静的世界增添了生气.这时,有一位女神女娲,在这莽莽的原野上行走.她放眼四望,山岭起伏,江河奔流,丛林茂密,草木争辉,天上百鸟飞鸣,地上群兽奔驰,水中鱼儿嬉戏,草中虫之豸跳跃,这世界按说也点缀得相当美丽了.但是她总觉得有一种说不出的寂寞,越看越烦,孤寂感越来越强烈,连自己也弄不清楚这是为什么.与山川草木诉说心中的烦躁,山川草木根本不懂她的话:对虫鱼鸟兽倾吐心事,虫鱼鸟兽哪能了解她的苦恼.