我对您如何“要求”路由器为您路由数据包的理解是,您只需将目标主机的 IP(v6)地址和您路由的路由器的 MAC 地址放在数据包上,然后发送它输出物理连接到路由器的接口(无论是直接的第 1 层以太网电缆还是更复杂的东西,例如一组交换机)。
然后路由器从 L2 以太网接收该数据包,因为它具有路由器的 MAC 地址,并且路由器上的操作系统实际上看到了该数据包(即使 NIC 未处于混杂模式),因为它具有正确的 MAC 地址。操作系统检查是否启用了 IP 转发(它是路由器),然后在路由表中找到匹配的路由,在数据包上设置新的 MAC 地址并将其发送到正确的接口。这会在每个 L3 跃点一直重复到目的地。
但是我在解释中跳过了一些东西:我在路由表中看到的每个下一跳都是一个 IP(v6) 地址——而不是 MAC 地址和接口。这意味着路由器需要进行路由表查找(针对已连接的路由),然后进行 ARP 或 NDP 以将下一跳解析为 MAC 地址和接口,然后缓存该 ARP/NDP 结果以供将来的数据包使用。
如果路由数据包真正需要的是{下一个路由器的MAC,发送它的接口},为什么需要IP(v6)地址?
为什么我不能在我的路由表“0.0.0.0/0 via 12:34:56:78:9a:bc on ether1”(或“::/0 via 12:34:56:78: 9a:bc 在 ether1")?
我可以在许多场景中看到抽象层的好处(想想如果您必须更改 253 服务器上的默认路由 MAC 地址,路由器升级会有多有趣),但为什么需要它?我在这里遗漏了一些明显的东西吗?或者它是否需要不是协议的东西,而只是迄今为止我见过的每个操作系统和网络设备供应商都非常一致的实现细节?
让我想到这一点的是 OSPFv3 及其使用本地链路 IPv6 地址创建路由的偏好,这些地址基本上只是对接口和 MAC 地址进行编码。无需费心在每个路由器接口上分配、跟踪和使用(通常是公共的)地址空间——每个接口都已经有了这些 fe80 地址!