HTTP keep-alive、TCP Keep-Alive、心跳检测,傻傻分不清?

2023-11-06 09:40

本文主要是介绍HTTP keep-alive、TCP Keep-Alive、心跳检测,傻傻分不清?,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

大家都知道HTTP 1.0和HTTP 1.1的区别在于连接复用,表现在协议里就是HTTP 1.1的请求头中会多一个 Connection: keep-alive,但是具体如何进行连接复用的可能很多同学并不是很清楚,今天我就通过抓包来具体解析HTTP 1.1协议,跟大家一起来看看连接复用到底是怎么一回事,跟随这个过程,同样也回答下HTTP keep-alive、TCP Keep-Alive以及心跳检测之间的区别。

1 先来说说HTTP keep-alive

首先问大家一个问题:浏览器刷新页面,可能会同时有多个请求发往后端服务器,每一个请求都会使用一个连接吗?

如果是使用HTTP 1.1协议的话,答案是否定的,因为连接会复用,不同的请求可以使用同一个连接,那具体一点呢?

其实Chrome浏览器对于同一个后端服务器最多有6个连接的限制。也就是说,无论你刷新的页面同时有多少个AJAX请求,Chrome只会限制这些请求最多通过6个TCP连接来完成。

举个例子,一个页面有10个AJAX请求,你此时刷新页面,浏览器会限制这10个请求通过6个TCP连接完成,这样就会有4个请求复用之前的连接。这其实就是HTTP 1.1中的keep-alive概念,也就是说TCP连接的复用,就是HTTP的keep-alive。

那什么时候后4个请求能够复用之前的连接呢?答案是之间的连接完成了一次完整的Request/Response,这样TCP连接中就没有脏数据,后面的请求自然能够复用此连接了。

下面我们就来看看HTTP keep-alive的实际抓包例子(IP地址末位37为浏览器端,40为服务器端):

image.png

上图中序号为382和序号为451的两个请求,就复用了一个连接,在序号为451的请求包中,标记了该连接中的上一个请求是382,并且从抓的包中也能够看出下一个请求是在上一个请求完成完整的Request/Response之后才发出的。这里也能够看出HTTP 1.1协议是半双工的,同一时刻,数据只在一个方向上收或发。

上面就是HTTP keep-alive中的连接复用的实际情况。

2 TCP Keep-Alive是什么?与HTTP keep-alive有什么区别和联系?

TCP Keep-Alive是TCP的保活功能,用来探测连接对端是否存在,属于传输层的概念,主要用来检测并关闭异常连接。

它与HTTP keep-alive没有任何联系,这两个完全是不同的概念。上面讲到的多个HTTP请求能够复用同一个连接就是HTTP keep-alive的概念,属于应用层的概念。

所以它们两个完全是不同的概念。

3 浏览器和服务端之间的连接会一直保持吗?什么时候会关闭?

浏览器和服务端之间的连接如果一直保持会怎么样,答案是浪费资源,不仅仅会浪费服务端的资源,同样也会浪费客户端的资源,所以它们会在以下几种情况下关闭:

(1) 当Chrome浏览器关闭的时候,连接将会关闭,这属于客户端主动关闭连接的情况;

(2)当客户端长时间未操作,具体表现为连接长时间未传输数据的时候,服务端也会关闭连接,这属于服务端主动关闭的情况。

那么多长时间连接未传输数据,服务端就会关闭连接呢?这依赖于服务端的设置,如果服务端是Tomcat,keepAliveTimeout参数便是控制连接超时关闭的参数,当该参数设置为60s时,超过60s连接未传输数据,也就是说你超过60s未点击操作浏览器,服务端便会将连接关闭。

来看一个实际的例子:

image.png

上图中序号为2641的包是浏览器最后一次回复数据到服务端的包,大概是在20s的时刻,过了大概60s没有传输数据,所以在80s时刻的时候,服务端主动发送了fin包,断开了连接,对应的序号为6506,剩下的就是TCP四次挥手的包了。

(3)Chrome浏览器会通过TCP keep-alive来检测连接,如果检测连接失效,也就是服务端无响应,也会主动关闭连接。

我们也来看一个实际的例子。

首先在服务端所在机器执行以下命令,模拟客户端和服务端断网,即服务端无响应的情况:

iptables -A INPUT -p tcp -s 192.x.x.37 -j DROP
iptables -A OUTPUT -p tcp -d 192.x.x.37 -j DROP

来看实际的抓包:
image.png
上图中可以看到,客户端在发送了多次TCP Keep-Alive检测包后(具体发送多少次,每次间隔时间多少依赖于具体的系统配置),服务端都没有响应,则发送RST包断开了连接。

上面就是连接关闭的几种情况,除了客户端关闭浏览器,还有服务端的超时检测机制,以及客户端的连接检测机制,这些机制都能够保证连接的有效性,防止无效连接过多从而占用系统资源。

4 TCP Keep-Alive与心跳检测有什么关系?

