VuePress 站点
首页
数学
计算机基础
Java后端
AI大模型
UI设计
首页
数学
计算机基础
Java后端
AI大模型
UI设计
  • 计算机基础
  • 计算机网络应用

    • 课程笔记:TCP三次握手建立连接
    • 课程笔记:TCP三次握手的必要性
    • 课程笔记:TCP协议缺陷与SYN Flood攻击
    • 课程笔记:TCP四次挥手释放连接
    • 课程笔记:TCP四次挥手释放连接的必要性
    • 课程笔记:TCP 报文段格式与 IP 分组
    • 课程笔记:HTTP/2 新特性——二进制分帧
    • 课程笔记:HTTP/2 新特性——多路复用
    • 课程笔记:HTTP/2 新特性——服务器推送(Server Push)
    • 课程笔记:HTTPS 简介与架构图
    • 课程笔记:HTTPS原理与传输层安全协议(TLS)
    • 课程笔记:HTTPS原理——对称加密算法
    • 课程笔记:HTTPS原理——非对称加密算法
    • 课程笔记:HTTPS 原理 —— 数字签名
    • 课程笔记:HTTPS 原理——证书与 CA
    • 课程笔记:完整的HTTPS协议通信流程
    • 课程笔记:HTTPS 协议的性能损耗
    • 课程笔记:TLS False Start 加速 HTTPS
    • 课程笔记:升级 HTTP 协议到 HTTP/2
    • 课程笔记:通过会话恢复加速 HTTPS
    • 课程笔记:OWASP 组织与十大 Web 安全漏洞
    • 课程笔记:XSS 跨站脚本攻击
    • 课程笔记:存储型XSS跨站脚本攻击
    • 课程笔记:XSS攻击窃取Cookie
    • 课程笔记:反射型XSS跨站脚本攻击
    • 课程笔记:DOM型XSS跨站脚本攻击
    • 课程笔记:植入 JS、HTML 代码攻击
    • 课程笔记:XSS攻击的防护策略
    • 课程笔记:XSS攻击的输入环节防护
    • 课程笔记:XSS 劫持 Cookie 的防护策略
    • 课程笔记:XSS 内容输出防护方案
    • 课程笔记:CSP 内容安全策略
    • 课程笔记:CSP 内容安全策略的应用方式
    • 课程笔记:CSRF 跨站请求伪造攻击原理
    • 课程笔记:CSRF 跨站点请求伪造攻击案例
    • 课程笔记:CSRF 跨站请求伪造防护方案
    • 课程笔记:OWASP CSRFTester 工具的原理与使用
    • 课程笔记:点击劫持攻击原理
    • 课程笔记:点击劫持防护方案
    • 课程笔记:URL 跳转漏洞原理与防护
    • 课程笔记:Session 认证与会话劫持
    • 课程笔记:Session固定与Session保持攻击
    • 课程笔记:注入攻击与 OWASP 靶机平台
    • 课程笔记:SQL盲注与ORM注入攻击及防护
    • 课程笔记:XML注入、代码注入、OS命令注入攻击
    • 课程笔记:文件上传漏洞与文件下载/目录浏览漏洞
    • 课程笔记:访问控制与权限访问漏洞
    • 课程笔记:DDoS 分布式拒绝服务攻击原理与防护
    • 课程笔记:CC(Challenge Collapsar)攻击与防护
    • 课程笔记:CDN 的工作原理
    • 课程笔记:CDN的网络架构和术语说明
    • 课程笔记:CDN应用场景与阿里云CDN
    • 课程笔记:如何使用阿里云CDN服务
    • 课程笔记:CDN 刷新与预热
    • 课程笔记:阿里云 CDN 回源配置
    • 课程笔记:CDN 缓存配置
    • 课程笔记:CDN 访问控制与性能优化
  • 计算机网网络

    • 📖 教材介绍与课程导言
    • 📖 1.1 信息时代的计算机网络
    • 📖 1.2 因特网概述
    • 📖 1.3 电路交换、分组交换和报文交换
    • 📖 1.4 计算机网络的定义和分类
    • 📖 1.5 计算机网络的性能指标(1)
    • 📖 1.5 计算机网络的性能指标(2)
    • 📖 1.6.1 常见的三种计算机网络体系结构
    • 📖 1.6.2 计算机网络体系结构分层的必要性
    • 📖 1.6.3 计算机网络体系结构分层思想举例
    • 📖 计算机网络体系结构中的专用术语
    • 📖 物理层概述
    • 📖 物理层下面的传输媒体
    • 📖 传输方式
    • 📖 编码与调制
    • 📖 2.5 信道的极限容量
    • 📖 2.6 信道复用技术
    • 📖 3.1 数据链路层概述
    • 📖 3.2 数据链路层的三个重要问题
    • 📖 3.2.1 封装成帧和透明传输
    • 📖 3.2.2 差错检测
    • 📖 3.2.3 (1) 可靠传输的相关基本概念
    • 📖 3.2.3 (2) 可靠传输的实现机制 - 停止-等待协议(SW)
    • 📖 3.2.3 (3) 可靠传输的实现机制 - 回退N帧协议(GBN)
    • 📖 3.2.3 (4) 可靠传输的实现机制 - 选择重传协议(SR)
    • 📖 3.3 点对点协议 PPP
    • 📖 3.4 共享式以太网
    • 📖 3.4.1 网络适配器和 MAC 地址
    • 📖 3.4.2 (1) CSMA/CD 协议的基本原理
    • 📖 3.4.2 (2) 共享式以太网的争用期、最小帧长和最大帧长
    • 📖 3.4.2 (3) 共享式以太网的退避算法和信道利用率
    • 📖 3.4.3 使用集线器的共享式以太网
    • 📖 3.4.4 在物理层扩展以太网
    • 📖 3.4.5 (1) 网桥的主要结构和基本工作原理
    • 📖 3.4.5 (2) 透明网桥的自学习和转发帧的过程以及生成树协议STP
    • 📖 3.5 交换式以太网
    • 📖 3.5.1 以太网交换机
    • 📖 3.5.2 共享式以太网和交换式以太网的对比
    • 📖 3.6 以太网的MAC帧格式
    • 📖 3.7.1 虚拟局域网 VLAN 概述
    • 📖 3.7.2 虚拟局域网 VLAN 的实现机制
    • 📖 3.8 以太网的发展
    • 📖 3.9.1 802.11 无线局域网的组成
    • 📖 3.9.2 802.11 无线局域网的物理层
    • 📖 3.9.3 (1) 802.11 无线局域网的数据链路层 —— 使用 CSMA/CA 协议(而不使用 CSMA/CD 协议)
    • 📖 CSMA/CA(载波监听多址接入/碰撞避免)协议的基本工作原理
    • 📖 802.11 无线局域网的 MAC 帧格式
    • 📖 网络层概述
    • 📖 网际协议 IP(网际协议)与异构网络互连
    • 📖 IPv4 地址及其编址方法——概述
    • 📖 IPv4 地址的分类编址方法
    • 📖 IPv4 地址的划分子网编址方法
    • 📖 IPv4 地址的无分类编址方法(CIDR)
    • 📖 IPv4 地址的应用规划
    • 📖 IPv4 地址与 MAC 地址
    • 📖 地址解析协议 ARP
    • 📖 IP 数据报的发送和转发流程
    • 📖 IPv4 数据报的首部格式
    • 📖 静态路由配置
    • 📖 因特网的路由选择协议概述
    • 📖 路由信息协议 RIP(路由信息协议)
    • 📖 开放最短路径优先 OSPF(开放最短路径优先)
    • 📖 边界网关协议 BGP(边界网关协议)
    • 📖 路由器的基本工作原理
    • 📖 网际控制报文协议 ICMP(网际控制报文协议)
    • 📖 虚拟专用网 VPN 和网络地址转换 NAT
    • 📖 IP 多播技术的相关基本概念
    • 📖 在局域网上进行硬件多播
    • 📖 在因特网上进行 IP 多播需要的两种协议
    • 📖 网际组管理协议 IGMP
    • 📖 多播路由选择协议
    • 📖 移动 IP 技术概述
    • 📖 IPv6 引进的主要变化
    • 📖 IPv6 数据报的基本首部和扩展首部
    • 📖 IPv6 地址
    • 📖 从 IPv4 向 IPv6 过渡
    • 📖 网际控制报文协议 ICMPv6
    • 📖 软件定义网络 SDN
    • 📖 运输层概述 — 进程间基于网络的通信
    • 📖 TCP/IP 体系结构运输层中的两个重要协议
    • 📖 运输层端口号、复用与分用的概念
    • 📖 UDP 和 TCP 的对比
    • 📖 TCP 报文段的首部格式
    • 📖 "三报文握手"建立 TCP 连接
    • 📖 "四报文挥手"释放 TCP 连接
    • 📖 TCP 的流量控制 (Flow Control)
    • 📖 TCP 的拥塞控制 (Congestion Control) 及与网际层拥塞控制的关系
    • 📖 TCP 可靠传输的实现
    • 📖 TCP 超时重传时间 (RTO) 的选择
    • 📖 TCP 的选择确认 (SACK)
    • 📖 6.1 应用层概述
    • 📖 6.2 客户—服务器方式和对等方式
    • 📖 6.3 动态主机配置协议 DHCP
    • 📖 6.4 域名系统 DNS
    • 📖 6.5 文件传送协议 FTP
    • 📖 电子邮件
    • 📖 万维网 WWW
    • 📖 网络安全概述
    • 📖 密码学相关基本概念
    • 📖 对称密钥密码体制
    • 📖 公钥密码体制
    • 📖 报文摘要和报文鉴别码
    • 📖 数字签名(digital signature)
    • 📖 实体鉴别
    • 📖 密钥分发
    • 📖 访问控制
    • 📖 网络体系结构各层采取的安全措施—物理层和数据链路层
    • 📖 网络体系结构各层采取的安全措施—网络层
    • 📖 网络体系结构各层采取的安全措施—运输层
    • 📖 网络体系结构各层采取的安全措施—应用层
    • 📖 防火墙访问控制与入侵检测系统
    • 📖 常见的网络攻击及其防范
    • 📖 定长子网划分和变长子网划分的二叉树解法

