-
Notifications
You must be signed in to change notification settings - Fork 0
Open
Labels
Description
what (http/2是什么)
http 自 1989 年问世以来,就一直霸占了网络通信协议的铁王座。虽然有缺陷在身,但一直针对自身缺陷,
不断地提高、优化,使自己变得更好。而http/2没有改变http原有的任何语义,仅仅优化底层连接方式。
http 经历了以下几个重要历程:
- http0.9: 第一个被公开露面的版本号,每个 tcp 连接只能支持一个请求响应,且只支持 get 方法,
仅支持 html 传输。(缺点很明显:dizzy_face:) - http1.0: 增加了更多的方法,如 post/head;增加了其他格式内容的传输;(还是短链接)
- http1.1: 优化了 tcp 连接方式,使得支持长链接和 http 流水线操作;引入了缓存机制;支持响应分块;
增加 push/delete/options 方法。(引起了head-of-line block) - http2: 参考wiki😸 优化底层连接传输方式,
同域名使用同一个tcp连接;使用二进制消息帧传输;
why (为什么会有http/2)
随着 http1.1 的知名度在逐渐扩大,web 应用程序的资源也在不断增加,浏览器加载资源的性能问题也就
暴露出来了,如 tcp 连接受限,请求头阻塞,请求头资源重复传输;然后又是 ssl 增加了一点难度。
因此,http2 于 2014 年诞生了,极乐降世,普度众生。
how (http/2是如何优化存在的缺陷)
了解了http发展历程,总结了存在这么几点缺陷:
- 多个连接虽解决了并发现象,但没有解决请求头重复传输的问题
- 虽然支持长链接,但server处理还是一一执行,而且还造成了head-of-line block
http/2 在 http/1.x 的基础上优化了传输机制,保持了原有的核心功能,但提供了高效优化。
http/2 协议的主要目标是针对 http/1.1 中存在的问题提出了解决方法, 并且还增加了更友好的功能:
- Multiplexing - 单个 tcp 连接异步发送多个请求
- Header compression - 在每个请求中,不需要发送相同请求头
- Binary protocol - 使用二进制分帧传输数据,不再使用 http1.1 的文本格式
- Request prioritization - 使得有限的资源定向到最重要的Stream
- Server push - 服务器可以异步发送数据到客户端的缓存
how http2 works
- 客户端通过 http1.1 发送一个升级 http2 的请求,如果服务器支持,服务器返回 101 响应码
作为同意升级 http2。然后客户端就在相同的 tcp 连接发送/接收请求。 - 每一个请求和响应提供一个唯一的 stream ID,且把请求和响应信息拆分成 frame;stream
ID 将和 frame 绑定在一起,用于区分不同的 stream。因为同一域下的请求使用同一个 tcp
连接。 - stream 运行设置优先级,那样的话,服务器根据优先级分配 memory/cpu/bandwidth。
- Header 压缩确保请求头不会冗余。客户端和服务器会共同维护一份 header 表,当有新的请求
头时,只会发送额外的请求头。 - 服务端推送,运行客户端以一种高效的方式加载包含的资源。与 websockets 协议的服务器推送
不同的是,websockets 协议的服务器可以在任何时候向客户端发送数据,即使没有来自客户
端的请求。相反,http2 服务器推送仍然符合请求响应模式。
issue
- 为什么二进制帧可以高效处理message?