> [TOC] # 1、HTTP/1.1 发展中遇到的问题 ## 1.1、发生的变化 ![image-20220813224604630](assets/image-20220813224604630.png) ## 1.2、高延迟问题 ![image-20220813224625917](assets/image-20220813224625917.png) ![image-20220813224836311](assets/image-20220813224836311.png) ## 1.3、巨大的头部 ![image-20220813225004647](assets/image-20220813225004647.png) ## 1.4、HTTP1.1的优化 ![image-20220813225037932](assets/image-20220813225037932.png) ## 1.5、HTTP/1.1 不支持服务器推送消息 ![image-20220813225126902](assets/image-20220813225126902.png) # 2、HTTP2特征概述 ## 2.1、提出背景 ![image-20220813225242683](assets/image-20220813225242683.png) * http2协议可以在http协议下,也可以在TLS-SSL协议下使用。 * 浏览器强制要求HTTP2只能被HTTPS解析,也就是使用TLS-SSL协议。 ## 2.2、特性 ![image-20220813225444351](assets/image-20220813225444351.png) ![image-20220813225530773](assets/image-20220813225530773.png) # 3、在TCP上从HTTP1升级到HTTP2 ## 3.1、HTTP/2 是不是必须基于TLS/SSL 协议? ![image-20220816210600245](assets/image-20220816210600245.png) ## 3.2、h2与h2c ![image-20220816210746090](assets/image-20220816210746090.png) ## 3.3、H2C:不使用 TLS 协议进行协议升级 ![image-20220816213310417](assets/image-20220816213310417.png) ![image-20220816213409707](assets/image-20220816213409707.png) # 4、h2如何建立会话? ## 4.1、通讯过程 ![image-20220816213628014](assets/image-20220816213628014.png) ![image-20220816213640440](assets/image-20220816213640440.png) ## 4.2、服务器端选择协议 ![image-20220816213815311](assets/image-20220816213815311.png) # 5、Stream、Message、Frame 间的关系 ## 5.1、定义 ![image-20220816214002799](assets/image-20220816214002799.png) ## 5.2、Stream、Message、Frame 间的关系 ![image-20220816214249616](assets/image-20220816214249616.png) ![image-20220816214702279](assets/image-20220816214702279.png) ## 5.3、传输中无序 ![image-20220816214729430](assets/image-20220816214729430.png) * 同一个stream必须是有序的 * 跨越stream可以是无序的 ![image-20220816214902643](assets/image-20220816214902643.png) # 6、帧格式:Stream流ID的作用 ## 6.1、对比websocket ![image-20220816215016793](assets/image-20220816215016793.png) ![image-20220816215110251](assets/image-20220816215110251.png) ## 6.2、作用 ![image-20220816215232321](assets/image-20220816215232321.png) ![image-20220816215240030](assets/image-20220816215240030.png) ![image-20220816215249933](assets/image-20220816215249933.png) ![image-20220816215256014](assets/image-20220816215256014.png) # 7、帧格式:帧类型及设置帧的子类型 ## 7.1、定义 ![image-20220816215731117](assets/image-20220816215731117.png) * 帧长度 * 帧类型 * 帧标记 * 帧的id * 帧数据 ## 7.2、帧的类型 ![image-20220816215758282](assets/image-20220816215758282.png) ![image-20220816215805092](assets/image-20220816215805092.png) ## 7.3、setting设置帧 * 可以设置多个key-value ![image-20220816215958065](assets/image-20220816215958065.png) ![image-20220816220048816](assets/image-20220816220048816.png) # 8、HPACK 如何减少HTTP 头部的大小? ## 8.1、定义 ![image-20220816220720751](assets/image-20220816220720751.png) ## 8.2、静态字典 ![image-20220816220747802](assets/image-20220816220747802.png) ![image-20220816220927312](assets/image-20220816220927312.png) ![image-20220816220843281](assets/image-20220816220843281.png) ## 8.3、动态字典 动态表包含以**先进先出**的顺序维护的 header 字段列表。动态表中的第一个条目和最新条目在最低索引处,而动态表的最旧条目在最高索引处。 动态表最初是空的。当每个 header 块被解压缩时,将添加条目。动态表可以包含重复的条目(即,具有相同名称和相同值的条目)。因此,解码器不得将重复的条目视为错误。 编码器决定如何更新动态表,因此可以控制动态表使用多少内存。为了限制解码器的存储需求,动态表的 size 受到严格限制。 解码器在处理 header 字段表示列表时更新动态表。 # 9、HPACK 中如何使用Huffman树编码? ## 9.1、原理 ![image-20220816221321050](assets/image-20220816221321050.png) ## 9.2、构造过程 ![image-20220816221558274](assets/image-20220816221558274.png) # 10、HPACK 中整型数字的编码 这里编码的是索引位置,即使下文11章节所说的索引表下标 ## 10.1、小于31 ![image-20220816230238907](assets/image-20220816230238907.png) ## 10.2、大于31 ![image-20220816230356798](assets/image-20220816230356798.png) ![image-20220816230421388](assets/image-20220816230421388.png) ![image-20220816230523265](assets/image-20220816230523265.png) # 11、HPACK 中HEADER 的编码格式 ## 11.1、HEADER帧的格式 ![image-20220816230631593](assets/image-20220816230631593.png) ![image-20220816230701522](assets/image-20220816230701522.png) ## 11.2、动态表 ![image-20220816230731894](assets/image-20220816230731894.png) ## 11.3、字面编码 ![image-20220816230813032](assets/image-20220816230813032.png) ## 11.4、格式 ![image-20220816230857683](assets/image-20220816230857683.png) ![image-20220816231045912](assets/image-20220816231045912.png) ![image-20220816231317892](assets/image-20220816231317892.png) ![image-20220816231327159](assets/image-20220816231327159.png) ![image-20220816231628647](assets/image-20220816231628647.png) ![image-20220816231647378](assets/image-20220816231647378.png) ![image-20220816231657774](assets/image-20220816231657774.png) ## 11.5、动态表控制 ![image-20220816231728498](assets/image-20220816231728498.png) # 12、服务器端的主动消息推送 ## 12.1、价值 ![image-20220816232717019](assets/image-20220816232717019.png) ![image-20220816232729367](assets/image-20220816232729367.png) ![image-20220816232913454](assets/image-20220816232913454.png) ## 12.2、帧格式 ![image-20220816233032609](assets/image-20220816233032609.png) ## 12.3 可以禁用 ![image-20220816233326240](assets/image-20220816233326240.png) # 13、stream的状态变迁 ## 13.1、stream特性 ![image-20220816233654866](assets/image-20220816233654866.png) ## 13.2、message特性 ![image-20220816233732465](assets/image-20220816233732465.png) ## 13.3、发送例子 ![image-20220816233807759](assets/image-20220816233807759.png) ![image-20220816233818110](assets/image-20220816233818110.png) ## 13.4、stream状态的变化 ![image-20220816233905535](assets/image-20220816233905535.png) # 14、RST_STREAM帧及常见错误码 ## 14.1、定义 ![image-20220816234215070](assets/image-20220816234215070.png) ## 14.2、常见的错误码 ![image-20220816234234494](assets/image-20220816234234494.png) ![image-20220816234241382](assets/image-20220816234241382.png) ![image-20220816234247670](assets/image-20220816234247670.png) # 15、不同请求的优先级 ## 15.1、Priority 优先级设置帧 ![image-20220816234332719](assets/image-20220816234332719.png) ## 15.2、优先级 ![image-20220816234537477](assets/image-20220816234537477.png) ![image-20220816234913183](assets/image-20220816234913183.png) * exclusive:是否独占 # 16、不同于 TCP 的流量控制 ## 16.1、为什么需要? ![image-20220817205611078](assets/image-20220817205611078.png) ![image-20220817210023672](assets/image-20220817210023672.png) ## 16.2、如何进行? ![image-20220817210119059](assets/image-20220817210119059.png) ## 16.3、流量控制帧 ![image-20220817210326885](assets/image-20220817210326885.png) ## 16.4、流控制窗口 ![image-20220817210516483](assets/image-20220817210516483.png) ## 16.5、并发流 ![image-20220817210535722](assets/image-20220817210535722.png) # 17、HTTP/2 的问题 ## 17.1、TCP 以及 TCP+TLS 建链握手过多的问题 ![image-20220817210751019](assets/image-20220817210751019.png) ## 17.2、多路复用与 TCP 的队头阻塞问题 ![image-20220817210827738](assets/image-20220817210827738.png) ## 17.3、TCP的问题 ![image-20220817210845887](assets/image-20220817210845887.png) # 18、七层负载均衡做了些什么? ## 18.1、四层负载均衡 ![image-20220817211116912](assets/image-20220817211116912.png) ## 18.2、七层负载均衡协议转换举例 ![image-20220817211157133](assets/image-20220817211157133.png) ## 18.3、协议转换 ![image-20220817211448937](assets/image-20220817211448937.png) ## 18.4、WAF 防火墙 ![image-20220817211544225](assets/image-20220817211544225.png) ## 18.5、负载均衡算法 ![image-20220817211644003](assets/image-20220817211644003.png) ## 18.6、缓存功能 ![image-20220817211702271](assets/image-20220817211702271.png)