课程笔记:HTTP/2 新特性——二进制分帧

课程名称:计算机网络应用 核心摘要:本讲围绕 HTTP/2 的核心增强机制——**二进制分帧(Binary Framing)**展开。重点讲解 HTTP/2 在兼容 HTTP/1.x 的前提下,通过引入二进制分帧层、单连接多路复用、Stream/Message/Frame 三级抽象,实现性能大幅提升。同时梳理帧结构、流标识符规则及服务器推送(Server Push)的关键原理。


一、 核心概念与原理

1.1 HTTP/2 的兼容性与性能定位

  • HTTP/2 对 HTTP/1.x(主要是 1.1)完全兼容,原有语义结构不做大幅调整。
  • 为增加新功能,HTTP/2 在 HTTP 协议层与传输层之间新增一层:二进制分帧层(Binary Framing Layer)。
  • HTTP/2 的性能相对于 HTTP/1.1 有非常大的提升,二进制分帧是其性能增强的核心。

1.2 协议分层结构(自下而上)

层级协议说明
网络层IP不做重点关注
传输层TCP承载 HTTP/2 的单一长连接
安全层(可选)TLS提供加密传输
二进制分帧层Binary FramingHTTP/2 新增层,性能增强核心
应用层HTTP语义与 1.x 兼容,依赖底层工作

