假设我们有一个 IP 数据包,我们需要确定它应该通过哪个接口发送。有一个eth0
(例如)与我们的数据包目标地址相对应的。
但是如果有多个数据链路层协议怎么办eth0
?
例如,Ethernet
和PPPoE
。我们如何确定数据包应该使用哪种协议?
答案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 隧道的一般概念相同。