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

HTTP/1.0、HTTP/1.1 和 HTTP/2.0 主要区别

一句话总结

  • HTTP/1.0: 短连接,每次请求都需要建立一个新的 TCP 连接,性能较差。
  • HTTP/1.1: 长连接,默认开启 Keep-Alive,连接可复用,解决了 1.0 的大部分问题,是目前使用最广泛的版本。
  • HTTP/2.0: 二进制、多路复用,彻底解决了 1.1 的“队头阻塞”问题,大幅提升了传输性能。

对比表格(核心区别一览)

特性HTTP/1.0HTTP/1.1HTTP/2.0
连接方式短连接长连接 (Persistent)多路复用 (Multiplexing)
队头阻塞 (HOL)存在存在 (请求级别)基本解决 (单个 TCP 连接内)
协议格式文本 (ASCII)文本 (ASCII)二进制 (Binary)
Header 压缩HPACK 算法
服务器推送不支持不支持支持 (Server Push)
Host 头部可选必须必须
缓存处理Expires, Last-ModifiedCache-Control, ETag 等更完善的机制继承 1.1 并进一步优化

详细解释核心区别

下面深入探讨这些关键改变的含义和影响。

1. 连接方式的进化:从短连接到多路复用

这是三个版本之间最根本的区别,直接影响了性能。

  • HTTP/1.0: 短连接 (Short-lived Connections)

    • 工作模式: 浏览器每请求一个资源(如 HTML, CSS, JS, 图片),都需要建立一个新的 TCP 连接。请求完成后,连接立即关闭。
    • 缺点:
      • 高延迟: 每个资源的请求都包含 TCP 的三次握手和四次挥手过程,开销巨大。
      • 服务器压力大: 频繁地创建和销毁连接,对服务器资源消耗严重。
  • HTTP/1.1: 长连接 (Persistent Connections)

    • 工作模式: 默认启用 Connection: keep-alive。一个 TCP 连接在发送请求后不会立即关闭,可以被后续的多个请求复用。
    • 优点:
      • 减少延迟: 避免了重复的 TCP 握手和挥手,显著提高了加载速度。
    • 缺点 (引入了新问题):
      • 队头阻塞 (Head-of-Line Blocking): 虽然连接可以复用,但在同一个连接上,请求必须按顺序发送和接收。如果前一个请求非常耗时(例如一个大文件),后面的请求即使很小,也必须等待它完成才能被处理。这就像在超市排队结账,前面的人买了很多东西,你就得一直等。
      • Pipelining (管道化): 1.1 曾试图通过管道化技术解决部分问题(即客户端可以连续发送多个请求而不用等待响应),但由于实现复杂且容易出错(如代理服务器支持不佳),大部分浏览器默认都禁用了它。
  • HTTP/2.0: 多路复用 (Multiplexing)

    • 工作模式: 这是 HTTP/2.0 的革命性改变。它在一个 TCP 连接上,引入了流 (Stream) 的概念。每个请求和响应都作为一个独立的流,并被分解成更小的帧 (Frame)。这些帧可以交错发送,然后在另一端根据流 ID 重新组装。
    • 优点:
      • 彻底解决队头阻塞: 因为多个请求/响应可以同时在同一个连接上并行传输,一个慢请求不会阻塞其他请求。这就像超市开了多个收银台,顾客可以同时结账,互不干扰。
      • 连接效率更高: 只需建立一个 TCP 连接即可传输所有资源,最大化地利用了连接,降低了延迟。
2. 协议格式:从文本到二进制
  • HTTP/1.x: 是人类可读的文本协议。请求和响应的报文都是纯文本字符串,例如:

    GET /index.html HTTP/1.1
    Host: example.com
    User-Agent: curl/7.64.1
    
    • 缺点: 格式不紧凑,解析起来相对慢且容易出错(比如对空格、换行的处理)。
  • HTTP/2.0: 是二进制协议。所有传输的数据都被分割成二进制编码的帧。

    • 优点:
      • 解析高效: 二进制格式解析起来更高效、更健壮,不易出错。
      • 体积更小: 为数据压缩和传输优化提供了基础。
