Site Overlay

HTTP/2与node下的http2模块

传统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,这改变了客户端与服务器之间交换数据的方式。
0c06f134-8241-47e0-9265-05227ca2ad1f

三个概念

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

042e73ee-ddf2-4e22-a185-570bd84858c0

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

d40fc040-c2a2-49e7-a470-78c2b9

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