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

相关文章

Nginx部署HTTP/3的实现步骤

《Nginx部署HTTP/3的实现步骤》本文介绍了在Nginx中部署HTTP/3的详细步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学... 目录前提条件第一步:安装必要的依赖库第二步:获取并构建 BoringSSL第三步:获取 Nginx

HTTP 与 SpringBoot 参数提交与接收协议方式

《HTTP与SpringBoot参数提交与接收协议方式》HTTP参数提交方式包括URL查询、表单、JSON/XML、路径变量、头部、Cookie、GraphQL、WebSocket和SSE,依据... 目录HTTP 协议支持多种参数提交方式,主要取决于请求方法(Method)和内容类型(Content-Ty

Python 基于http.server模块实现简单http服务的代码举例

《Python基于http.server模块实现简单http服务的代码举例》Pythonhttp.server模块通过继承BaseHTTPRequestHandler处理HTTP请求,使用Threa... 目录测试环境代码实现相关介绍模块简介类及相关函数简介参考链接测试环境win11专业版python

使用Python的requests库来发送HTTP请求的操作指南

《使用Python的requests库来发送HTTP请求的操作指南》使用Python的requests库发送HTTP请求是非常简单和直观的,requests库提供了丰富的API,可以发送各种类型的HT... 目录前言1. 安装 requests 库2. 发送 GET 请求3. 发送 POST 请求4. 发送

Python脚本轻松实现检测麦克风功能

《Python脚本轻松实现检测麦克风功能》在进行音频处理或开发需要使用麦克风的应用程序时,确保麦克风功能正常是非常重要的,本文将介绍一个简单的Python脚本,能够帮助我们检测本地麦克风的功能,需要的... 目录轻松检测麦克风功能脚本介绍一、python环境准备二、代码解析三、使用方法四、知识扩展轻松检测麦

Go语言使用net/http构建一个RESTful API的示例代码

《Go语言使用net/http构建一个RESTfulAPI的示例代码》Go的标准库net/http提供了构建Web服务所需的强大功能,虽然众多第三方框架(如Gin、Echo)已经封装了很多功能,但... 目录引言一、什么是 RESTful API?二、实战目标:用户信息管理 API三、代码实现1. 用户数据

Python WSGI HTTP服务器Gunicorn使用详解

《PythonWSGIHTTP服务器Gunicorn使用详解》Gunicorn是Python的WSGI服务器,用于部署Flask/Django应用,性能高且稳定,支持多Worker类型与配置,可处... 目录一、什么是 Gunicorn?二、为什么需要Gunicorn?三、安装Gunicorn四、基本使用启

Linux之UDP和TCP报头管理方式

《Linux之UDP和TCP报头管理方式》文章系统讲解了传输层协议UDP与TCP的核心区别:UDP无连接、不可靠,适合实时传输(如视频),通过端口号标识应用;TCP有连接、可靠,通过确认应答、序号、窗... 目录一、关于端口号1.1 端口号的理解1.2 端口号范围的划分1.3 认识知名端口号1.4 一个进程

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-