作者:charryhuang,腾讯 CSIG 前端开发工程师
从 1989 年万维网(www)诞生,HTTP(HyperText Transfer Protocol)经历了众多版本迭代,WebSocket 也在期间萌芽。1991 年 HTTP0.9 被发明。1996 年出现了 HTTP1.0。2015 年 HTTP2 正式发布。2020 年 HTTP3 或能正式使用。以下将会简单介绍。
HTTP1.1 与 HTTP2
HTTP1.1 的缺陷
高延迟 — 队头阻塞(Head-Of-Line Blocking)
无状态特性 — 阻碍交互
明文传输 — 不安全性
不支持服务端推送
队头阻塞
队头阻塞是指当顺序发送的请求序列中的一个请求因为某种原因被阻塞时,在后面排队的所有请求也一并被阻塞,会导致客户端迟迟收不到数据。
针对队头阻塞:
1.将同一页面的资源分散到不同域名下,提升连接上限。虽然能公用一个 TCP 管道,但是在一个管道中同一时刻只能处理一个请求,在当前的请求没有结束之前,其他的请求只能处于阻塞状态。
2.减少请求数量
3.内联一些资源:css、base64 图片等
4.合并小文件减少资源数
无状态特性
无状态是指协议对于连接状态没有记忆能力。纯净的 HTTP 是没有 cookie 等机制的,每一个连接都是一个新的连接。上一次请求验证了用户名密码,而下一次请求服务器并不知道它与上一条请求有何关联,换句话说就是掉登录态。
不安全性
传输内容没有加密,中途可能被篡改和劫持。
SPDY 协议
SPDY 是由 google 推行的改进版本的 HTTP1.1 (那时候还没有 HTTP2)。
特性:
多路复用 — 解决队头阻塞
头部压缩 — 解决巨大的 HTTP 头部
请求优先级 — 先获取重要数据
服务端推送 — 填补空缺
提高安全性
多路复用
SPDY 允许在一个连接上无限制并发流。因为请求在一个通道上,TCP 效率更高(参考 TCP 拥塞控制 中的慢启动)。更少的网络连接,发出更密集的包。
头部压缩
使用专门的 HPACK 算法,每次请求和响应只发送差异头部,一般可以达到 50% ~90% 的高压缩率。
请求优先级
虽然无限的并发流解决了队头阻塞的问题,但如果带宽受限,客户端可能会因防止堵塞通道而阻止请求。在网络通道被非关键资源堵塞时,高优先级的请求会被优先处理。
服务端推送
服务端推送(ServerPush),可以让服务端主动把资源文件推送给客户端。当然客户端也有权利选择是否接收。
提高安全性
支持使用 HTTPS 进行加密传输。
HTTP2
HTTP2 基于 SPDY,专注于性能,最大的一个目标是在用户和网站间只用一个连接。
新增特性:
二进制分帧 - HTTP2 性能增强的核心
多路复用 - 解决串行的文件传输和连接数过多
二进制分帧
首先,HTTP2 没有改变 HTTP1 的语义,只是在应用层使用二进制分帧方式传输。因此,也引入了新的通信单位:帧、消息、流。
分帧有什么好处?服务器单位时间接收到的请求数变多&#