主要观点:
- 介绍 HTTP/2 是 HTTP/1.1 的重大升级,是 gRPC 协议的基础,如今已普遍使用。
- 解释 HTTP/1.1 的流水线技术存在线头阻塞问题,HTTP/2 通过将单个连接分割为多个独立流来解决该问题,但仍受 TCP 限制。
- 详细阐述 HTTP/2 的工作原理,包括连接前奏、头部帧与 HPACK 压缩、数据帧、流控制等方面。
- 说明 Go 语言的
net/http
包默认支持 HTTP/2(通过 HTTPS),若运行在纯 HTTP 上则可能不使用 HTTP/2,可通过设置启用未加密的 HTTP/2 或使用golang.org/x/net/http2
包进行更精细控制。 - 推荐使用 VictoriaMetrics 监控服务,作者是 Go 语言爱好者,可通过特定渠道交流。
关键信息:
- HTTP/2 连接前奏的 24 字节序列
PRI * HTTP/2.0\r\n\r\nSM\r\n\r\n
。 - 伪头部用于区分特殊和常规头部,HPACK 压缩算法通过静态表和动态表管理头部。
- HTTP/2 帧结构包含长度、类型、标志和流 ID,TCP 保证帧的顺序交付。
- Go 中默认
net/http
包支持 HTTP/2(HTTPS),可通过设置启用未加密的 HTTP/2 或使用golang.org/x/net/http2
包。
重要细节:
- HTTP/1.1 中请求需按顺序发送,响应按相同顺序返回,存在线头阻塞问题,导致资源浪费和延迟。
- HTTP/2 中奇数流 ID 用于客户端发起的请求,偶数流 ID 用于服务器发起的功能,流 ID 0 用于连接级控制帧。
WINDOW_UPDATE
、PING
、PRIORITY
和RST_STREAM
帧用于流控制和错误处理。- Go 中
DefaultTransport
默认开启ForceAttemptHTTP2
,可通过设置protocols.SetUnencryptedHTTP2(true)
启用未加密的 HTTP/2。 golang.org/x/net/http2
包可提供更多 HTTP/2 控制选项,如设置最大并发流数等。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。