传统HTTP协议由 Tim Berners-Lee 提出,第一次发布于1991年,目的是为了让服务端和客户端进行通信。之后发布的HTTP/1.1服务于网页已经超过15年,15年发布了HTTP/2,他是自1999年以来协议家族最大,最具创新性的变化,他保持与HTTP/1.x的向后兼容性。
影响HTTP网络请求的因素
- 带宽
- 延迟
- 浏览器阻塞
- DNS查询
- 建立连接
HTTP/1.x有什么问题?
- HTTP/1.0:
- 只保持短暂连接:浏览器的每次请求都需要与服务器建立一个TCP连接,请求处理后立即断开连接,每次建立和关闭连接很费时。
- 连接无法复用:每次请求都经历三次握手和慢启动
- HOL blocking(队首阻塞):带宽无法被充分利用,阻塞后续请求
- HTTP/1.1:通过管道化解决HTTP/1.0的问题,实现一次性发送多个请求,但只能按顺序接收和响应
- 高延迟:HOL blocking(队首阻塞)
- 不安全:明文传输
HTTP/2带来了什么?
- 多路复用传输:交错发送
- 连接合并
- 服务器推送:实现一个请求对应多个响应
- 标头压缩:使用HPACK压缩格式,客户端和服务器同时维护一个标头字段的索引列表
- 数据流优先级:决定如何响应
HTTP/2如何实现多路复用?
基于SPDY规范(Google开发的一个实验性协议),在应用层和传输层中间加了二进制分帧层,也是为了向下兼容HTTP/1.1,这改变了客户端与服务器之间交换数据的方式。

三个概念
- 数据流: 已建立的连接内的双向字节流,可以承载一条或多条消息。
- 消息: 与逻辑请求或响应消息对应的完整的一系列帧。
- 帧: HTTP/2 通信的最小单位,每个帧都包含帧头,至少也会标识出当前帧所属的数据流。

客户端和服务器可以将 HTTP 消息分解为互不依赖的帧,然后交错发送,最后再在另一端把它们重新组装起来。

node下的http2模块
- 需要生成私钥和证书
openssl req -x509 -sha256 -nodes -days 365 -newkey rsa:2048 -keyout server.key -out server.crt
- 使用
createSecureServer()创建服务器,传入生成的key,cert文件 - HTTP2Stream 类
- ServerHttp2Stream 类
pushStream()启动推送流respondWithFD()启动从指定文件描述符读取数据的响应- ClientHttp2Stream 类
参考资料
https://developers.google.com/web/fundamentals/performance/http2
https://itbilu.com/nodejs/core/Sy-2trZhQ.html#core_api_class_http2stream