第 60 篇:IP选项:那些被遗忘的功能

协议深入系列第 15 篇。

上一篇我们讲了 TTL:数据包为什么需要寿命,traceroute 如何利用 TTL 一跳一跳探路。今天继续看 IPv4 首部里一个很少被现代应用碰到、但很有历史味的部分:IP Options。它曾经想让 IP 包支持记录路由、时间戳、源路由等高级能力,但今天大多成了性能和安全上的"冷门包袱"。


开场:IPv4 首部里藏过很多野心

我们平时看 IPv4 首部,最常关注的是:

  • 源 IP。
  • 目的 IP。
  • TTL。
  • Protocol。
  • Header Checksum。
  • 分片字段。

但 IPv4 首部还有一个不常见的区域:

text 复制代码
Options

也就是 IP 选项。

它允许 IPv4 包携带额外控制信息。

听起来很强。

比如:

text 复制代码
让路由器记录它经过的路径。
让路由器记录时间戳。
让发送端指定经过哪些路由器。

这些功能在协议设计上很有想象力。

但现实很骨感。

今天的互联网里,带 IP Options 的包非常少见。

很多设备看到它会慢处理。

有些设备甚至直接丢弃。

先给结论:

IPv4 Options 是 IPv4 首部中的可变长扩展字段,用于记录路由、时间戳、源路由等功能。它设计上很灵活,但会破坏快速转发路径,带来安全风险和兼容性问题,因此现代网络中极少使用,很多设备会限速、慢路径处理或过滤带 IP Options 的报文。

IP Options 像老式瑞士军刀。

功能很多。

但又重、又不好过安检。

最后大多数人选择带一把普通小刀。


IPv4 首部为什么是可变长

IPv4 首部最小 20 字节。

但它不是固定只能 20 字节。

IPv4 首部里有一个字段:

text 复制代码
IHL, Internet Header Length

IHL 表示 IPv4 首部长度。

单位是 4 字节。

常见无选项 IPv4 包:

text 复制代码
IHL = 5
首部长度 = 5 × 4 = 20 bytes

如果有 Options,IHL 会变大。

IPv4 首部最大长度是 60 字节。

所以 Options 区域最多大约:

text 复制代码
60 - 20 = 40 bytes

结构简化:

text 复制代码
IPv4 Header
+------------------------+
| Fixed Header (20B)     |
+------------------------+
| Options (0-40B)        |
+------------------------+
| Padding                |
+------------------------+
| Payload                |
+------------------------+

Options 后面可能有 Padding。

因为 IPv4 首部长度必须按 4 字节对齐。

所以如果 Options 不够整齐,就要补齐。

这就是为什么带 IP Options 的包,IPv4 首部不再是标准 20 字节。

对硬件转发来说,这很麻烦。

原来快递单固定在第一页。

现在有人把备注贴在不同位置。

自动分拣机就不开心了。


IP Options 的基本格式

IP Options 有不同类型。

有些只有 1 字节。

有些是变长结构。

常见格式大概是:

text 复制代码
+--------+
| Type   |
+--------+

或者:

text 复制代码
+--------+--------+--------+---------+
| Type   | Length | Pointer| Data... |
+--------+--------+--------+---------+

Type 字段里还包含一些子信息。

比如:

  • 是否复制到所有分片。
  • Option class。
  • Option number。

我们不用背位级细节。

工程上更重要的是知道:

text 复制代码
Options 会让 IPv4 首部变长,并要求网络设备额外解析。

这就是它变冷门的根本原因之一。

快速路径喜欢规则。

Options 喜欢例外。

规则和例外,天生不太合群。


常见 IP Options 有哪些

典型 IPv4 Options 包括:

Option 名称 作用
EOL End of Option List 选项列表结束
NOP No Operation 填充对齐
RR Record Route 记录经过的路由器地址
TS Timestamp 记录时间戳
LSRR Loose Source and Record Route 宽松源路由
SSRR Strict Source and Record Route 严格源路由
Router Alert 路由器提醒 提示路由器检查该包

其中最有名、也最有历史争议的是:

  • Record Route。
  • Timestamp。
  • Source Route。

它们听起来都很适合排障。

但真正用起来很别扭。

就像一把多功能钳。

里面有开瓶器、螺丝刀、小刀、锯子。

但你真的修机器时,还是会拿专用工具。


Record Route:让路由器记录路径

Record Route,简称 RR。

它的目标是让经过的路由器把自己的 IP 地址写进 IP Options。

理论上,你发出一个包。

