HTTP/2 带来的新颖
Binary Frames
HTTP2 在TCP层之上 HTTP下增加了Binary Frames协议, 基于该协议HTTP Request/Response 可以被分拆成由Frame组成的Stream在TCP上传输。
Header Compression -- HPACK
使用HPACk压缩http header成二进制格式,使用静态和动态索引表来压缩Header内容。 对动态header value使用huffman算法编码成二进制格式。
详细信息可以参考:
Static Table Definition -- http://http2.github.io/http2-spec/compression.html#static.table.definition
Huffman Coding -- http://http2.github.io/http2-spec/compression.html#huffman.code
Stream & Multipexing
在同一条TCP链路上可以根据Stream的优先级,并发的错序发送不同Stream Frames
Server Push
Server可以就一个请求主动推送多个应答给客户端
Q&A
Browser和Web Server如何协商Http协议?
HTTP2 SPEC 3.2 介绍了Client应该如何使用Http的Upgrade头域协商Http协议从1到2的升级。
For example,
1. Client to Server
GET / HTTP/1.1 Host: server.example.com Connection: Upgrade, HTTP2-Settings Upgrade: h2c HTTP2-Settings: <base64url encoding of HTTP/2 SETTINGS payload>
2. Server to Client
If YES for upgrading to HTTP/2,
HTTP/1.1 101 Switching Protocols Connection: Upgrade Upgrade: h2c [ HTTP/2 connection ...
If NO for upgrading to HTTP/2
HTTP/1.1 200 OK Content-Length: 243 Content-Type: text/html ...
借用Jerry Qu那个博客的总结,大概应该是这样:Browser使用Http1来问Server能不能Upgrade 到 h2c(httpd2), 如果可以,Server 就用http1.1回一个101,表示我能,那么接下来Browser就可以使用http2和Server通信,否则Server就回一个200,继续走http1咯。。。
Server Push如何工作?
HTTP/2 Server Push 定义讨论了Server Push的功能规范,但是没有具体讨论什么时候该如何使用该功能。
Jerry Qu的这篇博客就如何使用Server Push功能的进行了简单讨论。正如博客所说,具体的做法有很多种,比如Server端定义一些策略或通过学习来决定什么时候如何发送Push Response。另外就是客户端可以使用x-push-serve头域来请求Sever端应该使用Push方法发送应答。
参考
0. HTTP 2
1. HTTP2 RFC
https://tools.ietf.org/html/rfc7540#page-12
2. HPACK