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


当包从 S 传到 I1:
源地址 = S
目的地址 = I1
首部扩展长度 = 6
分段剩余 = 3
地址[1] = I2
地址[2] = I3
地址[3] = D
当包从 I1 传到 I2:
源地址 = S
目的地址 = I2
首部扩展长度 = 6
分段剩余 = 2
地址[1] = I1
地址[2] = I3
地址[3] = D
当包从 I2 传到 I3:
源地址 = S
目的地址 = I3
首部扩展长度 = 6
分段剩余 = 1
地址[1] = I1
地址[2] = I2
地址[3] = D
当包从 I3 传到 D:
源地址 = S
目的地址 = D
首部扩展长度 = 6
分段剩余 = 0
地址[1] = I1
地址[2] = I2
地址[3] = I3
4.5 分片首部
IPv6源节点使用分片首部来发送大于去往目的节点的路径 MTU 的包 。(注重: 不同于 IPv4 的是,在IPv6里,只有包的源节点才能进行分片,传输路径中的路由器不能进行分片 ?参见第 5 章) 前面的首部中"下一个首部"字段中的值为 44 表示下一个首部为分片首部 。分片首部具有如下格式:
下一个首部
8 位选择器 。标识原包(后面有定义)中可分片部分的初始首部的类型 。使用与 IPv4 协议字段相同的数值 。
保留
8 位保留字段 。传输时初始化为零;接收时忽略 。
分片偏移量
13 位无符号整数 。以 8 个八位组为单位的,首部后面的数据相对于原包中可分片部分的开始位置处的偏移量 。
Res (保留)
2 位保留字段 。传输时初始化为零;接收时忽略 。
M 标志位
1 = 还有分片;0 = 最后一个分片 。
标识
32 位 。参见下面的说明 。
要发送大于去往目的节点的路径 MTU 的包,源节点可以将包分成若干分片,每个分片单独发送,并且在接收者处进行重组 。源节点应为每个要分片的包规定一个标识值 。这个标识值必须不同于近期之内,同一对源节点和目的节点之间其他的分片包的标识值 。假如存在路由首部,那么目的节点是指最终目的节点 。"近期之内" 是指包可能的最大生存期 。其中包括从源节点到目的节点的传输时间,以及等待与同一包的其他分片重组所花费的时间 。尽管如此,源节点并没有必要知道包的最大生存期 。它只需将标识字段值作为一个简单的32 位循环计数器,每次将包分片时计数器增加一个增量即可 。具体的实现可以自己选择是维护一个计数器还是多个计数器,还可以选择是为每个节点可能的源地址维护一个计数器,还是为每个活动的 (源地址,目的地址) 对维护一个计数器 。最初的,未分片的大数据包称为"原包" 。原包可以看作是由两部分组成的,如下所示:
原包:
不可分片部分包括IPv6首部,以及那些必须由路由中的节点处理的扩展首部 。也就是以下三种情况: 所有路由首部以前(含路由首部)的首部(假如存在的话),或者是 Hop-by-Hop 选项首部(假如存在的话),或者没有扩展首部 。包中其余的部分为可分片部分,也就是只需由包的最终目的节点处理的扩展首部,以及上层协议首部和数据 。原包中可分片部分被划分成若干分片,除去最后("最右")一个分片,每个分片都为8 个八位组的整数倍长 。这些分片由相互独立的"分片包"来传送,如下例所示:
原包:
分片包:
每个分片包由下述几部分构成:
(1) 原包中的不可分片部分 。其中原来IPv6首部中有效数据长度值只应包含本分片包的长度 (不包含IPv6首部自身的长度) 。不可分片部分中最后一个首部的"下一个首部"字段值改为 44 。
(2) 分片首部 。其中包括:其"下一个首部"值标识原包中可分片部分的第一个首部 。其分片偏移量字段 包含以 8 个八位组为单位的,本分片相对于原包中可分片部分开始位置处的偏移量 。第一个("最左")分片的分片偏移量为 0 。其 M 标志位为 0 表示这是最后("最右")一个分片,否则 M 标志位为 1 。其标识值依原包产生 。

推荐阅读