第9章 IP选项处理
所属:TCP/IP详解 卷2:实现 来源:TCP/IP详解 卷2:实现
本章描述IP选项的处理,包括选项格式、记录路径、时间戳、源站选路等选项的输入输出处理。
9.1 引言
IP选项概述
IP选项:
- IP首部的可选部分
- 标准首部20字节,选项最多40字节
- 首部长度字段(ip_hl)以4字节为单位
- 选项必须填充成4字节的倍数
选项扩展了IP的功能。
常见的IP选项
| 选项 | 类型 | 长度 | 说明 |
|---|---|---|---|
| 选项表结束 | 0 | 1 | 选项列表结束 |
| 无操作 | 1 | 1 | 填充,对齐用 |
| 安全和处理限制 | 2 | 11 | 安全级别 |
| 记录路径 | 7 | 可变 | 记录经过的路由器 |
| 时间戳 | 68 | 可变 | 记录时间 |
| 宽松源站选路 | 131 | 可变 | 宽松源路由 |
| 严格源站选路 | 137 | 可变 | 严格源路由 |
最常用的是记录路径、时间戳、源站选路。
9.2 选项格式
单字节选项
两种单字节选项:
-
选项表结束(类型0)
- 标记选项列表结束
- 后面的字节是填充
-
无操作(类型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开始)
- 地址列表:预留的地址空间
指针指向下一个要写入的位置。
处理过程
发送方:
- 初始化选项
- 预留足够的地址空间
- 指针设为3(第一个地址的位置)
路由器:
- 检查指针是否超过长度
- 如果有空间:
- 把出站接口地址写入指针指向的位置
- 指针加4
- 如果没有空间:
- 不写入,直接转发
接收方:
- 读取选项
- 解析记录的地址列表
- 可以看到经过的路径
每个经过的路由器都记录自己的地址。
限制
记录路径的限制:
- 选项最多40字节
- 去掉3字节头部,最多9个地址
- 只能记录路径,不能控制路径
- 有些路由器可能不支持
空间有限,只能记录有限的跳数。
9.4 时间戳选项
什么是时间戳
时间戳(Timestamp):
- 记录分组经过的时间
- 可以只记录时间,也可以记录地址+时间
- 用于测量网络延迟
- 选项类型:68
记录分组经过各路由器的时间。
选项格式
时间戳选项的格式:
+--------+--------+--------+--------+
| 类型 | 长度 | 指针 |溢出|标志|
+--------+--------+--------+--------+
| 时间戳数据 ... |
+-----------------------------------+
- 类型:68
- 长度:总长度
- 指针:下一个位置的偏移
- 溢出:溢出计数(空间不够时加1)
- 标志:时间戳类型
标志字段
标志字段的值:
| 标志 | 说明 |
|---|---|
| 0 | 只记录时间戳 |
| 1 | 记录地址 + 时间戳 |
| 3 | 指定地址,只记录指定地址的时间 |
不同的标志对应不同的格式。
处理过程
发送方:
- 初始化选项
- 设置标志
- 预留空间
- 指针设为5
路由器:
- 检查指针和空间
- 根据标志处理:
- 标志0:写入时间
- 标志1:写入地址+时间
- 标志3:匹配地址才写入
- 指针增加
- 空间不够则溢出+1
接收方:
- 读取时间戳
- 计算延迟
可以测量各段链路的延迟。
9.5 源站选路选项
什么是源站选路
源站选路(Source Route):
- 发送方指定路径
- 分组按指定的路径走
- 两种类型:
- 宽松源站选路(LSR):可以经过其他路由器
- 严格源站选路(SSR):必须严格按指定路径
- 类型:131(宽松)、137(严格)
发送方控制分组的路径。
选项格式
源站选路选项的格式:
+--------+--------+--------+--------+
| 类型 | 长度 | 指针 | 地址1 |
+--------+--------+--------+--------+
| 地址2 ... |
+-----------------------------------+
- 类型:131(宽松)或137(严格)
- 长度:总长度
- 指针:下一个地址的偏移(从3开始)
- 地址列表:路径上的地址
指针指向下一个要访问的地址。
处理过程
发送方:
- 填入地址列表
- 指针指向第一个地址(偏移4)
- IP目的地址设为第一个地址
路由器:
- 收到分组,目的地址是自己
- 取下一个地址作为新的目的地址
- 把自己的地址放回列表(指针位置)
- 指针加4
- 转发到新的目的地址
接收方:
- 指针超过长度,说明到达目的地
- 可以读取完整路径
地址列表在路径上轮换。
宽松 vs 严格
| 类型 | 说明 |
|---|---|
| 宽松源站选路 | 地址之间可以经过其他路由器 |
| 严格源站选路 | 必须严格按地址顺序,不能经过其他路由器 |
严格源站选路要求更严格。
用途
源站选路的用途:
- 测试特定路径的连通性
- 绕过故障链路
- 性能测试
- 网络诊断
安全问题:
- 可以绕过安全策略
- 可以伪造路径
- 很多网络禁用源站选路
源站选路有安全风险。
9.6 选项处理
输入处理(ip_dooptions)
IP输入时的选项处理:
- 检查IP首部是否有选项
- 调用ip_dooptions处理
- 遍历所有选项
- 根据类型分别处理
- 处理完后继续转发或上交
处理的选项:
- 记录路径:记录接收接口地址
- 时间戳:记录时间
- 源站选路:更新下一跳
- 其他:根据情况处理
输入时处理选项,然后决定下一步。
输出处理
IP输出时的选项处理:
- 应用程序可以设置选项
- 用IP_OPTIONS套接字选项
- 输出时添加到IP首部
- 源站选路的第一跳地址特殊处理
输出时添加选项,输入时处理选项。
选项的验证
选项验证:
- 检查长度是否合理
- 检查指针是否越界
- 检查选项类型是否支持
- 非法选项丢弃分组
- 记录错误
确保选项的合法性。
9.7 小结
IP选项概述
-
选项的作用
- 扩展IP功能
- 最多40字节
- 4字节对齐
-
常见选项
- 结束、无操作
- 记录路径
- 时间戳
- 源站选路
选项格式
-
单字节选项
- 结束(0)
- 无操作(1)
-
多字节选项
- 类型 + 长度 + 数据
- 长度包含类型和长度本身
-
类型字段
- 复制标志
- 选项类
- 选项号
记录路径选项
-
功能
- 记录经过的路由器地址
- 发送方预留空间
- 接收方读取
-
格式
- 类型、长度、指针
- 地址列表
-
处理
- 每个路由器写入自己的地址
- 指针后移
- 空间有限
时间戳选项
-
功能
- 记录经过的时间
- 测量延迟
-
标志
- 只记录时间
- 地址+时间
- 指定地址
-
处理
- 每个路由器记录时间
- 溢出计数
源站选路选项
-
功能
- 发送方指定路径
- 宽松和严格两种
-
格式
- 类型、长度、指针
- 地址列表
-
处理
- 每个路由器取下一个地址
- 替换目的地址
- 写入自己的地址
选项处理
-
输入处理
- ip_dooptions
- 遍历选项
- 分别处理
-
输出处理
- 添加选项到首部
- 应用程序设置
-
验证
- 检查长度、指针
- 非法选项丢弃
关键概念
-
IP选项
- 扩展IP功能
- 最多40字节
- 各种类型
-
记录路径
- 记录经过的地址
- 追踪路径
-
时间戳
- 记录时间
- 测量延迟
-
源站选路
- 指定路径
- 宽松和严格
- 安全风险
-
选项处理
- 输入处理
- 输出处理
- 验证