|
@@ -0,0 +1,349 @@
|
|
|
+> [TOC]
|
|
|
+
|
|
|
+# 1、HTTP/1.1 发展中遇到的问题
|
|
|
+
|
|
|
+## 1.1、发生的变化
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+## 1.2、高延迟问题
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+## 1.3、巨大的头部
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+## 1.4、HTTP1.1的优化
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+## 1.5、HTTP/1.1 不支持服务器推送消息
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+# 2、HTTP2特征概述
|
|
|
+
|
|
|
+## 2.1、提出背景
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+* http2协议可以在http协议下,也可以在TLS-SSL协议下使用。
|
|
|
+* 浏览器强制要求HTTP2只能被HTTPS解析,也就是使用TLS-SSL协议。
|
|
|
+
|
|
|
+## 2.2、特性
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+# 3、在TCP上从HTTP1升级到HTTP2
|
|
|
+
|
|
|
+## 3.1、HTTP/2 是不是必须基于TLS/SSL 协议?
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+## 3.2、h2与h2c
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+## 3.3、H2C:不使用 TLS 协议进行协议升级
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+# 4、h2如何建立会话?
|
|
|
+
|
|
|
+## 4.1、通讯过程
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+## 4.2、服务器端选择协议
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+# 5、Stream、Message、Frame 间的关系
|
|
|
+
|
|
|
+## 5.1、定义
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+## 5.2、Stream、Message、Frame 间的关系
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+## 5.3、传输中无序
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+* 同一个stream必须是有序的
|
|
|
+* 跨越stream可以是无序的
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+# 6、帧格式:Stream流ID的作用
|
|
|
+
|
|
|
+## 6.1、对比websocket
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+## 6.2、作用
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+# 7、帧格式:帧类型及设置帧的子类型
|
|
|
+
|
|
|
+## 7.1、定义
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+* 帧长度
|
|
|
+* 帧类型
|
|
|
+* 帧标记
|
|
|
+* 帧的id
|
|
|
+* 帧数据
|
|
|
+
|
|
|
+## 7.2、帧的类型
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+## 7.3、setting设置帧
|
|
|
+
|
|
|
+* 可以设置多个key-value
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+# 8、HPACK 如何减少HTTP 头部的大小?
|
|
|
+
|
|
|
+## 8.1、定义
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+## 8.2、静态字典
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+## 8.3、动态字典
|
|
|
+
|
|
|
+动态表包含以**先进先出**的顺序维护的 header 字段列表。动态表中的第一个条目和最新条目在最低索引处,而动态表的最旧条目在最高索引处。
|
|
|
+
|
|
|
+动态表最初是空的。当每个 header 块被解压缩时,将添加条目。动态表可以包含重复的条目(即,具有相同名称和相同值的条目)。因此,解码器不得将重复的条目视为错误。
|
|
|
+
|
|
|
+编码器决定如何更新动态表,因此可以控制动态表使用多少内存。为了限制解码器的存储需求,动态表的 size 受到严格限制。
|
|
|
+
|
|
|
+解码器在处理 header 字段表示列表时更新动态表。
|
|
|
+
|
|
|
+# 9、HPACK 中如何使用Huffman树编码?
|
|
|
+
|
|
|
+## 9.1、原理
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ ## 9.2、构造过程
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+# 10、HPACK 中整型数字的编码
|
|
|
+
|
|
|
+这里编码的是索引位置,即使下文11章节所说的索引表下标
|
|
|
+
|
|
|
+## 10.1、小于31
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+## 10.2、大于31
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+# 11、HPACK 中HEADER 的编码格式
|
|
|
+
|
|
|
+## 11.1、HEADER帧的格式
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+## 11.2、动态表
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+## 11.3、字面编码
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+## 11.4、格式
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+## 11.5、动态表控制
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+# 12、服务器端的主动消息推送
|
|
|
+
|
|
|
+## 12.1、价值
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+## 12.2、帧格式
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+## 12.3 可以禁用
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+# 13、stream的状态变迁
|
|
|
+
|
|
|
+## 13.1、stream特性
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+## 13.2、message特性
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+## 13.3、发送例子
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+## 13.4、stream状态的变化
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+# 14、RST_STREAM帧及常见错误码
|
|
|
+
|
|
|
+## 14.1、定义
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+## 14.2、常见的错误码
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+# 15、不同请求的优先级
|
|
|
+
|
|
|
+## 15.1、Priority 优先级设置帧
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+## 15.2、优先级
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+* exclusive:是否独占
|
|
|
+
|
|
|
+# 16、不同于 TCP 的流量控制
|
|
|
+
|
|
|
+## 16.1、为什么需要?
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+## 16.2、如何进行?
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+## 16.3、流量控制帧
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+## 16.4、流控制窗口
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+## 16.5、并发流
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+# 17、HTTP/2 的问题
|
|
|
+
|
|
|
+## 17.1、TCP 以及 TCP+TLS 建链握手过多的问题
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+## 17.2、多路复用与 TCP 的队头阻塞问题
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+## 17.3、TCP的问题
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+# 18、七层负载均衡做了些什么?
|
|
|
+
|
|
|
+## 18.1、四层负载均衡
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+## 18.2、七层负载均衡协议转换举例
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+## 18.3、协议转换
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+## 18.4、WAF 防火墙
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+## 18.5、负载均衡算法
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+## 18.6、缓存功能
|
|
|
+
|
|
|
+
|