<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>后端开发 on 雨的味道</title><link>https://reatang.com/categories/%E5%90%8E%E7%AB%AF%E5%BC%80%E5%8F%91/</link><description>Recent content in 后端开发 on 雨的味道</description><generator>Hugo -- gohugo.io</generator><language>zh-cn</language><lastBuildDate>Wed, 22 Apr 2026 23:20:00 +0800</lastBuildDate><atom:link href="https://reatang.com/categories/%E5%90%8E%E7%AB%AF%E5%BC%80%E5%8F%91/index.xml" rel="self" type="application/rss+xml"/><item><title>GODEBUG=http2debug=2 实战指南：Go HTTP/2 调试从入门到定位</title><link>https://reatang.com/p/go-http2-debug/</link><pubDate>Wed, 22 Apr 2026 23:20:00 +0800</pubDate><guid>https://reatang.com/p/go-http2-debug/</guid><description>&lt;p&gt;Go 的 &lt;code&gt;net/http&lt;/code&gt; 默认支持 HTTP/2，但当请求卡住、大文件上传失败、gRPC 连接偶发断开时，如何定位是协议层问题还是业务层问题？&lt;/p&gt;
&lt;p&gt;&lt;code&gt;GODEBUG=http2debug=2&lt;/code&gt; 是 Go HTTP/2 实现内部的调试开关，能把 frame 级别的收发日志打出来。这篇文章讲清楚：它输出什么、怎么读日志、如何定位问题。&lt;/p&gt;
&lt;h2 id="一它和-http2debug1-的区别"&gt;一、它和 http2debug=1 的区别
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;code&gt;http2debug=1&lt;/code&gt;：打开 verbose logs，看连接生命周期&lt;/li&gt;
&lt;li&gt;&lt;code&gt;http2debug=2&lt;/code&gt;：在 1 的基础上，额外输出 frame read/write 日志&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;实战建议：&lt;strong&gt;先用 1，不够再上 2&lt;/strong&gt;。因为 2 的日志量很大，高并发场景会淹没关键信息。&lt;/p&gt;
&lt;h2 id="二启用方式"&gt;二、启用方式
&lt;/h2&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;span class="lnt"&gt;7
&lt;/span&gt;&lt;span class="lnt"&gt;8
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 直接运行&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;GODEBUG&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;http2debug&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;2&lt;/span&gt; go run main.go
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 输出到文件&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;GODEBUG&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;http2debug&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;2&lt;/span&gt; ./your-app 2&amp;gt;http2.log
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 测试时启用&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;GODEBUG&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;http2debug&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;2&lt;/span&gt; go &lt;span class="nb"&gt;test&lt;/span&gt; -run TestName -v ./...
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id="三什么时候该开"&gt;三、什么时候该开
&lt;/h2&gt;&lt;p&gt;以下场景优先考虑：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;请求卡住不返回&lt;/strong&gt; — 可能是 HEADERS 发了但 DATA 没发完，或流控窗口耗尽&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;gRPC 偶发断连&lt;/strong&gt; — keepalive policy 不匹配，或中间代理行为异常&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;大文件上传/下载异常&lt;/strong&gt; — 流控、stream reset、连接被 GOAWAY&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;HTTP/1.1 正常，HTTP/2 异常&lt;/strong&gt; — 典型的协议层问题&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="四先确认是不是-http2-问题"&gt;四、先确认是不是 HTTP/2 问题
&lt;/h2&gt;&lt;p&gt;别一上来就淹没在 frame 日志里。先做两件事：&lt;/p&gt;
&lt;h3 id="1-确认当前走的是-http2"&gt;1. 确认当前走的是 HTTP/2
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// 客户端&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;fmt&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;proto:&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;resp&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Proto&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// 服务端&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;fmt&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;request proto:&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;r&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Proto&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;如果显示 &lt;code&gt;HTTP/2.0&lt;/code&gt;，那开 &lt;code&gt;http2debug=2&lt;/code&gt; 是对路的。&lt;/p&gt;
&lt;h3 id="2-用禁用-http2-做-ab-对照"&gt;2. 用禁用 HTTP/2 做 A/B 对照
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 客户端禁用&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;GODEBUG&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;http2client&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt; ./client
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 服务端禁用&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;GODEBUG&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;http2server&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt; ./server
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;如果关掉 HTTP/2 后恢复正常，问题就在协议层。&lt;/p&gt;
&lt;h2 id="五日志里会看到什么"&gt;五、日志里会看到什么
&lt;/h2&gt;&lt;p&gt;核心 frame 类型：&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Frame&lt;/th&gt;
&lt;th&gt;作用&lt;/th&gt;
&lt;th&gt;关注点&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;SETTINGS&lt;/td&gt;
&lt;td&gt;连接参数交换&lt;/td&gt;
&lt;td&gt;有没有正常交换和 ACK&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;HEADERS&lt;/td&gt;
&lt;td&gt;请求/响应头&lt;/td&gt;
&lt;td&gt;stream 编号、是否带 END_STREAM&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DATA&lt;/td&gt;
&lt;td&gt;请求/响应体&lt;/td&gt;
&lt;td&gt;是否持续发送、是否突然停止&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;WINDOW_UPDATE&lt;/td&gt;
&lt;td&gt;流控&lt;/td&gt;
&lt;td&gt;窗口是否增长、DATA 停住前是否有更新&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PING&lt;/td&gt;
&lt;td&gt;探活/keepalive&lt;/td&gt;
&lt;td&gt;是否有 ACK&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;RST_STREAM&lt;/td&gt;
&lt;td&gt;单流终止&lt;/td&gt;
&lt;td&gt;谁发的、为什么&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GOAWAY&lt;/td&gt;
&lt;td&gt;连接级关闭&lt;/td&gt;
&lt;td&gt;LastStreamID、错误码&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="六日志阅读方法按-stream-id-重建生命周期"&gt;六、日志阅读方法：按 stream id 重建生命周期
&lt;/h2&gt;&lt;p&gt;HTTP/2 是多路复用的，日志会交错。&lt;strong&gt;不要按时间全局扫，要按 stream id 过滤&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;假设怀疑 stream 13：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;grep &lt;span class="s1"&gt;&amp;#39;stream=13\|StreamID=13&amp;#39;&lt;/span&gt; http2.log
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;然后重建生命周期：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;请求 HEADERS 什么时候发&lt;/li&gt;
&lt;li&gt;DATA 有没有持续&lt;/li&gt;
&lt;li&gt;WINDOW_UPDATE 有没有&lt;/li&gt;
&lt;li&gt;响应 HEADERS 有没有回来&lt;/li&gt;
&lt;li&gt;最后是 END_STREAM 还是 RST_STREAM/GOAWAY&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;每个异常请求都要回答四个问题：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;请求有没有真正发出去？&lt;/li&gt;
&lt;li&gt;对端有没有真正接收并响应？&lt;/li&gt;
&lt;li&gt;中途是谁先终止的？&lt;/li&gt;
&lt;li&gt;是单流问题还是整连接问题？&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="七典型排障模板"&gt;七、典型排障模板
&lt;/h2&gt;&lt;h3 id="模板-1请求卡住不返回"&gt;模板 1：请求卡住不返回
&lt;/h3&gt;&lt;p&gt;看 stream 的 HEADERS → DATA → WINDOW_UPDATE → 响应 HEADERS&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;只有请求 HEADERS，没有响应 HEADERS&lt;/strong&gt;：服务端没处理到，或中间代理没转发&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;DATA 发到一半停了&lt;/strong&gt;：流控窗口用尽，检查 WINDOW_UPDATE&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;响应头回来了，但响应体不结束&lt;/strong&gt;：服务端没发带 END_STREAM 的最终帧&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="模板-2大文件上传失败"&gt;模板 2：大文件上传失败
&lt;/h3&gt;&lt;p&gt;看 DATA → WINDOW_UPDATE → RST_STREAM → GOAWAY&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;大量 DATA 后突然 RST_STREAM&lt;/strong&gt;：服务端拒绝请求体，或代理层 body 限制&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;DATA 发不动但连接不关闭&lt;/strong&gt;：典型流控卡死&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;连接级 GOAWAY&lt;/strong&gt;：不只是这一个请求的问题&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="模板-3grpc-keepalive-异常"&gt;模板 3：gRPC keepalive 异常
&lt;/h3&gt;&lt;p&gt;看 PING → PING ACK → GOAWAY&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;客户端发 PING，服务端不 ACK&lt;/strong&gt;：中间层吞掉，或服务端策略不允许&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;PING 后紧接 GOAWAY&lt;/strong&gt;：keepalive policy 不匹配&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="八常见误区"&gt;八、常见误区
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;❌ &lt;strong&gt;看到 GOAWAY 就等于崩了&lt;/strong&gt; — 它是&amp;quot;连接进入收尾阶段&amp;quot;，要看错误码&lt;/li&gt;
&lt;li&gt;❌ &lt;strong&gt;看到 RST_STREAM 就是服务端 bug&lt;/strong&gt; — 客户端取消、超时、代理拒绝都可能导致&lt;/li&gt;
&lt;li&gt;❌ &lt;strong&gt;没有报错就不是协议问题&lt;/strong&gt; — HTTP/2 很多问题是&amp;quot;安静地挂住&amp;quot;&lt;/li&gt;
&lt;li&gt;❌ &lt;strong&gt;HTTP/2 日志能替代抓包&lt;/strong&gt; — 它是 Go 实现视角，网络层问题还得抓包&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="九调试清单"&gt;九、调试清单
&lt;/h2&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;[ ] 确认当前请求是否走 HTTP/2
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;[ ] 用 http2client=0 / http2server=0 做 A/B 对照
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;[ ] 开 http2debug=1 看粗粒度
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;[ ] 开 http2debug=2 看 frame
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;[ ] 按 stream id 重建请求生命周期
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;[ ] 找最后一个正常 frame 和第一个异常 frame
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;[ ] 区分单流问题（RST_STREAM）还是连接问题（GOAWAY）
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;[ ] 检查 DATA / WINDOW_UPDATE 判断流控
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;[ ] 检查 PING / ACK 判断 keepalive
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;[ ] 结合业务日志、代理日志、超时配置回溯根因
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id="小结"&gt;小结
&lt;/h2&gt;&lt;p&gt;&lt;code&gt;GODEBUG=http2debug=2&lt;/code&gt; 的核心不是背 frame 名字，而是形成判断模型：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;HEADERS&lt;/strong&gt; — 请求/响应开始没开始&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;DATA&lt;/strong&gt; — 正文有没有真的流动&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;WINDOW_UPDATE&lt;/strong&gt; — 是不是流控卡住&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;RST_STREAM&lt;/strong&gt; — 是不是单请求被终止&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;GOAWAY&lt;/strong&gt; — 是不是整连接进入关闭&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;最有效的实战技巧：&lt;strong&gt;先用 http2client=0 / http2server=0 做二分，再用 http2debug=2 按 stream id 重建生命周期&lt;/strong&gt;。&lt;/p&gt;</description></item></channel></rss>