为什么 IP(v6) 路由需要下一跳 IP(v6) 地址而不仅仅是 MAC 地址?

网络工程 路由 ARP ip 链接本地 国家发展计划 下一跳
2022-02-26 03:24:12

我对您如何“要求”路由器为您路由数据包的理解是,您只需将目标主机的 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 地址!

3个回答

并非所有第 2 层协议都使用 MAC 寻址(对于那些不使用的,你会做什么?),在那些使用的协议中,有些使用 48 位 MAC 地址,有些使用 64 位 MAC 地址。您不能让网络协议依赖于任何特定的数据链路协议。

主机将使用任何方法,例如 ARP 或 NDP,将网络地址转换为数据链路地址,或者在 PPP 的情况下,没有数据链路地址。

我会用Time Bandits的一句话来回答

罗宾汉:你当强盗多久了?
Strutter:四英尺一。

[ https://www.imdb.com/title/tt0081633/quotes?item=qt0279226 ]

路由是第 3 层操作。因此,路由表包含第 3 层信息。MAC 是第 2 层地址。你不能把它放在路由表中,因为它不是第 3 层地址。这是胡说八道,就像Strutter的回答一样。

我们不会将 L2 地址放在 L3 表中,这主要是因为 L2 有大量可用的选择。虽然有人可能认为整个世界都是以太网,但事实并非如此。

Ron 的观点略有不同:

路由是网络层(L3)的一个基本概念。因此,试图发送数据包的 L3 节点需要找到到目的地的路径。为此,它查询其本地路由表,从而使用网关。如果没有,则丢弃该数据包。如果目的地在共享网络上,那么它就是它自己的网关。最后,数据包被传递到网关。

如果通往该网关的网络接口连接到点对多点网络,则“传递到网关”需要某种寻址。NDP(或 IPv4 的 ARP)只是正确使用基于 MAC 的底层链路层的机制,因此数据包可以正确传输。其他网络类型使用其他机制。