博客
关于我
HTTP/2 协议详解
阅读量:586 次
发布时间:2019-03-12

本文共 1709 字,大约阅读时间需要 5 分钟。

HTTP/2 协议详解


引言

HTTP/2 是 HTTP/1.x 的升级版,它通过引入二进制分帧、多路复用流等机制显著提升了网络性能。然而,在深入理解 HTTP/2 之前,我们需要回顾 HTTP/1.x 的基本机制及其局限性。


HTTP/1.x 简介

HTTP/1.x 是一个明文协议,其请求和响应全部以文本形式传输。例如,一个典型的 HTTP 请求如下:

GET / HTTP/1.1Host: jiajunhuang.com

服务器可能返回一个类似的响应:

HTTP/1.1 101 Switching ProtocolsConnection: UpgradeUpgrade: h2c

特性解释

  • 明文协议:所有内容都是可读字符,而非二进制数据。
  • 客户端与服务器:浏览器通常作为客户端,服务器生成网页内容。
  • 请求与响应:包含方法(如 GET、POST)、目标路径和协议版本。
  • 头部和状态码:头部是键值对描述,状态码如 200 表示成功。

HTTP/1.x 的流程问题

HTTP/1.x 每次请求都建立独立的 TCP 连接,导致高延迟和资源浪费。例如,浏览页面时,每个静态资源都需要单独连接,导致 32 个资源下载需要 32 秒。

局限性

  • 多个连接:浏览器通常最多开启 6 个连接,资源下载时间过长。
  • 重复头部:每个请求中头部重复,资源浪费。
  • keep-alive:即便开启 keep-alive,TCP 连接利用率仍低。

HTTP/2 简介

HTTP/2 架构提高了性能,主要通过以下特性:

  • 二进制协议:使用帧传输,而非明文。
  • 多路复用流:同一连接下同时传输多个请求/响应。
  • 流级别优先:通过依赖关系优先传输高重要性资源。

二进制分帧

HTTP/2 社区意识到 HTTP/1.x 解析效率低下,通过分帧优化:

  • 帧结构:帧包含长度、类型、标志位和流ID。
    +----------------+| Length (24)   |+----------------+| Type (8)     |+----------------+| Flags (8)    |+----------------+| R (1)       |+----------------+| Stream ID (31)|+----------------+| Payload (...) |+----------------+
  • 帧类型:如 HEADERS、PUSH_PROMISE、DATA 等。

举例

HTTP/2 请求可能如下:

[:length=24 bytes]Type: 0x00000000 (数据帧)Flags: 0x00000000Stream ID: 1Payload: 本次请求的内容

流的概念

流是 HTTP/2 的核心,通过唯一流ID区分不同请求/响应。

流ID生成

客户端和服务器各占用奇数和偶数流ID,确保不冲突。

流状态

流状态包括 idle、open、closed 等,状态转换由帧类型决定。

流优先级

流可以定义依赖关系和优先级,例如:

A --> B(C)

B 依赖 A,C 依赖 B,优先级可通过权重调整。


流控制与错误处理

  • 流控制:通过 WINDOW_UPDATE 帧管理连接和流的带宽。
  • 错误处理:HTTP/2 定义了两种错误类型:流错误和连接错误。

技术细节

头部压缩

HTTP/2 采用压缩算法(如 Huffman)压缩头部,提升效率。

SETTINGS命令

SETTINGS 用于自定义连接参数,如最大帧大小。


如何与 HTTP/1.x 兼容

从 HTTP/1.x 升级:

  • 客户端发送升级请求:
    GET / HTTP/1.1Host: server.example.comConnection: UpgradeUpgrade: h2c
  • 服务器返回 101 Switching Protocols 和 HTTP/2 数据。

  • 参考资料

    • [RFC 7541] - HTTP/2 规范
    • [RFC 7540] - HTTP/2 协商流程

    通过以上改进,HTTP/2 在性能、资源利用和扩展性上显著提升。

    转载地址:http://okbxz.baihongyu.com/

    你可能感兴趣的文章
    12-面向对象1
    查看>>
    python基础总结 异常处理
    查看>>
    解决Vue源码运行错误
    查看>>
    HDU - 4109 Instrction Arrangement
    查看>>
    Lua websocket长连接
    查看>>
    SQL 分页查询 返回总条数
    查看>>
    重写的特点
    查看>>
    【数据库】MySQL导入文件与导出文件
    查看>>
    计算机网络UDP协议和TCP协议
    查看>>
    Linux运行C语言文件
    查看>>
    C字符串高级
    查看>>
    2010-03-25 函数题
    查看>>
    C语言_动态内存分配练习
    查看>>
    Linux学习_系统进程概念
    查看>>
    七层网络模型(待添加)
    查看>>
    考研复试——KY276 Problem C
    查看>>
    老鸟带你画tiled lines
    查看>>
    MybatisPlus自定义Sql实现多表查询
    查看>>
    Java位运算,负数的二进制表示形式,int类型最大值为什么是2的31次方-1
    查看>>
    PyQt5快速上手基础篇10-QSettings用法
    查看>>