1.3 文本编码到二进制编码的转变

版本报文编码方式特点
HTTP/0.9、1.0、1.1ASCII 明文文本可读性强,但效率低
HTTP/2.0二进制编码切分为更小单位,更适合网络传输,效率高
  • HTTP/2 中,发送/接收的消息都被切分为更小的单位:Message(消息) 与 Frame(帧)。
  • 帧(Frame)是 HTTP/2 传输消息的最小单位,并对帧做二进制编码。

1.4 四大核心概念(从大到小)

概念英文含义
连接Connection一个 TCP 连接,HTTP/2 所有通信在其上完成
流Stream连接中的虚拟/逻辑双向通道,可承载双向消息
消息Message逻辑上的一个 HTTP 请求或响应,由多个帧组成
帧Frame最小传输单位,二进制编码,绑定到具体流

层级关系:

Connection(TCP 连接)
  └── Stream 1(流,双向逻辑通道)
        └── Message(逻辑 HTTP 消息:请求/响应)
              └── Frame(帧,最小单位:Headers Frame + Data Frame)

二、 技术细节与协议分析

2.1 单一 TCP 长连接机制

  • HTTP/2 所有通信都在一个 TCP 连接上完成,不再开辟多个连接。
  • TCP 连接一旦建立,长期保持存活状态,按需复用通道传输消息。
  • 一个连接可承载任意数量的双向数据流(Stream)。