3. Header 压缩:HPACK 算法
  • HTTP/1.x: 不会对 Header 进行压缩。每次请求,即使 Header 内容(如 Cookie, User-Agent)基本没变,也需要完整地发送一遍。当请求很多时,这会产生巨大的、不必要的流量。

  • HTTP/2.0: 使用 HPACK 算法对 Header 进行压缩。

    • 工作原理:
      1. 静态表 (Static Table): 客户端和服务器共同维护一个包含常见 Header(如 :method: GET)的静态表。
      2. 动态表 (Dynamic Table): 对于会变化的内容(如自定义 Header 或 Cookie),HPACK 会在连接中创建一个动态表,记录下已经发送过的 Header。后续请求如果包含相同的 Header,只需发送一个索引号即可。
      3. 霍夫曼编码: 对新的或未在表中的 Header 值使用霍夫曼编码进行压缩。
    • 优点: 极大地减少了请求的体积,尤其是在移动端或网络不佳的环境下,效果非常明显。
4. 服务器推送 (Server Push)
  • HTTP/1.x: 只能由客户端发起请求,服务器被动响应。典型的流程是:浏览器请求 HTML -> 解析 HTML -> 发现需要 CSS 和 JS -> 再分别发起对 CSS 和 JS 的请求。

  • HTTP/2.0: 允许服务器主动推送资源给客户端。

    • 工作原理: 当客户端请求一个 HTML 页面时,服务器可以预测到客户端接下来肯定会需要相关的 CSS 和 JS 文件,于是在发送 HTML 的同时,主动将这些资源“推送”给客户端的缓存。当客户端解析完 HTML 准备请求这些资源时,会发现它们已经存在于本地了。
    • 优点: 减少了关键资源的请求往返时间 (RTT),加快了页面的“可交互时间”。

总结

  • HTTP/1.0 -> HTTP/1.1: 主要的飞跃是从短连接变为长连接,解决了频繁建立连接的性能瓶颈,并引入了更完善的缓存机制和 Host 头(支持了虚拟主机)。
  • HTTP/1.1 -> HTTP/2.0: 是一次彻底的性能革命。通过多路复用、二进制协议、Header 压缩和服务器推送等关键技术,根本上解决了 HTTP/1.1 的队头阻塞问题,最大化地提升了 Web 页面的加载速度和传输效率。

简单来说,HTTP 的演进史就是一部不断追求**“更快、更省、更高效”**的历史。

http://www.dtcms.com/a/295610.html

相关文章:

  • Java设计模式之行为型模式(中介者模式)介绍与说明
  • 常用设计模式系列(十一)—外观模式
  • VUE2 学习笔记5 动态绑定class、条件渲染、列表过滤与排序
  • 微服务-springcloud-springboot-Skywalking详解(下载安装)
  • C++中std::list的使用详解和综合实战代码示例
  • Linux进程间通信:管道机制全方位解读
  • uniapp转微信程序点击事件报错Error: Component “xx“ does not have a method “xx“解决方案
  • Linux724 逻辑卷挂载;挂载点扩容;逻辑卷开机自启
  • 【PZ-ZU7EV-KFB】——ZYNQ UltraScale + ZU7EV开发板ARM/FPGA异构计算开发平台,赋能多域智能硬件创新
  • The Missing Semester of Your CS Education 学习笔记以及一些拓展知识(六)
  • 从“类”到“道”——Python 面向对象编程全景解析
  • J2EE模式---组合实体模式
  • 从指标定义到AI执行流:衡石SENSE 6.0的BI PaaS如何重构ISV分析链路
  • 【推荐100个unity插件】Animator 的替代品?—— Animancer Pro插件的使用介绍
  • Mac电脑使用IDEA启动服务后,报service异常
  • 微算法科技(NASDAQ: MLGO)研究量子信息递归优化(QIRO)算法,为组合优化问题拓展解决新思路
  • 橱柜铰链的革命:炬森精密如何以创新科技重塑家居体验
  • 详解力扣高频SQL50题之197. 上升的温度【简单】
  • 重构数据库未来:金仓数据库,抢占 AI 原生时代先机
  • 数据结构系列之红黑树
  • 亚马逊云科技:以云为翼,助你翱翔数字新天空
  • pycharm配conda环境
  • 2025年PostgreSQL 详细安装教程(windows)
  • Pycharm、Python安装及配置小白教程
  • 智能制造场景195个术语的16个分类
  • 模块化商城的快速部署之道:ZKmall开源商城如何让电商功能即插即用
  • Unity VS Unreal Engine ,“电影像游戏的时代” 新手如何抉择引擎?(1)
  • Java设计模式-适配器模式
  • vue 中什么场景使用 export default 和setup()
  • Baumer工业相机堡盟工业相机如何通过YoloV8深度学习模型实现卫星图像识别(C#代码,UI界面版)