当前位置: 首页 > article >正文

持久性HTTPVS.非持久性HTTP

1. HTTP协议基础

HTTP(HyperText Transfer Protocol)是Web通信的核心协议,定义了客户端(浏览器)与服务器之间传输数据的规则。
在HTTP/1.0及之前的版本中,默认使用非持久性连接,而HTTP/1.1及更高版本引入了持久性连接(默认开启)。两者的核心差异在于TCP连接的生命周期管理


2. 非持久性HTTP(HTTP Non-Persistent)

2.1 工作原理

  • 每次请求新建连接:客户端每次发送HTTP请求时,需建立新的TCP连接,响应完成后立即关闭。
  • 高延迟开销:每个请求需经历TCP三次握手(建立连接)和四次挥手(关闭连接)。
  • 资源浪费:频繁的TCP连接操作消耗服务器和客户端资源。

2.2 示例

假设用户访问一个包含3张图片的网页(index.html):

  1. 请求HTML文件
    • 客户端发送GET /index.html → 服务器返回HTML文件 → 关闭连接
  2. 请求图片1
    • 新建TCP连接 → GET /image1.jpg → 返回图片 → 关闭连接
  3. 重复步骤2:图片2和图片3各自重复上述过程。

性能损耗计算(假设每次握手/挥手耗时1个RTT,传输数据1个RTT):

  • 总耗时 = (3次请求 × 3 RTT) = 9 RTT(实际更高,因TCP慢启动等机制)。

2.3 性能缺陷

问题原因
高延迟每个请求需额外3个RTT(握手+挥手)
服务器资源占用高频繁创建/销毁TCP连接消耗CPU和内存
并行请求受限浏览器对同一域名最多允许6-8个并发连接(HTTP/1.1前)

3. 持久性HTTP(HTTP Persistent)

3.1 工作原理

  • 复用TCP连接:单个TCP连接可传输多个HTTP请求/响应,通过Connection: keep-alive头部启用(HTTP/1.1默认支持)。
  • 连接保持时间:服务器可设置Keep-Alive: timeout=5, max=100(空闲5秒关闭,最多处理100个请求)。
  • 减少握手次数:仅在首次建立连接时进行三次握手,后续请求复用通道。

3.2 示例

同一网页(index.html + 3张图片)使用持久性HTTP加载:

  1. 建立TCP连接 → 请求HTML文件 → 返回HTML → 保持连接
  2. 复用同一连接依次请求图片1、2、3,无需重复握手。

性能优化计算

  • 总耗时 = 1次握手(3 RTT) + 4次数据传输(4 RTT) = 7 RTT(节省33%时间)。

3.3 性能优势

优势原因
低延迟复用连接省去重复握手/挥手时间
高吞吐量减少TCP缓冲区重建开销,提升数据传输效率
资源利用率高服务器和客户端减少连接管理开销

4.对比一下

特性非持久性HTTP持久性HTTP
连接生命周期每次请求后关闭连接复用同一连接处理多个请求
默认协议版本HTTP/1.0HTTP/1.1+
头部控制无(默认关闭)Connection: keep-alive(HTTP/1.1默认开启)
延迟开销高(每次请求3 RTT)低(首次3 RTT,后续1 RTT/请求)
服务器资源占用高(频繁创建/销毁连接)低(长连接减少操作次数)
适用场景简单静态资源、兼容旧系统现代Web应用、多资源页面

5. 现代HTTP协议的演进

  • HTTP/2多路复用:在持久性连接基础上,允许通过单个连接并行传输多个请求(解决队头阻塞)。
  • HTTP/3与QUIC:基于UDP协议,进一步减少握手延迟,优化移动网络下的性能。

6. 总结

  • 非持久性HTTP适合简单场景,但性能瓶颈明显。
  • 持久性HTTP通过连接复用显著提升效率,成为现代Web的基石。
  • 随着HTTP/2和HTTP/3的发展,持久性连接的优化仍在持续演进。

附录:实际抓包示例
通过Wireshark抓取两种模式的网络包对比:

  • 非持久性:每个请求对应独立的TCP流(Filter: http.request)。
  • 持久性:单个TCP流中包含多个HTTP请求(Filter: tcp.stream eq <ID>)。

http://www.kler.cn/a/544024.html

相关文章:

  • react项目引入tailwindcss不生效解决方案
  • VS2019打开《喜缺全书算法册》附带代码的方法兼述单元测试
  • HCIA项目实践--RIP相关原理知识面试问题总结回答
  • 83.在 Vue3 中使用 OpenLayers 利用 TLE 计算并显示单个卫星的轨迹
  • .NET Web-静态文件访问目录浏览
  • uniapp中对于文件和文件夹的处理,内存的查询
  • ASP.NET Core用MediatR实现领域事件
  • 2025年02月11日Github流行趋势
  • MySQL的字符集(Character Set)和排序规则(Collation)
  • JavaScript中Map和Set数据结构详解
  • Gitlib 企业本地部署
  • docker compose部署flink集群
  • 盛铂科技SWFA100捷变频频率综合器:高性能国产射频系统的关键选择
  • Vue前端开发-Pinia其他扩展插件
  • android 安装第三方apk自动赋予运行时权限
  • OSPF高级特性(3):安全特效
  • 【Java并发编程之如何在线程中安全地访问一个全局Boolean类型的静态变量?】
  • 详解spotbugs -textui常用命令(包括生成html测试报告)
  • Vue.js 响应式原理与数据绑定
  • 4. React 中的 CSS
  • Visual Studio 中的键盘快捷方式
  • 【Leetcode 每日一题】1760. 袋子里最少数目的球
  • 【C++学习笔记】if 和 if constexpr
  • Openssl的使用,CA证书,中间证书,服务器证书的生成与使用
  • 如何设计一个高效、稳定的秒杀系统?
  • 【AI】增长迅猛的DeepSeek