2.2 单连接长存活带来的性能收益

收益点说明
减轻连接压力始终只有一个连接,服务端内存/资源开销显著降低
吞吐量提升连接内可乱序(并发)发送,提高并发处理能力
缓解网络拥塞TCP 连接数减少,拥塞状况改善
减少慢启动影响连接长期开放,慢启动时间窗口被充分利用
快速恢复拥塞/丢包恢复更快,无需重建连接

关键论断:影响 HTTP 性能的核心在于 TCP 的低延迟,而非网络的高带宽。HTTP 连接通常短暂且突发性强(如打开网页、点赞等触发短连接),TCP 仅在长时间传输大数据时效率最高。HTTP/2 的长连接机制恰好契合这一特性。

2.3 帧类型

帧类型封装内容对应 HTTP/1.x 报文部分
Headers Frame头部信息(含起始行 method、URL、版本)报文头部
Data Frame数据正文报文 body 部分

注:起始行(请求行/状态行)也会被压缩装载到 Headers Frame 中。实际传输为二进制压缩格式,明文图示仅为便于理解。

2.4 帧的内部结构

一个帧由两部分组成:9 字节的帧头(Frame Header) + 载荷(Payload)。

┌─────────────────────────────────────────┐
│           Frame Header(9 字节)         │
├──────────┬──────┬──────┬──────┬─────────┤
│ Length   │ Type │Flags │ R    │Stream ID│
│ 24 bit   │ 8 bit│8 bit │1 bit │ 31 bit  │
└──────────┴──────┴──────┴──────┴─────────┘
┌─────────────────────────────────────────┐
│             Payload(载荷)              │
│       可变长度,承载实际数据              │
└─────────────────────────────────────────┘

帧头字段详解

字段位数/字节含义
Length24 bit帧有效载荷(数据)的长度,不包含帧头本身
Type8 bit(1 字节)定义帧类型(如 DATA、HEADERS 等)
Flags8 bit(1 字节)标识位,标记帧状态。常见如 END_HEADERS(头部发送结束,类似 HTTP/1.x 的空行 CRLF)
R(Reserved)1 bit保留位,暂无明确语义。发送时须保持未设置,接收时须忽略(由操作系统实现,开发者无需处理)
Stream Identifier31 bit(无符号整数)流标识符,将当前帧与具体流绑定

9 字节由来:24 + 8 + 8 + 1 + 31 = 72 bit = 9 字节。

2.5 流标识符(Stream ID)规则

发起方Stream ID 取值说明
客户端发起奇数(1、3、5、7…)客户端请求
服务端发起偶数(0、2、4、6…)服务端推送(Server Push)
  • 设计目的:防止两端 ID 冲突,确保双向通信的流可区分。
  • Stream ID 是实现 多路复用(Multiplexing) 和 服务器推送(Server Push) 的关键。

2.6 帧的有序性与并发性(重点)

层级是否可乱序/并发原因
Stream 之间✅ 可并发、可乱序每个 Stream 有唯一 Stream ID,接收端按 ID 重组
同一 Stream 内的 Frame❌ 必须有序帧没有自己的独立标识符,仅绑定 Stream ID,必须按发送顺序重组

核心结论:

  • 流可以乱序并发:因为有 Stream ID 标识,接收端可按 ID 并发重组。
  • 帧在流内必须有序:因为帧无独立 ID,服务端按发送顺序重组。
  • 接收端依据 Stream ID 实现并发消息重组。

2.7 多路复用(Multiplexing)

  • 在一个长期存活的 TCP 连接中,同时跑多个 Stream。
  • 多个 Stream 可并发执行(并发传递和接收消息)。
  • 接收端根据 Stream ID 对乱序到达的帧进行按流分组重组。
  • 详细机制见后续专章讲解。

