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

HTTP 连接复用机制详解

文章目录

  • HTTP 连接复用机制详解
    • 为什么需要连接复用?
    • 连接复用的实现方式
      • HTTP/1.1 的 Keep-Alive
      • HTTP/2 多路复用
    • HTTP/1.1 的队头阻塞问题

HTTP 连接复用机制详解

在这里插入图片描述
HTTP 连接复用是 HTTP/1.1 及更高版本中的核心优化机制,旨在减少 TCP 连接建立和关闭的开销,以显著提升性能。

为什么需要连接复用?

说到这一点,其实就是在聊 HTTP/1.0 不使用连接复用,而是为每一次 HTTP 请求建立一次短连接存在的缺点:

  • 三次握手延迟:每次 HTTP 请求增加 1.5 RTT 的时间开销;
  • TCP 慢启动:新连接需要逐步提升传输速率,原因在于连接刚刚建立时,客户端和服务端需要相互告知当前可用的滑动窗口大小,初始时滑动窗口采用指数增长的形式不断扩大;
  • 资源浪费:高并发时服务器需要维护大量连接。

自 HTTP/1.1 开始引入了连接复用机制,即 HTTP 请求会复用同一个 TCP 连接并发送多个请求。

连接复用的实现方式

HTTP/1.1 的 Keep-Alive

机制

  • 客户端请求头携带 Connection: keep-alive(HTTP/1.1 默认开启);
  • 服务端响应头携带 Connection: keep-alive,表示同意复用;
  • 连接空闲时,不会立即关闭,而是等待后续请求。

示例

GET /page1.html HTTP/1.1
Host: example.com
Connection: keep-alive  # 显式声明(可选)HTTP/1.1 200 OK
Connection: keep-alive
Content-Type: text/html

连接真正关闭时的所需条件

  • 达到 Keep-Alive: max 的请求数;
  • 超过 Keep-Alive: timeout 空闲时间;
  • 显式发送 Connection: close

HTTP/2 多路复用

HTTP/2 在传输时使用二进制协议传输数据,这一点已经和初代 HTTP 采用纯文本进行数据传输有了很大的区别。针对连接复用,HTTP/2 进一步引入了多路复用机制,具体来说:

  • 在单个 TCP 连接上并行交错多个请求/响应(二进制分帧)「比如客户端同时发送请求 A 和 B,服务器无需按序返回」;
  • 彻底解决了 HTTP/1.1 的队头阻塞问题。

HTTP/1.1 的队头阻塞问题

队头阻塞问题指的是,客户端和服务端采用 HTTP/1.1 协议进行通信时,如果请求 1 的响应延迟,那么会阻塞后续请求,即使后续的请求 2 已经准备好。

为什么在 HTTP/1.1 会出现队头阻塞问题?本质原因在于需要复用已经建立的 TCP 连接。需要先明确一点,一个{源 IP, 源 Port, 目标 IP, 目标 Port}四元组唯一标识一条 TCP 连接,因此如果客户端与服务端通过相同的四元组意图建立一个新的 TCP 连接,连接请求将会被拒绝。此时如果客户端改变一个端口(通过随机分配的方式),就可以建立一个新的 TCP 连接(服务端不需要改变端口,比如 HTTP 服务一直在 80 端口监听)。

由于 HTTP/1.1 采用多路复用,所以如果客户端有新的请求,会复用之前的 TCP 连接,而不是新建一个 TCP 连接,因此如果之前的请求延迟没有得到恢复,新的请求需要在队列中等待,之前的请求得到响应之后新的请求才会发送。

相关文章:

  • 【KWDB 创作者计划】MySQL数据库迁移至KWDB的完整实践指南
  • 【AI论文】MiMo:解锁语言模型的推理潜力——从预训练到后训练
  • 【内网渗透】——NTML以及Hash Relay
  • 2025年渗透测试面试题总结-360[实习]安全工程师(题目+回答)
  • 高带宽时代来临,G口服务器线路选型要注意哪些问题?
  • 用PyTorch在超大规模下训练深度学习模型:并行策略全解析
  • MCU裸机程序如何移植到RTOS?
  • SCDN如何有效防护网站免受CC攻击?——安全加速网络的实战解析
  • Java Queue 接口实现
  • 《社交应用动态表情:RN与Flutter实战解码》
  • 数据结构与算法-双向链表专题
  • 如何自定义 Spring MVC 的配置?
  • [学习] RTKLib详解:rtcm2.c、rtcm3.c、rtcm3e与rtcmn.c
  • Spring Web MVC————入门(2)
  • 【极兔快递Java社招】一面复盘|数据库+线程池+AQS+中间件面面俱到
  • 下载的旧版的jenkins,为什么没有旧版的插件
  • 【docker】--容器管理
  • 代码随想录训练营第二十三天| 572.另一颗树的子树 104.二叉树的最大深度 559.N叉树的最大深度 111.二叉树的最小深度
  • 入门OpenTelemetry——部署OpenTelemetry
  • AI智能分析网关V4周界入侵检测算法精准监测与智能分析,筑牢周界安全防线
  • 男子恶意遗弃幼子获刑,最高法发布涉未成年人家庭保护典型案例
  • 与总书记交流的上海人工智能实验室年轻人,在探索什么前沿领域?
  • 人民日报:从“轻微免罚”看涉企执法方式转变
  • 泽连斯基启程前往土耳其
  • 最高降价三成,苹果中国iPhone开启大促销,能拉动多少销量?
  • 上海国际电影节特设“今日亚洲”单元