每经过一个支持 RR 的路由器,路由器就把自己的地址填进去。

最后接收端能看到这个包经过了哪些路由器。

听起来像 traceroute 的亲戚。

示意:

text 复制代码
Packet Options:
[ empty ][ empty ][ empty ]

经过 R1:
[ R1 ][ empty ][ empty ]

经过 R2:
[ R1 ][ R2 ][ empty ]

经过 R3:
[ R1 ][ R2 ][ R3 ]

问题是 Options 空间很小。

IPv4 Options 最多约 40 字节。

一个 IPv4 地址 4 字节。

再扣掉 option header,能记录的路由器数量很有限。

现代互联网路径十几跳很常见。

RR 根本记不全。

所以它很尴尬。

想当路径记录仪。

内存却像便利贴。


为什么 Record Route 没有替代 traceroute

直觉上,RR 很适合看路径。

那为什么我们还用 traceroute?

原因很多。

问题 说明
空间太小 Options 最多约 40 字节,记录不了多少跳
路由器未必支持 很多设备不处理或不填写
性能影响 需要路由器修改包头,走慢路径
安全策略 可能被过滤
只记录正向路径 回程路径未必一样

traceroute 虽然也有局限,但它不要求每个路由器修改原始包。

它利用 TTL 和 ICMP,一跳一跳探测。

这更符合现代网络设备处理方式。

RR 像让每个快递站都在包裹上手写签名。

traceroute 像你每次只问一个站:

text 复制代码
我到你这里了吗?

后者更麻烦一点。

但更现实。


Timestamp:让路由器记录时间

Timestamp Option 允许路由器在包中写入时间戳。

它的设计目标是帮助测量路径上的时间信息。

听起来也很美好。

但现实问题类似:

  • Options 空间有限。
  • 路由器不一定支持。
  • 时间同步不可靠。
  • 写入时间戳影响转发性能。
  • 安全设备可能过滤。

如果每个路由器都要给包盖一个时间章,转发就不再是简单查表。

而是要进入额外处理逻辑。

现代路由器追求的是高速转发。

不是给每个包写旅行日记。

所以 Timestamp Option 也很少见。

今天我们测延迟,更多用:

  • ping。
  • traceroute。
  • TWAMP。
  • 应用层指标。
  • 分布式追踪。
  • 网络设备遥测。

而不是指望 IP Timestamp。

历史功能还在。

但主流舞台已经换人。


Source Route:让发送端指定路径

Source Route 更有争议。

它允许发送端指定数据包经过哪些路由器。

有两类:

类型 含义
LSRR Loose Source and Record Route,指定一些必须经过的点,中间可自由路由
SSRR Strict Source and Record Route,严格按指定下一跳走

听起来很强:

text 复制代码
我不让网络自己选路。
我来指定路线。

这在某些实验和早期网络场景中有意义。

但在现代互联网里,问题很大。

因为它可能绕过正常路由策略和安全边界。

比如攻击者可能尝试构造路径,绕过某些过滤设备。

所以很多系统和网络设备默认禁用 Source Route。

Linux 上也有相关设置控制是否接受源路由。

工程上可以记住一句:

text 复制代码
看到 Source Route,安全设备通常会很紧张。

它像乘客上车后对司机说:

text 复制代码
别按导航走,我指定你穿过某条小巷。

司机当然要多问一句:

text 复制代码
你想干嘛?

Router Alert:少数还有存在感的选项

并不是所有 IP Options 都完全退出历史舞台。

Router Alert 是一个相对有存在感的选项。

它的作用是提醒路由器:

text 复制代码
这个包虽然目的地不是你,但你需要看一下。

典型用途包括某些需要路由器参与处理的协议。

比如 IGMP、RSVP 等场景中可能涉及 Router Alert。

但即便如此,它也属于很特定的控制类场景。

普通业务流量不应该随便带 Router Alert。

因为这会让路由器从高速转发路径里停下来,看一眼这个包。

高速公路上你给每辆车都贴"交警请检查"。

那高速就变停车场了。

Router Alert 的名字很诚实。

它确实会让路由器警觉。

但你最好别滥用警报器。


为什么 IP Options 会影响性能

现代路由器和交换芯片喜欢固定格式。

正常 IPv4 包,首部通常是 20 字节。

硬件可以很快提取字段:

  • 目的 IP。
  • TTL。
  • Protocol。
  • 源/目的端口位置。

然后查表转发。

但如果 IPv4 首部带 Options,首部长度变了。

