卷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_RR7记录路由
IPOPT_TS68时间戳
IPOPT_LSRR131宽松源路由
IPOPT_SSRR137严格源路由
IPOPT_SECURITY130安全选项
IPOPT_SATID136流标识

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处理

  1. 检查偏移有效性
  2. 验证源路由结束
  3. 更新目的地址
  4. 记录路由信息

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选项提供记录路由、源路由和时间戳功能。源路由需要特殊处理。