Max-Forwards 是什么
Max-Forwards 限制请求还能被转发多少跳:每经过一个使用该字段的代理就减一,减到 0 的节点必须直接响应而不能再转发(RFC 9110 §7.6.2)。它的主要用途是诊断——通过逐步调整跳数,判断链路上哪一跳在响应、哪一跳丢弃或改写了请求。
基本信息
| 名称 | Max-Forwards |
|---|---|
| 方向 | 请求头 |
| 规范 | RFC 9110 §7.6.2 |
| 取值范围 | 非负十进制整数 |
| 典型方法 | TRACE、OPTIONS |
| 语义 | 逐跳递减,值为 0 的节点必须直接回应 |
典型使用场景
- TRACE 排查:逐跳定位链路上每个代理的行为
- OPTIONS 探测:确认是哪一跳返回了能力信息
- 网关审计:确认中间件是否实现该字段
- 协议学习:理解逐跳头与端到端头的区别
- 排障:判断请求被哪一跳丢弃或改写
- 安全测试:验证链路对逐跳头的处理是否规范
逐跳定位
逐跳定位
# 让第 2 跳的节点直接回应(观察 Server 与 Via 判断是谁答的)
curl -si -X OPTIONS https://example.com/ -H 'Max-Forwards: 2' | head -5
# 依次尝试不同跳数,对比结果定位链路节点
for n in 0 1 2 3; do
echo "== Max-Forwards: $n"
curl -si -X OPTIONS https://example.com/ -H "Max-Forwards: $n" | grep -iE '^(HTTP|server|via)'
done逐跳头与端到端头
| 类别 | 语义 | 典型成员 |
|---|---|---|
| 逐跳 | 只作用于当前连接 | Connection、Keep-Alive、Max-Forwards、TE、Trailer、Upgrade |
| 端到端 | 需要转发到最终接收方 | Host、Authorization、Cache-Control、Content-Type |
| 由 Connection 声明 | 把任意头临时标记为逐跳 | 如 Connection: X-Debug |
| 诊断类 | 帮助定位链路节点 | TRACE、Max-Forwards、Via |
Max-Forwards 是应用层计数,与 IP TTL 不是一回事:TTL 管网络层跳数,由路由器自动递减。
支持度参差不齐:很多网关不实现它,因此「不同跳数返回相同结果」不代表链路只有一跳。
与 Via 头配合使用效果最好:Via 记录了请求经过的每一跳,可与 Max-Forwards 的递进结果互相印证。
该字段只对实现了它的节点生效,转发节点完全可以忽略,因此不能用于任何形式的访问控制。
规范要求实现该字段的代理在转发前把值减一;接收方收到 0 时必须自行应答,而不是继续转发。
它常与 OPTIONS 配合做「沿链路探测能力」:跳数越小,应答方越靠近客户端,据此可画出链路层级。