HTTP/2

来自WHY42
Riguz留言 | 贡献2023年12月5日 (二) 09:31的版本

HTTP2 vs HTTP1

Multiplexing: HTTP/1.1 loads resources one after the other, so if one resource cannot be loaded, it blocks all the other resources behind it. In contrast, HTTP/2 is able to use a single TCP connection to send multiple streams of data at once so that no one resource blocks any other resource. HTTP/2 does this by splitting data into binary-code messages and numbering these messages so that the client knows which stream each binary message belongs to.

Server push: Typically, a server only serves content to a client device if the client asks for it. However, this approach is not always practical for modern webpages, which often involve several dozen separate resources that the client must request. HTTP/2 solves this problem by allowing a server to "push" content to a client before the client asks for it. The server also sends a message letting the client know what pushed content to expect – like if Bob had sent Alice a Table of Contents of his novel before sending the whole thing.

Header compression: Small files load more quickly than large ones. To speed up web performance, both HTTP/1.1 and HTTP/2 compress HTTP messages to make them smaller. However, HTTP/2 uses a more advanced compression method called HPACK that eliminates redundant information in HTTP header packets. This eliminates a few bytes from every HTTP packet. Given the volume of HTTP packets involved in loading even a single webpage, those bytes add up quickly, resulting in faster loading.

HTTP/2 Discovery

h2
HTTP/2 over TLS
h2c
HTTP/2 is run over cleartext TCP

Starting HTTP/2 for "http" URIs

如果客户端无法事先知道服务端是否支持http2,可以通过HTTP Upgrade mechanism(定义在HTTP/1.1)中来实现,这样在之后的请求中可以采取HTTP/2。

GET / HTTP/1.1
Host: server.example.com
Connection: Upgrade, HTTP2-Settings
Upgrade: h2c
HTTP2-Settings: <base64url encoding of HTTP/2 SETTINGS payload>

这样的话,如果请求中由payload必须一次性发完。然后才能升级到HTTP/2。另一种办法是通过请求 来判断,这样做会多一次请求。

如果服务端不支持HTTP/2,返回中则不包含Upgrade header:

HTTP/1.1 200 OK
Content-Length: 243
Content-Type: text/html

否则,返回一个101 (Switching Protocols)响应:

HTTP/1.1 101 Switching Protocols
Connection: Upgrade
Upgrade: h2c

[ HTTP/2 connection ...

在h2c后面的空行之后,就可以开始发送HTTP/2的frame了。

HTTP2-Settings