HTTP/2 的帧、流和多路复用在真实连接上长什么样?这篇用 curl -v 看协商与流编号,用 nginx 日志数连接,用 Netty 的 HPACK 编码器量头部压缩(Java 的 HttpClient 怎么使用它见前面的篇目)。
ALPN: curl offers h2,http/1.1 ALPN: server accepted h2 using HTTP/2 [HTTP/2] [1] OPENED stream for https://127.0.0.1:9602/fast [HTTP/2] [1] [:method: GET] [HTTP/2] [1] [:scheme: https] [HTTP/2] [1] [:authority: 127.0.0.1:9602] [HTTP/2] [1] [:path: /fast] [HTTP/2] [1] [user-agent: curl/8.7.1] [HTTP/2] [1] [accept: */*] < HTTP/2 200
HTTP/2:总耗时 331 ms;nginx 日志里 10 个请求用了 1 个连接(协议 ['HTTP/2.0']) HTTP/1.1:总耗时 347 ms;nginx 日志里 10 个请求用了 10 个连接(协议 ['HTTP/1.1'])
OPENED 的流编号:[1, 3, 5, 7, 9, 11, 13, 15, 17, 19](都是奇数、递增;偶数留给服务端发起的流)
第 1 次编码(请求头完全相同):HPACK 136 字节;同样的请求头写成 HTTP/1.1 文本是 190 字节 第 2 次编码(请求头完全相同):HPACK 7 字节;同样的请求头写成 HTTP/1.1 文本是 190 字节 第 3 次编码(请求头完全相同):HPACK 7 字节;同样的请求头写成 HTTP/1.1 文本是 190 字节 第 4 次编码(只有 path 变了):HPACK 20 字节;同样的请求头写成 HTTP/1.1 文本是 191 字节