传输层头部位置也变了。

设备还可能需要解析 Options 内容。

这就可能导致:

text 复制代码
从快路径转到慢路径。

快路径是硬件高速处理。

慢路径可能是 CPU 或特殊处理逻辑。

结果:

  • 转发性能下降。
  • 延迟增加。
  • 被限速。
  • 被丢弃。

这就是现代网络不喜欢 IP Options 的核心原因。

它让包变成特殊病例。

医院可以处理特殊病例。

但不能让每个感冒都进 ICU。


为什么 IP Options 有安全风险

IP Options 会带来多个安全问题。

第一,绕过策略

Source Route 可能尝试绕过正常路由路径。

这会破坏安全边界假设。

第二,消耗设备资源

带 Options 的包可能进入慢路径。

攻击者可以利用大量异常包消耗路由器 CPU。

第三,探测网络内部信息

Record Route、Timestamp 这类选项可能暴露路径或设备信息。

虽然今天很多设备不响应,但风险仍然存在。

第四,解析复杂度增加

可变长字段天然更容易出现实现差异和解析漏洞。

尤其是老设备、嵌入式设备或安全设备。

所以很多网络策略会直接说:

text 复制代码
丢弃带危险 IP Options 的包。

这不是设备偷懒。

是安全和性能的综合取舍。

特殊功能越多,攻击面越大。

这是工程常识。


抓包怎么看 IP Options

普通 IPv4 包通常显示:

text 复制代码
Header Length: 20 bytes

如果有 IP Options,Wireshark 会显示更长的首部:

text 复制代码
Header Length: 24 bytes
Options: ...

或者:

text 复制代码
Header Length: 60 bytes

过滤 IPv4 Options 可以用:

text 复制代码
ip.hdr_len > 20

也可以关注具体 option。

比如 Wireshark 会解析 Record Route、Timestamp 等。

抓包时重点看:

字段 含义
IHL / Header Length IPv4 首部是否超过 20 字节
Options 具体选项类型
Padding 是否有填充
分片 Options 是否复制到分片
后续行为 是否被丢弃、RST、无响应

如果你看到某条流量莫名其妙不通,而包里带 IP Options,要高度怀疑中间设备过滤。

因为很多路径不欢迎它。

它不是普通乘客。

它像带了一堆奇怪工具箱过安检的人。


Linux 上如何看和控制 Source Route

Linux 有一些 sysctl 可以控制源路由相关行为。

比如:

bash 复制代码
sysctl net.ipv4.conf.all.accept_source_route
sysctl net.ipv4.conf.default.accept_source_route

通常生产环境不应该开启接受源路由。

也可以查看某个接口:

bash 复制代码
sysctl net.ipv4.conf.eth0.accept_source_route

如果要临时调整,命令类似:

bash 复制代码
sysctl -w net.ipv4.conf.all.accept_source_route=0

但大多数情况下,你不是要开启它。

而是确认它没被奇怪地打开。

Source Route 这种功能,默认关闭是合理的。

除非你非常明确知道自己在做实验。

不然它更像一扇后门。

门可以存在。

但别开着睡觉。


IP Options 和分片

IP Options 还和分片有关系。

某些 Option 有一个 copy 标志。

它决定该选项是否复制到所有分片。

比如一个 IPv4 数据报分片后:

text 复制代码
Fragment #1
Fragment #2
Fragment #3

某些 Options 只出现在第一个分片。

某些需要复制到每个分片。

这会进一步增加复杂度。

上一篇我们讲过,分片本来就让 NAT、防火墙、安全设备很头疼。

如果再叠加 Options,复杂度继续上升。

分片已经是拆箱。

Options 又是在箱子上贴特殊说明。

现在你要把特殊说明复制到每个小箱子。

快递员真的会沉默。


IP Options 和 traceroute 的关系

很多人会问:

text 复制代码
既然 Record Route 能记录路径,traceroute 为什么不用它?

前面说过,RR 空间太小、支持不好、容易被过滤。

所以 traceroute 主流实现仍然依赖 TTL/Hop Limit 和 ICMP。

但有些工具或系统可能支持设置 Record Route 选项。

例如某些 ping 实现曾支持 record route。

但在现代互联网中效果通常很差。

你可能只记录到一两跳。

或者完全没人理。

这不是工具坏了。

是这条路上的人不愿意在你的包裹上签名。

现代网络的路径观测更多依赖:

  • traceroute。
  • mtr。
  • BGP 数据。
  • 流日志。
  • 网络遥测。
  • 分布式 tracing。

