在规范中提到,如果存在路由头,则TCP / UDP伪头的计算方法如下:
"如果IPv6数据包包含路由标头,则伪标头中使用的目标地址是最终目标的目标地址。在始发节点,该地址将位于Routing报头的最后一个元素中;在收件人,该地址将在IPv6标题的目标地址字段中。"
您是否了解原始节点伪标头计算与收件人不同的工作方式?不会导致数据包在接收端被丢弃吗?
谢谢!
答案 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头的源地址和目标地址,这些地址与发送方使用的地址相同。因此校验和将匹配。