2.8 服务器推送(Server Push)

  • 基于 Stream ID 的奇偶规则实现:服务端推送使用偶数 Stream ID。
  • 典型场景:客户端请求 index.html,服务端识别页面依赖大量 JS/CSS,主动推送这些资源,避免客户端再次发起请求。
  • 客户端收到推送后可直接渲染,减少往返请求。
Client                          Server
  │  GET /index.html (Stream 1)  │
  │ ────────────────────────────▶│
  │                              │
  │  PUSH index.html (Stream 1)  │
  │ ◀────────────────────────────│
  │  PUSH main.js   (Stream 2)   │  ← 偶数,服务端推送
  │ ◀────────────────────────────│
  │  PUSH style.css (Stream 4)   │  ← 偶数,服务端推送
  │ ◀────────────────────────────│

三、 实践应用与配置命令

本讲以原理讲解为主,未涉及具体实操命令。以下为概念性示意,便于理解帧与流的绑定关系:

// HTTP/2 一次请求的帧序列示意(明文表示,实际为二进制)

[Headers Frame] Stream ID = 1  →  GET /index.html HTTP/2
[Data Frame]     Stream ID = 1  →  (request body, 如有)

// 服务端响应 + 推送
[Headers Frame] Stream ID = 1  →  200 OK
[Data Frame]     Stream ID = 1  →  <html>...</html>
[Headers Frame] Stream ID = 2  →  PUSH main.js      // Server Push
[Data Frame]     Stream ID = 2  →  // JS 内容

四、 重点与难点提示

必考/必记要点

  1. 二进制分帧是 HTTP/2 性能增强的核心机制。
  2. HTTP/2 通过在 HTTP 与 TCP 之间新增二进制分帧层实现兼容与增强。
  3. 四大核心概念:Connection > Stream > Message > Frame,Frame 是最小单位。
  4. 帧头固定 9 字节 = Length(24) + Type(8) + Flags(8) + R(1) + Stream ID(31)。
  5. Stream ID 规则:客户端奇数、服务端偶数(用于 Server Push 区分)。

易错点

  1. ❌ 误认为"帧可以乱序发送"。 ✅ 正确:流之间可乱序并发,但同一流内的帧必须有序(帧无独立 ID,仅绑定 Stream ID)。
  2. ❌ 误认为 HTTP/2 不兼容 HTTP/1.x。 ✅ 正确:HTTP/2 完全兼容 1.x 语义,仅传输机制改变。
  3. ❌ 误认为 HTTP/2 仍使用多个 TCP 连接。 ✅ 正确:HTTP/2 所有通信在单一 TCP 长连接上完成。
  4. ❌ 误认为 Length 字段包含帧头长度。 ✅ 正确:Length 仅表示 Payload 长度,不含 9 字节帧头。
  5. ❌ 误认为 Headers Frame 只装头部。 ✅ 正确:起始行(method、URL、版本)也压缩进 Headers Frame。

常见面试题

  • 简述 HTTP/2 相比 HTTP/1.1 的核心改进有哪些?
  • 解释 HTTP/2 的二进制分帧层及其作用。
  • 描述 Connection/Stream/Message/Frame 四者的层级关系。
  • 为什么 HTTP/2 中"流可乱序而帧不可乱序"?
  • Stream ID 的奇偶设计解决了什么问题?
  • 单一 TCP 长连接如何带来性能提升?涉及 TCP 的哪些特性(慢启动、拥塞控制)?

五、 课后疑问/遗留问题

  1. 多路复用(Multiplexing) 的详细工作机制将在后续课程专门讲解,需持续关注。
  2. 服务器推送(Server Push) 的具体配置与触发策略将在后续篇幅展开。
  3. HPACK 头部压缩算法(本讲未涉及)如何与 Headers Frame 配合工作?
  4. HTTP/2 的其他新特性(如流优先级 Priority、流量控制 Flow Control)的细节待补充。
  5. 在高并发场景下,单一 TCP 连接是否会出现"队头阻塞"问题?HTTP/3(QUIC)如何应对?
最近更新: 2026/6/23 17:18
Contributors: yangwenguang
Prev
课程笔记:TCP 报文段格式与 IP 分组
Next
课程笔记:HTTP/2 新特性——多路复用