为什么路由表中会有接口字段?

为什么路由表中会有接口字段?

假设我们有一个 IP 数据包,我们需要确定它应该通过哪个接口发送。有一个eth0(例如)与我们的数据包目标地址相对应的。

但是如果有多个数据链路层协议怎么办eth0

例如,EthernetPPPoE。我们如何确定数据包应该使用哪种协议?

答案1

我认为单个接口上不能有多个链路层。

对于 PPPoE,建立 PPP 连接会创建另一个接口,通常称为ppp0。您的路由表条目将指向ppp0不是eth0。当数据包被路由到 时ppp0,它实际上被交给了本地 PPPoE 软件,而不是被传输到任何地方。但随后 PPPoE 软件会产生一个新的它通过 传输数据包eth0

顺便说一句,这与某些 VPN 的工作方式类似。 OpenVPN例如,会创建一个名为tun0或 的新接口tap0,其“链路层”是 OpenVPN 守护进程。将数据包发送到其中一个,守护进程会对其进行加密,并将密文放入新数据包(通常是纯 UDP)中,该数据包将发送到远程 OpenVPN 服务器。该数据包经过路由过程,找到通往真实接口(如 )的路径eth0

(与 VPN 示例不同,当 PPPoE 通过 发送数据包时eth0,它不依赖路由表将数据包路由到那里,因为eth0没有配置 IP 地址,数据包无法路由到它。相反,我认为它使用原始套接字发送一个包含 PPP 有效负载的自定义以太网帧,该帧以 PPPoE 对等方的 MAC 地址为地址,不是IP 有效载荷。 RFC 2516有该协议的详细信息。)

答案2

一个接口上永远不会有超过一个数据层协议在运行(除非你正在做一些非常非常奇怪的事情)。在可能存在的情况下,几乎总是会使用某种形式的隧道或封装 - 通常会有其他虚拟接口“在其之上”。

“PPPoE” 代表以太网上的 PPP。物理接口 eth0 使用以太网作为第 2 层协议。PPP 是其上的一层,由 PPPoE 守护进程处理。因此,PPP“链路层”数据包最终封装在以太网帧中。

基本上 PPPoE 的工作方式与隧道/VPN 软件类似,正如 @Wyzard 所说。隧道在一“侧”有一个虚拟接口,中间有一个解封装软件,另一侧有一个真实接口。

因此,您将拥有一个接口(例如 ppp0 或任何其他接口),该接口连接到 PPPoE 守护进程,然后 PPPoE 守护进程封装从 ppp0 传入的内容并将其推送出 eth0。反之亦然。

需要注意的一点是,由于以太网的 MTU 为 1500,但需要为 PPPoE 头留出 8 字节的空间,因此 PPPoE 接口的 MTU 变为 1492。

您不需要直接接触 eth0,因为您希望从 eth0 输出的只是 DSL 提供商的 PPPoE 数据包。这与 VPN 或 IPv6-over-IPv4 隧道的一般概念相同。

相关内容