IP Options 记录路径,已经不是主力方案。


IPv6 为什么不用 IPv4 Options 这种设计

IPv6 对扩展能力做了重新设计。

它没有像 IPv4 一样把 Options 挤在基本首部里。

IPv6 使用扩展首部:

text 复制代码
IPv6 Header
Extension Headers
Upper Layer Header
Payload

IPv6 基本首部固定 40 字节。

这让转发设备更容易处理基本字段。

扩展能力放到扩展首部里。

听起来更清晰。

但现实中,IPv6 扩展首部也面临类似问题:

  • 中间设备支持不一致。
  • 安全设备可能过滤。
  • 复杂扩展头影响性能。
  • 某些路径上兼容性不好。

所以协议设计的方向变了。

但"扩展能力 vs 快速转发/安全过滤"的矛盾仍然存在。

网络设备最喜欢的包,永远是简单、规则、好处理的包。

你越花哨,它越紧张。


为什么现代网络更喜欢上层机制

IP Options 试图在网络层做很多事情。

比如记录路径、记录时间、指定路线。

但现代系统更倾向于把这些能力放到其他层或控制面。

目标 现代常用方式
路径探测 traceroute、mtr、网络遥测
延迟观测 ping、TWAMP、应用指标
路由控制 BGP、策略路由、SDN 控制器
服务链 隧道、Segment Routing、Service Mesh
调试追踪 分布式 tracing、日志、流量镜像

为什么?

因为让每个数据包都携带特殊控制能力,成本太高。

现代网络规模巨大。

绝大多数包只需要快速转发。

少数观测和控制需求,可以用专门机制解决。

不要让每一辆车都变成路政车。

普通车就该普通地开过去。


生产环境看到 IP Options 怎么办

如果你在生产抓包里看到 IP Options,建议按步骤看。

第一步:确认是否真的有 Options

看 IPv4 Header Length 是否大于 20:

text 复制代码
ip.hdr_len > 20

第二步:确认 Option 类型

是 RR?Timestamp?Source Route?Router Alert?还是其他?

不同类型风险不同。

第三步:确认来源

看源 IP、目的 IP、应用协议、端口。

判断是正常控制协议、测试工具、扫描流量,还是异常客户端。

第四步:看中间设备行为

是否被丢弃?

是否只在某些路径失败?

是否触发防火墙或 IDS 告警?

第五步:决定策略

普通业务流量一般不应该携带 IP Options。

如果不是明确需要,可以过滤或告警。

如果是 Router Alert 等特定控制流量,需要结合协议要求放行。

不要一刀切到连正常控制协议都误伤。

也不要放任所有奇怪选项自由飞翔。

安全策略最难的是分寸。

不是音量。


典型案例一:带 IP Options 的包访问失败

现象:

text 复制代码
普通 ping 能通。
带 Record Route 的 ping 不通。

可能原因:

  • 中间设备丢弃 IP Options。
  • 防火墙策略禁止。
  • 路由器慢路径限速。
  • 目标主机忽略或不支持。

判断:

text 复制代码
这不一定是网络不通。
可能是 Options 不被路径接受。

排查:

  • 普通包和带 Options 包对比。
  • 中间路径抓包。
  • 查看防火墙日志。
  • 换不同路径测试。

这类问题很常见。

不是所有合法协议功能,都能穿过真实互联网。

合法是一回事。

被欢迎是另一回事。


典型案例二:安全设备告警 Source Route

现象:

text 复制代码
IDS/IPS 告警:IP source route option detected

处理思路:

  • 确认源地址和目的地址。
  • 判断是否来自扫描工具或异常客户端。
  • 检查是否有绕过安全策略的意图。
  • 确认边界设备是否丢弃源路由包。
  • 检查主机是否禁用 accept_source_route。

大多数生产环境中,Source Route 不应该出现。

如果出现,值得严肃对待。

它不一定是攻击成功。

但至少是一个异常信号。

像半夜有人拉你家门把手。

门没开。

但你会看监控。


典型案例三:路由器 CPU 异常升高

现象:

text 复制代码
路由器转发流量不大,但 CPU 异常升高。

可能原因之一:

text 复制代码
大量特殊包进入慢路径。

包括带 IP Options 的包。

排查方向:

  • 查看设备控制面 CPU。
  • 查看 punt/drop 计数。
  • 查看异常协议统计。
  • 抓样本包确认是否带 Options。
  • 配置 CoPP/控制面保护。

