第9章 IP选项处理

所属:TCP/IP详解 卷2:实现 来源:TCP/IP详解 卷2:实现

本章描述IP选项的处理,包括选项格式、记录路径、时间戳、源站选路等选项的输入输出处理。


9.1 引言

IP选项概述

IP选项:

  • IP首部的可选部分
  • 标准首部20字节,选项最多40字节
  • 首部长度字段(ip_hl)以4字节为单位
  • 选项必须填充成4字节的倍数

选项扩展了IP的功能。


常见的IP选项

选项类型长度说明
选项表结束01选项列表结束
无操作11填充,对齐用
安全和处理限制211安全级别
记录路径7可变记录经过的路由器
时间戳68可变记录时间
宽松源站选路131可变宽松源路由
严格源站选路137可变严格源路由

最常用的是记录路径、时间戳、源站选路。


9.2 选项格式

单字节选项

两种单字节选项:

  1. 选项表结束(类型0)

    • 标记选项列表结束
    • 后面的字节是填充
  2. 无操作(类型1)

    • 填充字节
    • 用于对齐

这两个选项只有类型字段,没有长度和数据。


多字节选项

多字节选项的格式:

+--------+--------+---------...---------+
|  类型  | 长度  |       数据          |
+--------+--------+---------...---------+
  • 类型:1字节,选项类型
  • 长度:1字节,整个选项的长度(包括类型和长度)
  • 数据:可变长度,选项数据

长度字段包含类型和长度本身。


类型字段

类型字段的位结构:

 7 6 5 4 3 2 1 0
+-+-+-+-+-+-+-+-+
|复制| 类 |选项号|
+-+-+-+-+-+-+-+-+
  • 第0位(最高位):复制标志

    • 0:不分片时只复制到第一个分片
    • 1:复制到所有分片
  • 第1-2位:选项类

    • 0:控制类
    • 2:调试和测量类
  • 第3-7位:选项号

复制标志决定分片时选项如何处理。


选项对齐

选项的对齐:

  • IP首部以4字节为单位
  • 选项部分必须填充到4字节的倍数
  • 用无操作(NOP)或结束选项填充

确保IP首部长度是4字节的倍数。


9.3 记录路径选项

什么是记录路径

记录路径(Record Route):

  • 每个经过的路由器把自己的地址记录进去
  • 发送方预留空间,接收方读取
  • 用于追踪分组经过的路径
  • 选项类型:7

记录分组经过的所有路由器地址。


选项格式

记录路径选项的格式:

+--------+--------+--------+--------+
|  类型  | 长度  | 指针  | 地址1  |
+--------+--------+--------+--------+
|          地址2 ...                |
+-----------------------------------+
  • 类型:7
  • 长度:选项总长度(3 + 4*N)
  • 指针:下一个可用位置的偏移(从选项开始算,从3开始)
  • 地址列表:预留的地址空间

指针指向下一个要写入的位置。


处理过程

发送方:

  1. 初始化选项
  2. 预留足够的地址空间
  3. 指针设为3(第一个地址的位置)

路由器:

  1. 检查指针是否超过长度
  2. 如果有空间:
    • 把出站接口地址写入指针指向的位置
    • 指针加4
  3. 如果没有空间:
    • 不写入,直接转发

接收方:

  1. 读取选项
  2. 解析记录的地址列表
  3. 可以看到经过的路径

每个经过的路由器都记录自己的地址。


限制

记录路径的限制:

  • 选项最多40字节
  • 去掉3字节头部,最多9个地址
  • 只能记录路径,不能控制路径
  • 有些路由器可能不支持

空间有限,只能记录有限的跳数。


9.4 时间戳选项

什么是时间戳

时间戳(Timestamp):

  • 记录分组经过的时间
  • 可以只记录时间,也可以记录地址+时间
  • 用于测量网络延迟
  • 选项类型:68

记录分组经过各路由器的时间。


选项格式

时间戳选项的格式:

+--------+--------+--------+--------+
|  类型  | 长度  | 指针  |溢出|标志|
+--------+--------+--------+--------+
|          时间戳数据 ...           |
+-----------------------------------+
  • 类型:68
  • 长度:总长度
  • 指针:下一个位置的偏移
  • 溢出:溢出计数(空间不够时加1)
  • 标志:时间戳类型

标志字段

标志字段的值:

标志说明
0只记录时间戳
1记录地址 + 时间戳
3指定地址,只记录指定地址的时间

不同的标志对应不同的格式。


处理过程

发送方:

  1. 初始化选项
  2. 设置标志
  3. 预留空间
  4. 指针设为5

路由器:

  1. 检查指针和空间
  2. 根据标志处理:
    • 标志0:写入时间
    • 标志1:写入地址+时间
    • 标志3:匹配地址才写入
  3. 指针增加
  4. 空间不够则溢出+1

