卷2 第9章 IP选项处理
9.1 引言
IP选项位于标准首部之后,最多40字节。每个路由器都要处理。
9.2 代码介绍
netinet/ip.h:选项定义netinet/ip_var.h:实现定义netinet/ip_options.c:选项处理netinet/ip_output.c:选项插入
9.3 选项格式
单字节选项
- EOL(0):选项表结束
- NOP(1):无操作
多字节选项
+--------+--------+--------+--------+ | type | len | data… | +--------+--------+--------+--------+
text
选项类型
| 选项 | 值 | 说明 |
|---|---|---|
| IPOPT_RR | 7 | 记录路由 |
| IPOPT_TS | 68 | 时间戳 |
| IPOPT_LSRR | 131 | 宽松源路由 |
| IPOPT_SSRR | 137 | 严格源路由 |
| IPOPT_SECURITY | 130 | 安全选项 |
| IPOPT_SATID | 136 | 流标识 |
Copied标志
- 分片时复制到所有分片:LSRR、SSRR
- 仅在第一片中:RR、TS
9.4 ip_dooptions函数
- 处理已知选项
- EOL/NOP快速处理
- 未知选项跳过
9.5 记录路由选项
格式
+--------+--------+--------+--------+ | type=7 | len | ptr | IP1 | +--------+--------+--------+--------+ | IP2… | +--------+--------+--------+--------+
text
- 最多9个IP地址
- 每个路由器记录出口地址
ip_rtaddr函数
- 查找路由
- 返回出口接口地址
9.6 源站和记录路由选项
LSRR处理
- 检查偏移有效性
- 验证源路由结束
- 更新目的地址
- 记录路由信息
save_rt函数
- 保存源路由
- 用于响应时反向路由
ip_srcroute函数
- 逆转源路由
- 返回m_buf
9.7 时间戳选项
三种类型
| 标志 | 说明 |
|---|---|
| 0 | 仅时间戳 |
| 1 | 地址+时间戳 |
| 2 | 保留 |
| 3 | 预指定地址 |
ip_timestamp结构
struct ip_timestamp {
u_char ipt_code;
u_char ipt_len;
u_char ipt_ptr;
u_char ipt_flg:4;
u_char ipt_of:4;
};9.8 ip_insertoptions函数
插入选项到输出数据报
处理源路由第一跳
分配新mbuf(如需要)
9.9 ip_pcbopts函数
处理IP_OPTIONS插口选项
转换LSRR/SSRR格式
9.10 一些限制
IP首部最大60字节
选项最多40字节
限制RR和TS的实用范围
9.11 小结
IP选项提供记录路由、源路由和时间戳功能。源路由需要特殊处理。