根据上面的实例,有同学可能发现TCP Keep-Alive和某些应用层协议的心跳检测很相似,确实如此。

TCP Keep-Alive的功能完全可以通过应用层的心跳检测功能来实现,并且能够更加灵活,因为TCP Keep-Alive功能还要依赖操作系统的设置,而应用层协议完全可以自己实现。它们本质上都是做了连接有效性检测的事。

所以它们只是做的事情相同,本身并没有什么关系。

写在最后

今天通过实际抓包,解析了HTTP 1.1中keep-alive的协议概念。顺便回答了HTTP keep-alive、TCP Keep-Alive及心跳检测之间的一些问题。

HTTP keep-alive是应用层的概念,表示不同的HTTP请求可以复用之前的连接。

TCP Keep-Alive是传输层的概念,属于TCP保活的功能,通过发送Keep-Alive包判断对端是否存在。

心跳检测也是应用层的概念,用来检测连接有效性。

通常TCP Keep-Alive与心跳检测只需要一个就可以了,毕竟它们做的事都是一样的。

希望今天的内容对大家有所帮助,更多精彩文章欢迎关注微信公众号:WU双。

这篇关于HTTP keep-alive、TCP Keep-Alive、心跳检测,傻傻分不清?的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/355838

相关文章

Linux系统性能检测命令详解

《Linux系统性能检测命令详解》本文介绍了Linux系统常用的监控命令(如top、vmstat、iostat、htop等)及其参数功能,涵盖进程状态、内存使用、磁盘I/O、系统负载等多维度资源监控,... 目录toppsuptimevmstatIOStatiotopslabtophtopdstatnmon

springboot如何通过http动态操作xxl-job任务

《springboot如何通过http动态操作xxl-job任务》:本文主要介绍springboot如何通过http动态操作xxl-job任务的问题,具有很好的参考价值,希望对大家有所帮助,如有错... 目录springboot通过http动态操作xxl-job任务一、maven依赖二、配置文件三、xxl-

C++ 检测文件大小和文件传输的方法示例详解

《C++检测文件大小和文件传输的方法示例详解》文章介绍了在C/C++中获取文件大小的三种方法,推荐使用stat()函数,并详细说明了如何设计一次性发送压缩包的结构体及传输流程,包含CRC校验和自动解... 目录检测文件的大小✅ 方法一:使用 stat() 函数(推荐)✅ 用法示例:✅ 方法二:使用 fsee

OpenCV实现实时颜色检测的示例

《OpenCV实现实时颜色检测的示例》本文主要介绍了OpenCV实现实时颜色检测的示例,通过HSV色彩空间转换和色调范围判断实现红黄绿蓝颜色检测,包含视频捕捉、区域标记、颜色分析等功能,具有一定的参考... 目录一、引言二、系统概述三、代码解析1. 导入库2. 颜色识别函数3. 主程序循环四、HSV色彩空间

Maven 配置中的 <mirror>绕过 HTTP 阻断机制的方法

《Maven配置中的<mirror>绕过HTTP阻断机制的方法》:本文主要介绍Maven配置中的<mirror>绕过HTTP阻断机制的方法,本文给大家分享问题原因及解决方案,感兴趣的朋友一... 目录一、问题场景:升级 Maven 后构建失败二、解决方案:通过 <mirror> 配置覆盖默认行为1. 配置示

Linux中修改Apache HTTP Server(httpd)默认端口的完整指南

《Linux中修改ApacheHTTPServer(httpd)默认端口的完整指南》ApacheHTTPServer(简称httpd)是Linux系统中最常用的Web服务器之一,本文将详细介绍如何... 目录一、修改 httpd 默认端口的步骤1. 查找 httpd 配置文件路径2. 编辑配置文件3. 保存

C++ HTTP框架推荐(特点及优势)

《C++HTTP框架推荐(特点及优势)》:本文主要介绍C++HTTP框架推荐的相关资料,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录1. Crow2. Drogon3. Pistache4. cpp-httplib5. Beast (Boos

SpringBoot中HTTP连接池的配置与优化

《SpringBoot中HTTP连接池的配置与优化》这篇文章主要为大家详细介绍了SpringBoot中HTTP连接池的配置与优化的相关知识,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一... 目录一、HTTP连接池的核心价值二、Spring Boot集成方案方案1:Apache HttpCl

SpringBoot快速搭建TCP服务端和客户端全过程

《SpringBoot快速搭建TCP服务端和客户端全过程》:本文主要介绍SpringBoot快速搭建TCP服务端和客户端全过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,... 目录TCPServerTCPClient总结由于工作需要,研究了SpringBoot搭建TCP通信的过程

Spring Boot Controller处理HTTP请求体的方法

《SpringBootController处理HTTP请求体的方法》SpringBoot提供了强大的机制来处理不同Content-Type​的HTTP请求体,这主要依赖于HttpMessageCo... 目录一、核心机制:HttpMessageConverter​二、按Content-Type​处理详解1.