接收方:

  1. 读取时间戳
  2. 计算延迟

可以测量各段链路的延迟。


9.5 源站选路选项

什么是源站选路

源站选路(Source Route):

  • 发送方指定路径
  • 分组按指定的路径走
  • 两种类型:
    • 宽松源站选路(LSR):可以经过其他路由器
    • 严格源站选路(SSR):必须严格按指定路径
  • 类型:131(宽松)、137(严格)

发送方控制分组的路径。


选项格式

源站选路选项的格式:

+--------+--------+--------+--------+
|  类型  | 长度  | 指针  | 地址1  |
+--------+--------+--------+--------+
|          地址2 ...                |
+-----------------------------------+
  • 类型:131(宽松)或137(严格)
  • 长度:总长度
  • 指针:下一个地址的偏移(从3开始)
  • 地址列表:路径上的地址

指针指向下一个要访问的地址。


处理过程

发送方:

  1. 填入地址列表
  2. 指针指向第一个地址(偏移4)
  3. IP目的地址设为第一个地址

路由器:

  1. 收到分组,目的地址是自己
  2. 取下一个地址作为新的目的地址
  3. 把自己的地址放回列表(指针位置)
  4. 指针加4
  5. 转发到新的目的地址

接收方:

  1. 指针超过长度,说明到达目的地
  2. 可以读取完整路径

地址列表在路径上轮换。


宽松 vs 严格

类型说明
宽松源站选路地址之间可以经过其他路由器
严格源站选路必须严格按地址顺序,不能经过其他路由器

严格源站选路要求更严格。


用途

源站选路的用途:

  • 测试特定路径的连通性
  • 绕过故障链路
  • 性能测试
  • 网络诊断

安全问题:

  • 可以绕过安全策略
  • 可以伪造路径
  • 很多网络禁用源站选路

源站选路有安全风险。


9.6 选项处理

输入处理(ip_dooptions)

IP输入时的选项处理:

  1. 检查IP首部是否有选项
  2. 调用ip_dooptions处理
  3. 遍历所有选项
  4. 根据类型分别处理
  5. 处理完后继续转发或上交

处理的选项:

  • 记录路径:记录接收接口地址
  • 时间戳:记录时间
  • 源站选路:更新下一跳
  • 其他:根据情况处理

输入时处理选项,然后决定下一步。


输出处理

IP输出时的选项处理:

  1. 应用程序可以设置选项
  2. 用IP_OPTIONS套接字选项
  3. 输出时添加到IP首部
  4. 源站选路的第一跳地址特殊处理

输出时添加选项,输入时处理选项。


选项的验证

选项验证:

  • 检查长度是否合理
  • 检查指针是否越界
  • 检查选项类型是否支持
  • 非法选项丢弃分组
  • 记录错误

确保选项的合法性。


9.7 小结

IP选项概述

  1. 选项的作用

    • 扩展IP功能
    • 最多40字节
    • 4字节对齐
  2. 常见选项

    • 结束、无操作
    • 记录路径
    • 时间戳
    • 源站选路

选项格式

  1. 单字节选项

    • 结束(0)
    • 无操作(1)
  2. 多字节选项

    • 类型 + 长度 + 数据
    • 长度包含类型和长度本身
  3. 类型字段

    • 复制标志
    • 选项类
    • 选项号

记录路径选项

  1. 功能

    • 记录经过的路由器地址
    • 发送方预留空间
    • 接收方读取
  2. 格式

    • 类型、长度、指针
    • 地址列表
  3. 处理

    • 每个路由器写入自己的地址
    • 指针后移
    • 空间有限

时间戳选项

  1. 功能

    • 记录经过的时间
    • 测量延迟
  2. 标志

    • 只记录时间
    • 地址+时间
    • 指定地址
  3. 处理

    • 每个路由器记录时间
    • 溢出计数

源站选路选项

  1. 功能

    • 发送方指定路径
    • 宽松和严格两种
  2. 格式

    • 类型、长度、指针
    • 地址列表
  3. 处理

    • 每个路由器取下一个地址
    • 替换目的地址
    • 写入自己的地址

选项处理

  1. 输入处理

    • ip_dooptions
    • 遍历选项
    • 分别处理
  2. 输出处理

    • 添加选项到首部
    • 应用程序设置
  3. 验证

    • 检查长度、指针
    • 非法选项丢弃

关键概念

  1. IP选项

    • 扩展IP功能
    • 最多40字节
    • 各种类型
  2. 记录路径

    • 记录经过的地址
    • 追踪路径
  3. 时间戳

    • 记录时间
    • 测量延迟
  4. 源站选路

    • 指定路径
    • 宽松和严格
    • 安全风险
  5. 选项处理

    • 输入处理
    • 输出处理
    • 验证

IP选项