8.1 Upper-Layer Checksums (上层校验和)
在其校验和计算中包含来自 IP 报头的地址的任何传输或其他上层协议必须进行修改以在 IPv6 上使用, 以包含 128 位 IPv6 地址而不是 32 位 IPv4 地址.特别是, 以下插图显示了 IPv6 的 TCP 和 UDP "pseudo-header (伪报头)":
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| |
+ +
| |
+ Source Address +
| |
+ +
| |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| |
+ +
| |
+ Destination Address +
| |
+ +
| |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Upper-Layer Packet Length |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| zero | Next Header |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
o 如果 IPv6 分组包含 Routing header, 则伪报头中使用的 Destination Address 是最终目的地的地址.在发起节点, 该地址将位于 Routing header 的最后一个元素中; 在接收方, 该地址将位于 IPv6 报头的 Destination Address 字段中.
o 伪报头中的 Next Header 值标识上层协议 (例如, TCP 为 6, UDP 为 17).如果 IPv6 报头和上层报头之间存在扩展报头, 它将与 IPv6 报头中的 Next Header 值不同.
o 伪报头中的 Upper-Layer Packet Length 是上层报头和数据的长度 (例如, TCP 报头加 TCP 数据).一些上层协议携带它们自己的长度信息 (例如, UDP 报头中的 Length 字段); 对于这样的协议, 伪报头中使用的长度就是这个长度.其他协议 (如 TCP) 不携带它们自己的长度信息, 在这种情况下, 伪报头中使用的长度是 IPv6 报头的 Payload Length 减去 IPv6 报头和上层报头之间存在的任何扩展报头的长度.
o 与 IPv4 不同, 当 UDP 分组由 IPv6 节点发起时, UDP 校验和不是可选的.也就是说, 每当发起 UDP 分组时, IPv6 节点必须计算分组和伪报头的 UDP 校验和, 并且如果该计算产生零的结果, 则必须将其更改为十六进制 FFFF 以放置在 UDP 报头中.IPv6 接收方必须丢弃包含零校验和的 UDP 分组, 并且应该记录该错误.
IPv6 版本的 ICMP [ICMPv6] 在其校验和计算中包含上述伪报头; 这是与 IPv4 版本 ICMP 的变化, 后者在其校验和中不包含伪报头.更改的原因是保护 ICMP 免受 IPv6 报头中它所依赖的那些字段的错误传递或损坏, 与 IPv4 不同, 这些字段不被互联网层校验和覆盖.ICMP 的伪报头中的 Next Header 字段包含值 58, 它标识 IPv6 版本的 ICMP.