我正在研究一些网络概念,并了解到接收主机查看以太网帧的标头以确定数据包使用的协议。这让我想知道,既然数据包头包含相同的信息,为什么以太网协议不尝试通过查看数据包头来确定正在使用的网络协议来节省帧中的空间?
感谢您的帮助!
我正在研究一些网络概念,并了解到接收主机查看以太网帧的标头以确定数据包使用的协议。这让我想知道,既然数据包头包含相同的信息,为什么以太网协议不尝试通过查看数据包头来确定正在使用的网络协议来节省帧中的空间?
感谢您的帮助!
接收器必须查看以太网帧来决定其内容,可能是 DECnet、Appletalk 或许多其他东西——互联网协议只是运行在以太网之上的众多协议之一。
在设计以太网时,未来可能存在哪些协议并不清楚,赢家通吃的影响显然也没有那么大。以太网的一个关键目标是无处不在——为了便宜,它必须无处不在,因此它被设计为对其内容完全中立。
这也是层分离的一个基本思想:每一层的代码并不查看内容的内部,它在外部有一个标签,说明它包含什么以及寻址所需的任何内容。例如,以太网帧可能会说“包含 IP”。在其有效载荷中,IP 标头有一个标签,上面写着“包含 UDP”。UDP 标头表示“包含 DNS”。DNS 程序负责决定如何处理它。如果你不这样做,那么你至少在下层复制上层的一些代码。(或者,下层需要某种机制来询问上层“这个数据包是你的吗?”。)而且,比这更糟糕的是,这然后限制了下层与下层实现者知道和关心的上层一起工作。我向你们保证,以太网设计者不知道 IPv6,它是层分离,允许轻松开发新协议。
那些痴迷于几个字节的人通常在以太网之上编写原始协议,基本上以我们可能使用 UDP 的方式使用它。当他们需要诸如端口或可靠有序的双向字节流之类的工具时,大多数人肯定会后悔并转换为 TCP 或 UDP。
这是一个历史悠久的有趣问题。最初,EtherType 字段指示帧的长度;不是有效载荷的类型。相关的维基百科文章包含一个很好的解释和参考。
MPLS 是缺少指示有效载荷类型的字段的协议的示例。这有重要的后果!尽管 MPLS LSP 两端的设备应该知道有效载荷的类型——因为 MPLS LSP 是如何发送信号的,中转设备或 P 节点不知道。
MPLS P 节点必须猜测某些操作的有效载荷类型,例如等价多路径路由。当猜测错误时,这可能会产生后果。例如,MPLS 路由器通常会将发往以 6 开头的 MAC 地址的以太网伪线流量误解为 IPv6 数据包,而不是以太网帧。这可能会导致流内意外的数据包重新排序,对于不能很好地容忍重新排序的应用程序,这可能表现为真正的问题!
这个问题非常重要,以至于路由器制造商设计了几种不同的方法 MPLS 网络可以使用来允许 MPLS ECMP 散列,而无需明确通知有效负载类型,例如流量感知传输和熵标签。