计算机网络:非持久HTTP连接 VS 持久性HTTP 连接

2024-01-22 05:08

本文主要是介绍计算机网络:非持久HTTP连接 VS 持久性HTTP 连接,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

  • 非持久HTTP连接(non-persistent HTTP)是在http/1.0中定义
  • 持久HTTP连接(persistent HTTP)是在http/1.1中定义,其默认带流水线

非持久HTTP连接

某网页由最基本的 HTML 和10个JPEG 图像构成,10个JPEG 图像文件存放在同一台服务器中。如果用户请求该网页并采用“非持久连接”,那么在HTTP 客户(通常是用户浏览器)和服务器之间将发生以下操作:

  1. HTTP 客户端初始化一个与服务器主机www.server.com中的HTTP服务器的TCP 连接。服务器使用默认端口80监听来自HTTP客户的建立连接请求。
  2. HTTP客户端经由与TCP关联的本地Socket发出一个HTTP请求消息(Request)。这个消息中包含路径名 …/index.html。
  3. HTTP服务器经由与TCP关联的本地Socket接收到这个请求消息,再从服务器主机的内存或者硬盘中取出文件 …/index.html,经由同一Socket向 HTTP客户端发送包含该文件的响应消息 (Response Message)。
  4. HTTP服务器通知TCP服务层关闭这个TCP连接;TCP服务层并不立即关闭这个连接,而是在客户收到刚才那个响应消息后才会真正终止这个连接。
  5. HTTP客户端经由同一 Socket 接收这个响应消息 (Response Message)。TCP连接随后终止。客户端所收到的消息中封装了客户端所请求的 HTML文件。客户端浏览器从中取出这个文件,加以分析后发现这个文件中还有有10个JPEG对象引用。
  6. 对每个引用到的JPEG对象重复步骤1~4。

上述步骤之所以称为使用非持久连接,原因是每次服务器发送一个对象后相关的TCP连接就被关闭,也就是说每个连接没有持续到可以传输其他对象。每个TCP连接只能传送一个请求消息和响应消息。就上述例子,用户请求的那个Web页面就产生了11个TCP连接(1个网页请求连接和10个图象请求连接)。
   
在上述的例子中,并没有明确指出客户是依次打开10 逐一取得每个 JPEG 对象,还是同时打开多个 TCP连接同时取得多个 JPEG 对象。实际上,现今的浏览器允许用户通过配置来控制并行连接的程度。大多数浏览器默认可以打开5~10个并行TCP连接,每个连接处理一个请求/响应事务。如果把并行连接数设置为1,那样的话这个传送 JPEG 的10个连接是串行建立的。使用并行连接可以缩短响应时间。

非持久连接缺点
  1. 客户要为每个待请求的对象建立并维护一个新得连接。对于每个连接,TCP 必须同时在客户端和服务器端分配 TCP 缓冲区,并维护 TCP 变量。对于有可能同时为来自数百个不同客户的请求提供服务的Web服务器来说,这会严重增加服务器的负担;
  2. 对每个对象请求都有2个 RTT 的响应延迟:一个 RTT 用于建立 TCP 连接,另一个 RTT 用于请求和接收对象;
  3. 每个对象都要经历 TCP 缓启动,因为每个TCP连接都要起始于 slow start 阶段。并行 TCP 连接的使用能够部分减轻 RTT 延迟和缓启动的影响。

持久HTTP连接

在持久连接情况下,服务器在发出响应后保持TCP连接继续打开着。同一客户/服务器之间的后续请求和响应可以通过这个连接传递。整个Web页面上,比如 1 个基本HTML和 10 个JPEG对象的页面,可以通过单个的持久TCP连接发送。甚至存放在同一个服务器中的多个Web页面也可以通过单个持久TCP连接发送。通常,HTTP服务器在某个连接闲置了一段时间后就关闭它,而这段时间通常是可以配置的。

流水线(Pipeline)

持久连接分为不带流水线(without pipeline)和带流水线(with pipeline)两个版本。

如果是无流水线的版本,那么客户只能在接收到前一个请求的响应后才会发送新的请求。这种情况下,Web页面所引用的每个对象(上例中的10个JPEG图像)都经历1个RTT延迟用于请求和接收该对象。于非持久连接中每个对象需要2个RTT相比,不带流水线的持久连接已经有所改善。不带流水线版本的另一个缺点是,服务器送出一个对象后开始等待下一个请求,而这个新的请求却不能马上到达。这段时间服务器资源便闲置了。带流水线的持久连接还能进一步降低响应延迟。

HTTP/1.1的默认模式是使用带流水线的持久连接。这种情况下,HTTP客户每遇到一个对象引用就立即发出一个请求,因而HTTP客户可以一个接一个连续发出各个引用对象的请求。服务器收到这些请求后,也可以一个接一个连续发送各个对象。如果所有的请求和响应都连续发送的,那么所有引用到的对象供给经历1个RTT延迟,而不是像不带流水线版本那样,每个引用都必须有1个RTT延迟。
与非持久连接相比,持久连接,无论是否带流水线降低了1个RTT延迟外,缓启动延迟也比较小。其原因在于既然各个对象都使用同一个TCP连接,服务器发送第一个对象后就不必再以一开始的缓慢速率发送后续对象了。

参考来源:http://ordinarysky.cn/zblog/post/persistentinhttp.html

这篇关于计算机网络:非持久HTTP连接 VS 持久性HTTP 连接的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

Nginx部署HTTP/3的实现步骤

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

java.sql.SQLTransientConnectionException连接超时异常原因及解决方案

《java.sql.SQLTransientConnectionException连接超时异常原因及解决方案》:本文主要介绍java.sql.SQLTransientConnectionExcep... 目录一、引言二、异常信息分析三、可能的原因3.1 连接池配置不合理3.2 数据库负载过高3.3 连接泄漏

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. 发送

Mac电脑如何通过 IntelliJ IDEA 远程连接 MySQL

《Mac电脑如何通过IntelliJIDEA远程连接MySQL》本文详解Mac通过IntelliJIDEA远程连接MySQL的步骤,本文通过图文并茂的形式给大家介绍的非常详细,感兴趣的朋友跟... 目录MAC电脑通过 IntelliJ IDEA 远程连接 mysql 的详细教程一、前缀条件确认二、打开 ID

Go语言连接MySQL数据库执行基本的增删改查

《Go语言连接MySQL数据库执行基本的增删改查》在后端开发中,MySQL是最常用的关系型数据库之一,本文主要为大家详细介绍了如何使用Go连接MySQL数据库并执行基本的增删改查吧... 目录Go语言连接mysql数据库准备工作安装 MySQL 驱动代码实现运行结果注意事项Go语言执行基本的增删改查准备工作

python连接sqlite3简单用法完整例子

《python连接sqlite3简单用法完整例子》SQLite3是一个内置的Python模块,可以通过Python的标准库轻松地使用,无需进行额外安装和配置,:本文主要介绍python连接sqli... 目录1. 连接到数据库2. 创建游标对象3. 创建表4. 插入数据5. 查询数据6. 更新数据7. 删除

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四、基本使用启