关于以太网帧的字节和位顺序的混淆

网络工程 以太网 MAC地址
2022-02-12 13:48:50

我理解关于数字的 Endianess 的概念,因为位的意义是明确定义的。但是当应用于以太网帧或 Mac 地址之类的东西时,我就很清楚了,因为这里我们只有一个位序列,而不是一个数字。然而,诸如第一个字节、最重要字节或网络字节排序之类的术语在没有澄清的情况下被抛出。

我的问题实际上由几个但相关的问题组成,因为我想不出更好的方法来表述它:

  1. 如何为以太网帧定义字节重要性?我们是否将从 MAC 目的地开始的字节算作最重要的字节?我认为应该是这种情况,因为我读到网络字节顺序是大字节序,所以最重要的字节首先被传输,它应该是 MAC 目标地址。

  2. MAC地址的字节意义如何定义?给定一个写为 00-14-22-01-23-45 的 MAC 地址,那么我假设从最高有效字节到最低有效字节是从左到右?什么算作第一个字节?如果我们说某事的第一个,这是否意味着我们说某事中最重要的?

  3. 如果我的电脑使用的是Little Endian,并且上面的Mac地址存储在内存中,那么如果我的假设是正确的,那么内存偏移量0x00应该存储45,因为这就是Little Endian的意思,对吗?

  4. 现在如果上面的地址通过线路传输,由于 Big-Endian,内存偏移量 0x05 首先被传输,因为它存储了地址的最重要字节?这对我来说似乎有点奇怪,因为我最初认为我们只是从最低内存偏移量顺序传输到最高内存偏移量。

  5. 当谈到在一个字节内传输一个位时,我们应该有两个选择:我们先传输最低有效位,或者先传输最高有效位。那么位字节序不应该在这里起作用吗?

  6. 标题在接收端看起来如何?接收计算机是否只是将它接收到的第一个字节存储在最低内存地址等等,还是它知道字节重要性会自动翻转字节?例如在这种情况下,如果它收到的第一个字节是 0x45,那么它是否将值存储在 0x00,或者知道 0x45 应该是最重要的字节,自动将值存储在 0x05?(假设接收端也使用小端)

2个回答

检查IEEE 802.3第 3 条:

  • 每个八位字节首先传输最低有效位 (LSB)(按正常写入顺序从右到左)。(3.2.3)
  • 对于多八位字节/字节字段,首先传输最重要的八位字节(大端或按正常写入顺序从左到右)。(3.2.6)

Little-endian 计算机可以在使用内部表示时以其本机、最低有效八位字节优先格式将 MAC 地址存储在内存中,或者在编码或解码以太网帧时以以太网的最高有效八位字节优先格式存储 MAC 地址- 使用正确的格式是程序员和 API 的责任。

当然,字节顺序需要在格式之间颠倒——这可以通过(低级)应用程序、API、操作系统堆栈、网卡驱动程序甚至网卡硬件来完成。

您需要了解涉及多个标准机构,并且以太网 MAC 寻址通常由硬件处理,并且由硬件按照所使用的物理介质的正确顺序序列化字节和位。

创建以太网时,它使用最高有效字节排序,但在字节内使用最低有效位排序(首先传输最高有效字节的最低有效位)。将其与在字节内使用最高有效位排序的令牌环进行对比。物理和数据链路协议由标准机构确定,例如 IEEE(以太网、令牌环、FDDI、Wi-Fi 等)。即使在标准机构内,协议也可能会有所不同,因为它们是由不同的人在不同的时间独立创建的。

不要将物理和数据链路协议标准与 IETF 标准混淆,IETF 标准说数据首先传输最高有效字节,并且在可能的情况下,首先传输最高有效位:

3.2. 网络位顺序

对于某些低级协议或面向压缩的媒体类型,位顺序可能是一个问题。如果可能,鼓励使用 big-endian 以与网络字节顺序保持一致。

IETF 通常为网络中的协议(IPv4 和 IPv6)和传输层(TCP、UDP 等)以及一些应用层协议创建标准。

特定主机(处理器、操作系统等)如何处理字节和位顺序在这里是题外话。一般来说,编程库会为您的特定主机处理问题,但这也是题外话,您可以尝试在Stack Overflow上询问有关编程方面的问题。