具有路由头的IPv6数据包中的L4校验和计算

时间:2015-02-13 15:09:56

标签: tcp routing udp ipv6 checksum

在规范中提到,如果存在路由头,则TCP / UDP伪头的计算方法如下:

"如果IPv6数据包包含路由标头,则伪标头中使用的目标地址是最终目标的目标地址。在始发节点,该地址将位于Routing报头的最后一个元素中;在收件人,该地址将在IPv6标题的目标地址字段中。"

您是否了解原始节点伪标头计算与收件人不同的工作方式?不会导致数据包在接收端被丢弃吗?

谢谢!

1 个答案:

答案 0 :(得分:0)

这样实现就是出于这个原因:确保接收方端的实际标头与计算中使用的伪标头匹配。

想象一下这样发送的IPv6数据包:

+-------------------------------------+
| IPv6 header (simplified)            |
| Source:        2001:db8::1          |
| Destination:   2001:db8:aaaa::1     |
+-------------------------------------+
| Routing options header (simplified) |
| Segments Left: 2                    |
| Address 1:     2001:db8:bbbb::1     |
| Address 2:     2001:db8:cccc::1     |
+-------------------------------------+
| Etc                                 |

将使用源2001:db8::1和目标2001:db8:cccc::1(路由头中的最后一个地址)计算第4层校验和。

它将到达2001:db8:aaaa::1,其中将交换路由头中的目标地址和第一个地址,并且Segments Left计数器将减少。导致:

+-------------------------------------+
| IPv6 header (simplified)            |
| Source:        2001:db8::1          |
| Destination:   2001:db8:bbbb::1     |
+-------------------------------------+
| Routing options header (simplified) |
| Segments Left: 1                    |
| Address 1:     2001:db8:aaaa::1     |
| Address 2:     2001:db8:cccc::1     |
+-------------------------------------+
| Etc                                 |

它将到达2001:db8:bbbb::1,其中将交换路由头中的目标地址和第二个地址,并且Segments Left计数器将减少。导致:

+-------------------------------------+
| IPv6 header (simplified)            |
| Source:        2001:db8::1          |
| Destination:   2001:db8:cccc::1     |
+-------------------------------------+
| Routing options header (simplified) |
| Segments Left: 0                    |
| Address 1:     2001:db8:aaaa::1     |
| Address 2:     2001:db8:bbbb::1     |
+-------------------------------------+
| Etc                                 |

这将到达2001:db8:cccc::1,他们会看到没有更多的片段,因此它是最终的收件人。它将使用校验和计算中主IPv6头的源地址和目标地址,这些地址与发送方使用的地址相同。因此校验和将匹配。