9. 转发 (Forwarding)
转发 (Forwarding)
当路由器接收到发送给其他节点的数据包时, 它必须考虑目标地址和源地址的区域, 如下所示:
-
目标地址的区域 由地址的作用域和数据包的到达接口确定。通过在特定于该区域的 (概念) 路由表中查找目标地址来选择下一跳接口 (见第 10 节)。该路由表被限制为仅引用属于该区域的接口。
-
源地址的区域 在选择下一跳接口后考虑。与目标地址类似, 源地址的区域由地址的作用域和数据包的到达接口确定。如果在选择的下一跳接口上传输数据包会导致数据包离开源地址的区域, 即越过源地址作用域的区域边界, 则数据包被丢弃。此外, 如果数据包的目标地址是单播地址, 则向原始数据包的源发送 ICMP 目标不可达消息 [4], 代码 2 ("beyond scope of source address" - 超出源地址作用域)。注意代码 2 目前在 [4] 中被留作未分配, 但 IANA 将重新分配该值用于新目的, [4] 将使用此更改进行修订。
注意, 即使单播站点本地地址已被弃用, 上述程序仍适用于链路本地地址。因此, 如果路由器收到发往链路本地目标地址的数据包, 该地址不是路由器在到达链路上的自身链路本地地址之一, 路由器应该尝试通过邻居发现协议 [9] 向该链路上的目标转发数据包 (服从于成功确定目标的链路层地址)。转发的数据包可以通过到达接口传输, 或通过连接到同一链路的任何其他接口。
收到地址给自己且包含路由标头 (routing header) (具有大于零的剩余段数) (第 4.4 节 [3]) 的节点首先检查路由标头中下一个地址的作用域。如果下一个地址的作用域小于原始目标地址的作用域, 节点必须丢弃数据包。否则, 它与路由标头中的下一个地址交换原始目标地址。然后上述转发规则如下适用:
-
新目标地址的区域 由下一个地址的作用域和数据包的到达接口确定。如上面第一个项目所述选择下一跳接口。
-
源地址的区域 在选择下一跳接口后考虑, 如上面第二个项目所述。
此检查关于下一个地址的作用域确保当数据包到达其最终目标时, 如果该目标是链路本地的, 接收节点可以知道数据包是在链路上发起的。这将帮助接收节点发送一个 "响应" 数据包, 将接收到的数据包的最终目标作为源地址而不打破其源区域。
注意, 虽然通常不建议, 但可以使用路由标头在之前使用的下一个地址字段中跨其相关区域边界传送非全局地址。例如, 考虑一个链路边界节点 (例如, 路由器) 接收目标为链路本地地址的数据包, 源地址为全局地址的情况。如果数据包包含路由标头, 其中下一个地址是全局地址, 到全局地址的下一跳接口可能属于不同的链路, 而不是原始目标的链路。这是允许的, 因为下一个地址的作用域不小于原始目标的作用域。