HTTP/2 如何工作以及如何在 Go 中启用它

主要观点

  • 介绍 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_UPDATEPINGPRIORITYRST_STREAM帧用于流控制和错误处理。
  • Go 中DefaultTransport默认开启ForceAttemptHTTP2,可通过设置protocols.SetUnencryptedHTTP2(true)启用未加密的 HTTP/2。
  • golang.org/x/net/http2包可提供更多 HTTP/2 控制选项,如设置最大并发流数等。
阅读 9
0 条评论