网络设备最怕大量本该高速转发的包,被迫交给 CPU 处理。

这就像自动流水线突然要求人工检查每个包裹。

量一上来,人直接崩。


典型案例四:误把 IP Options 当 TCP Options

现象:

text 复制代码
看到 Options 就以为是 TCP Options。

这是常见混淆。

IP Options 和 TCP Options 不在同一层。

类型 所在位置 常见内容
IP Options IPv4 首部 RR、Timestamp、Source Route
TCP Options TCP 首部 MSS、Window Scale、SACK、Timestamp

TCP Options 很常见。

比如 MSS、SACK、Timestamp 几乎天天见。

IP Options 很少见。

看到 Options 时,要先看是在 IP header 里,还是 TCP header 里。

不要因为名字一样就合并同类项。

一个是楼层备注。

一个是房间备注。

位置不同,意义完全不同。


常见误区

误区一:IP Options 是 TCP Options

不是。

IP Options 在 IPv4 首部。

TCP Options 在 TCP 首部。

层级不同,作用不同。

误区二:IP Options 很常用

不常用。

现代互联网中,带 IPv4 Options 的普通业务流量非常少见。

误区三:Record Route 能完整替代 traceroute

不能。

Options 空间太小,路由器支持不稳定,也容易被过滤。

误区四:Source Route 是普通调试功能

不建议这么看。

Source Route 有明显安全风险,很多环境默认禁用或过滤。

误区五:带 IP Options 只是多几个字节,不影响性能

不对。

它可能让包从硬件快路径进入慢路径,影响设备性能。

误区六:IPv6 完全没有类似问题

不准确。

IPv6 用扩展首部替代 IPv4 Options 的部分能力,但扩展首部也面临兼容性、安全和性能问题。


小结:IP Options 是协议里的老式多功能工具箱

最后收一下。

概念 重点
IP Options IPv4 首部可变长扩展字段
IHL IPv4 首部长度,带 Options 时大于 5
EOL/NOP 选项结束和填充
Record Route 记录经过路由器,空间有限,支持很差
Timestamp 记录时间戳,现代很少使用
Source Route 发送端指定路径,安全风险高
Router Alert 提醒路由器检查该包,用于特定控制协议
慢路径 带 Options 的包可能无法走硬件快速转发

IP Options 的主线是:

text 复制代码
IPv4 首部允许携带可选控制信息。
这些能力包括记录路径、时间戳、源路由等。
但它们让首部变长、解析复杂、影响转发性能。
同时带来安全风险和兼容性问题。
所以现代网络中极少用于普通业务流量。

记住一句话:

text 复制代码
IP Options 设计上很灵活,现实中很不受欢迎。

它们是 IPv4 早期设计野心的残影:功能不少,但在高速、安全、规模化的现代网络里,大多已经被更合适的机制取代。

不是所有老功能都没价值。

但有些老功能,最好只在博物馆和实验室里欣赏。


下一篇预告

下一篇我们从单个 IP 字段转向路由系统:路由协议概览:RIP/OSPF/BGP

路由器是怎么知道下一跳的?

RIP、OSPF、BGP 分别解决什么问题?

为什么互联网离不开 BGP?

下一篇继续拆。

相关推荐
IT小盘2 小时前
04-大模型流式输出原理-SSE与Python实现
开发语言·网络·人工智能·python
巨量HTTP5 小时前
Python爬虫动态换IP实战,彻底解决IP403封禁、限流问题(附完整代码)
爬虫·python·tcp/ip·http
玖玥拾5 小时前
Unity 3D 笔记(十四)Unity/C# Socket 网络笔记3
服务器·网络·unity·c#
数智化管理手记5 小时前
财务大数据怎么管住资金风险?财务大数据和财务数智化到底怎么结合?
大数据·网络·数据库·人工智能·数据挖掘
CPETW5 小时前
企业版配套软件介绍 ---- USB TO SPI_ (Excel)-Microwire
网络·科技·单片机·嵌入式硬件·电子
三8446 小时前
使用Samba/NFS实现文件共享/自动挂载共享目录/autofs自动挂载服务
linux·服务器·网络
计算机魔术师7 小时前
宇树发布轮足机器人 As2-W:6m/s速度、IP54防水、30km续航
网络·机器人
Bobolink_7 小时前
跨境网络“无限流量”套餐的真实用法,买之前先看懂细则
网络·流量·跨境网络
玖玥拾7 小时前
Unity 3D 笔记(十七)Unity/C# Socket 网络笔记6
服务器·网络·unity·c#