跳转到内容
搜索文档

排查协议问题

最后更新 查看 MarkdownAgent 设置

本指南涵盖常见的 HTTP/2 与 HTTP/3 问题,包括源站不兼容、多路复用错误和浏览器错误,并提供诊断与解决步骤。

H2 to Origin - 源站不兼容

  • 源站的 max_concurrent_streams 在握手过程中协商。
  • 如果收到 GOAWAY(0),很可能是由于服务器重启或其他原因导致服务器拒绝新的流。
  • 更多信息请参阅 RFC 9113 - SETTINGS_MAX_CONCURRENT_STREAMS

H2 多路复用 - 源站不兼容/问题

  • 多路复用问题可能由不正确的服务器配置引起。
  • 使用 netlogs 识别 SETTINGS_MAX_CONCURRENT_STREAMS 违规或意外的 GOAWAY 帧。
  • 更多信息请参阅 Stream Concurrency Issues

通用浏览器错误

常见浏览器错误包括:

  • ERR_HTTP2_PROTOCOL_ERROR
  • ERR_HTTP3_PROTOCOL_ERROR
  • ERR_QUIC_PROTOCOL_ERROR

这些错误并不一定表示协议级问题。请按以下步骤操作:

  1. 尝试使用 HTTP/1.1 复现。
  2. 如果问题在 HTTP/1.1 中仍然存在,请先解决底层错误,再测试 HTTP/2 或 HTTP/3。
  3. 如果问题不再出现,请分析 netlog,查找 HTTP/2 或 HTTP/3 特有的问题。

更多信息请参阅 Chromium URL Request Header

Chrome 仅在 HTTP/3 上卡住或失败

如果问题仅在 Chrome 通过 HTTP/3 时复现,而禁用 HTTP/3 后消失,则问题可能与浏览器端的 QUIC 处理有关,而非您的源站服务器。这是已知的 Chrome 问题(crbug.com/41161335)——Cloudflare 的 QUIC 实现并非原因。

症状可能包括:

  • 大文件下载意外卡住。
  • 含有大量并发请求的页面挂起一到三分钟后失败。
  • 连接停止进展后,Chrome 报告 ERR_QUIC_PROTOCOL_ERRORERR_HTTP3_PROTOCOL_ERROR
  • 问题在 Firefox 或 Safari 中无法复现。
  • chrome://flags 中禁用 QUIC 后问题消失。

如何隔离问题

  1. 暂时为该 zone 禁用 HTTP/3。
  2. 再次通过 HTTP/2 测试同一请求。
  3. 如果问题在 HTTP/2 上消失,请为 Chrome 捕获 NetLog 并比较行为。

立即测试: 在 Chrome 中,前往 chrome://flags,搜索 "QUIC",将其设置为 Disabled,然后重新启动 Chrome。

解决方案

如果问题仅限于特定主机名,可以应用更有针对性的变通方法:创建 Response Header Modification Transform Rule,为受影响的主机名移除 Alt-Svc 标头。

  1. 在 Cloudflare 仪表板中,前往 Rules(规则) Overview(概览) 页面。
  2. 选择 Create rule(创建规则) > Response Header Transform Rule(响应头转换规则)
  3. 将匹配表达式设置为您的主机名:(http.host eq "example.com")
  4. Modify response header(修改响应头) 下,选择 Remove(移除),并将标头名称输入为 Alt-Svc

这会强制 Chrome 对该主机名使用 HTTP/2,而无需全局禁用 HTTP/3。不过,经过代理的主机名也可能通过生成的 HTTPS 记录通告 HTTP/3,因此在排查期间,为该 zone 禁用 HTTP/3 是强制使用 HTTP/2 的最可靠方式。

更改 Alt-Svc 后请注意,浏览器可能会将通告的替代服务缓存最长 24 小时。

这篇文档对您有帮助吗?