HTTP/2.0 帧

HTTP/1.1基于字符串
HTTP/2.0基于帧Frame(二进制)
前面9个字节 72位表示 Length Type Flags StreamID
超过9字节的部分是Payload数据 最大16兆字节

HTTP/2.0 请求与响应

image.png
image.png
image.png

HTTP/2.0 流与多路复用

63.HTTP/2 & 多路复用 - 图4
一个连接中多个通道(stream流),互不影响

小结

  1. 引入帧(Frame)的概念,每一帧包含Length+Type+Flags+StreamID+Payload五部分,前四个部分是固定长度为9字节,第五部分Payload的最大长度为214到224-1字节,即16kb到16mb,具体的最大长度由终端自行决定
  2. 保留了请求和响应的概念,请求头和响应头会被发送方压缩后,分成几个连续的Frame传输,头字段会出现在这些Frame的Payload中,接收方拼合这些Frame后,解压缩即可得到真正的请求头或响应头
  3. 引入了流(Stream)的概念,一个Stream由双向传输的连续且有序的Frame组成,一个TCP连接可以包含多个Stream(比如100个),一个Stream只用于一次请求和一次响应。Stream之间不会互相影响
  4. 服务端可以先发响应,客户端拿到响应结果后可以保存,之后就不需要再发对应的请求了
  5. 头部字段全部改为小写,不允许出现大写。比如:accept:text/html
  6. 引入了伪头部字段的概念,出现在头部字段前面,必须以冒号靠头。比如:method=GET

服务器推送ServerPush

在第一次请求后,服务器可以主动推送后续文件
后台配置

第一种配置Nginx

  1. location / {
  2. root /usr/share/nginx/html;
  3. index index.html index.htm;
  4. http2_push /style.css;
  5. http2_push /example.png;
  6. }

第二种配置Nginx

  1. location / {
  2. ...
  3. http_push_preload on;
  4. }

然后在index.html响应头加
Link:;rel=preload;as=style

这个功能几乎没人用