【发布时间】:2015-02-13 15:09:56
【问题描述】:
在规范中提到,如果路由头存在,TCP/UDP 伪头计算如下:
"如果 IPv6 数据包包含路由头,则伪头中使用的目标地址是最终目标的地址。在始发节点,该地址将在路由头的最后一个元素中;在接收方(s),该地址将位于 IPv6 标头的目标地址字段中。”
您了解原始节点伪标头计算与接收者不同是如何工作的吗?这不会导致数据包在接收端被丢弃吗?
谢谢!
【问题讨论】:
标签: tcp routing udp ipv6 checksum
在规范中提到,如果路由头存在,TCP/UDP 伪头计算如下:
"如果 IPv6 数据包包含路由头,则伪头中使用的目标地址是最终目标的地址。在始发节点,该地址将在路由头的最后一个元素中;在接收方(s),该地址将位于 IPv6 标头的目标地址字段中。”
您了解原始节点伪标头计算与接收者不同是如何工作的吗?这不会导致数据包在接收端被丢弃吗?
谢谢!
【问题讨论】:
标签: tcp routing udp ipv6 checksum
这样做正是出于这个原因:确保接收器端的真实标头与计算中使用的伪标头匹配。
想象一下这样发送的 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 |
第 4 层校验和将使用源 2001:db8::1 和目标 2001:db8:cccc::1(路由标头中的最后一个地址)计算。
它将到达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 标头的源地址和目标地址,这些地址与发送方使用的地址相同。因此校验和将匹配。
【讨论】: