keep是什么意思(TCP长连接和HTTP长连接)?
admin
2023-08-28 22:06:26

TCP的keepalive和HTTP的KeepAlive是完全不同的概念,不能混淆。

先下结论:TCP的KeepAlive是如何在连接处于建立状态时检测连接的可用性。而HTTP的keep-alive讲的是如何避免重复TCP三次握手和四次挥手。

以下是详细的解释。

一、TCP长连接(KeepAlive)

TCP长连接是一种保持TCP连接的机制。当TCP连接建立后,TCPKeepAlive使能端将启动一个定时器。当定时器到达0时,将发出一个TCP探测包。这个TCP探测包是一个纯ACK包,但是它的Seq与前一个包重复。

打个比喻,TCPKeepAlive是这样的:

一个TCP连接的两端就像两个人,彼此保持通信(建立TCP连接)。如果他们经常通信(经常发送TCP数据),那么这个TCP连接就自然建立了。但如果两个人只是偶尔交流。然后其中一个人(或者同时两个人)想知道对方是否还在,会定时发邮件(KeepAlive探测包)。这封邮件没有实质性内容,只是问对方是否还在。如果对方收到,会回复还在(对这个探测包的ACK响应)。

需要注意的是,keepalive技术只是TCP技术中的一个选项。因为不正确的配置可能会导致诸如正在使用的TCP连接被提前关闭之类的问题,例如在短暂的故障期间,它们可能会导致良好的连接被丢弃,所以默认是关闭的.

二、TCPKeepAlive相关配置

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

Tcp_keepalive_time7200//距离上次发送数据已经有多久了,没有收到新的消息?判断开始检测,单位为秒,默认为7200s(2小时)。tcp_keepalive_intvl75//每次检测开始时,发送心跳包,单位为秒。默认情况下,75stcp_keepalive_probes9//发送多次,心跳包方没有响应,连接关闭。默认情况下,9次,在Linux操作系统中,与TCPKeepAlive相关的配置可以在/proc/sys/net/ipv4/:

更多/proc/sys/net/IP v4/TCP _ keepalive _ *

Tcp_KeepAlive_time是指Tcp协议栈在相应的空闲时间(以秒为单位)后发送KeepAlive探测包;tcp_keepalive_intvl的含义是探针启动后每个探针包之间的时间间隔,单位也是秒;Tcp_keepalive_probes是探测数据包的数量。

三、HTTP长连接(KeepAlive)

在HTTP1.0时代,每个TCP连接只会被一个HTTPTransaction使用。之后,TCP连接将被关闭。当网页内容越来越复杂,包括大量图片、CSS等资源时,这种模式效率太低。因此,在HTTP1.1中,引入了HTTPpersistentconnection的概念,也称为HTTPkeep-alive(以下简称HTTP长连接)。

keep-alive属性保持连接的时间长度由服务器决定,配置通常是几十秒左右。

TCP连接建立后,HTTP协议使用TCP传输HTTP协议的请求和响应数据。一个完整的HTTP事务如下:

这个图简化了HTTP(Req)和HTTP(Resp)。事实上,请求和响应需要多个TCP消息。

从图中我们可以发现一个完整的HTTP事务,由连接建立、请求发送、响应接收、断开连接四个过程组成。在早期,通过HTTP协议传输的数据主要是文本,一个请求可能会获取所有要返回的数据。但是现在显示一个完整的页面需要很多请求,比如图片,JS,CSS等。如果每个HTTP请求都需要创建和断开一个TCP,那么这种开销是完全没有必要的。

开启HTTPkeep-alive之后,能复用已有的TCP连接。

当前请求已被响应,服务器不会立即关闭TCP连接,而是等待一段时间,接收浏览器可能发送的第二个请求。通常,浏览器会在第一个请求返回后立即发送第二个请求。如果一次只有一个连接,同一TCP连接处理的请求越多,打开KeepAlive可以节省的TCP设置和关闭成本就越多。

当然,通常会启用多个连接向服务器请求资源,但启用keep-alive后,仍然可以加快资源的加载速度。HTTP/1.1之后默认开启Keep-alive,在HTTP的头字段中增加了连接选项。当设置为Connection:keep-alive时,表示打开,设置为Connection:clo。

se表示关闭。


四、TCPKeepAlive与HTTPKeep-Alive比较

TCP的keepalive是侧重在保持客户端和服务端的连接,一方会不定期发送心跳包给另一方,没有断掉一方的定时发送几次心跳包。如果间隔发送几次,对方都返回的是RST,而不是ACK,那么就释放当前连接。

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是在ESTABLISHED状态的时候,双方如何检测连接的可用性。而HTTP的keep-alive说的是如何避免进行重复的TCP三次握手和四次挥手的环节。

相关内容

热门资讯

金花创建房间/微信金花房卡怎么... 1.微信渠道:(荣耀联盟)大厅介绍:咨询房/卡添加微信:88355042 2.微信游戏中心:打开微...
金花房间卡/金花房卡如何购买/... 金花房间卡/金花房卡如何购买/新超圣金花房卡正版如何购买新超圣是一款非常受欢迎的游戏,咨询房/卡添加...
牛牛创建房间/金花房卡批发/神... 微信游戏中心:神牛大厅房卡在哪里买打开微信,添加客服【88355042】,进入游戏中心或相关小程序,...
链接牛牛/牛牛房卡游戏代理/鸿... 鸿运大厅房卡更多详情添加微:33549083、 2、在商城页面中选择房卡选项。 3、根...
科技实测!牛牛房卡怎么获得/乐... 微信游戏中心:乐酷大厅房卡在哪里买打开微信,添加客服【88355042】,进入游戏中心或相关小程序,...