IPv6 Internet 协议第六版 规范( 四 )


在本文中定义的仅有的 Hop-by-Hop 选项是填充1 及填充N 选项 。
4.4 路由首部
路由首部用于IPv6源节点列出到包的目的节点的路径中所应"访问"的一个或多个中间节点 。这一功能十分类似于 IPv4 的松散源地址和路由记录选项 。前面的首部中"下一个首部"字段中的值为 43 表示下一个首部为路由首部 。路由首部具有如下的格式:
下一个首部
8 位选择器 。标识紧跟在路由首部后面的首部的类型 。使用与 IPv4 协议字段相同的数值 。
首部扩展长度
8 位无符号整数 。以 8 个八位组为单位的路由首部的长度,不包括开始的 8 个八位组 。
路由类型
8 位的某种特定路由首部变量的标识符 。
分段剩余
8 位无符号整数 。剩余的路由分段的数量 。也就是在到达最终的目的节点之前仍然应当访问的,明确列出的中间节点的数量 。
特定类型的数据
可变长度字段 。其格式由路由类型决定,其长度须使整个路由首部的长度为 8 个八位组的整数倍 。
假如节点在处理收到的包的过程中碰到了含有无法识别的路由类型值的路由首部,节点应根据分段剩余字段中的值进行处理,如下所述:假如分段剩余值是零,节点必须忽略路由首部,继续处理包中的下一个首部,其类型由路由首部中的"下一个首部"字段中的值来标识 。假如分段剩余值非零,节点必须抛弃这个包,并且给包的源地址发送一个 ICMP"参数存在问题",编码 0 的报文,指针指向无法识别的路由类型 。假如中间节点在处理路由首部之后,确定应将包传送到一个链路 MTU 小于此包的大小的链路中去,那么中间节点必须抛弃此包,并且给包的源地址发送一个 ICMP"包太大"的报文 。
类型 0 的路由首部具有如下格式:
下一个首部
8 位选择器 。标识紧跟在路由首部后面的首部的类型 。使用与 IPv4 协议字段相同的数值 。
首部扩展长度
8 位无符号整数 。以 8 个八位组为单位的路由首部的长度,不包括开始的 8 个八位组 。对于类型 0 的路由首部,首部扩展长度等于首部中地址数量的两倍 。
路由类型
0
分段剩余
8 位无符号整数 。剩余的路由分段的数量 。也就是在到达最终的目的节点之前仍然应当访问的,明确列出的中间节点的数量 。
保留
32 位保留字段 。传输时初始化为零;接收时忽略 。
地址[1..n]
128 位地址向量,从 1 到 n 编号 。

更多的请看:http://www.qqread.com/windows/2003/index.html
不答应组播地址出现在类型 0 的路由首部中,也不答应出现在携带类型 0 路由首部的包中的IPv6目的地址字段中 。直到包到达IPv6首部中的目的地址字段所标识的那个节点才对路由首部进行检测和处理 。在这个节点调用路由首部处理模块,并且对于路由类型 0,执行下面的算法:
if 分段剩余 = 0 {继续处理包中的下一个首部,其类型由路由首部中"下一个首部"字段所标识}else if 首部扩展长度为奇数 {给源地址发送一个 ICMP "参数存在问题",编码 0 的报文,指针指向首部扩展长度字段,并且抛弃此包}else {计算出n,也就是路由首部中的地址数量 。方法是首部扩展长度除以 2if 分段剩余比 n 大 {给源地址发送一个 ICMP "参数存在问题",编码 0 的报文,指针指向分段剩余字段,并且抛弃此包}else {分段剩余减一;计算 i,也就是地址向量(地址列表)中要"访问"的下一个地址,方法是 n 减分段剩余if 地址[i] 或者IPv6目的地址是组播地址 { 抛弃此包}else { 交换IPv6目的地址和地址[i] ifIPv6跳数限制小于等于 1 {给源地址发送一个 ICMP "超时 - 传输超过跳数限制" 的报文,并且抛弃此包 } else { 跳数限制减一; 向IPv6模块重新提交此包,传给新的目的节点 }}}}作为上述算法的一个例子,考虑这样一种情况: 源节点 S 给目的节点 D 发送一个包,用路由首部来使这个包经过中间节点 I1,I2 和 I3 。在传送路径的每段中, IPv6首部中的相关字段值以及路由首部字段值应为如下所述:

推荐阅读