在网络通信中,MAC 一词应用非常广泛,可以指 MAC 协议,也可以指 MAC 控制器,还用来表示 MAC 地址,因此,今天就来系统学习一下网络通信中 MAC 相关的知识。
MAC 协议
MAC(Media Access Control,MAC)即媒体访问控制是一种网络数据传输策略,它决定了数据如何通过网线在两台计算机终端之间传输。MAC 协议的目的就是保证数据包在两台计算机终端之间的不碰撞和易于传输。主要方法有:
- 带有冲突避免的载波侦听多路访问(Carrier Sense Multiple Access with Collision Avoidance,CSMA/CA):CSMA/CA 通过将每个计算机终端配置为在传输前发出信号来避免冲突。信号由发送计算机执行,以避免碰撞。
- 载波侦听多路访问/冲突检测(Carrier Sense Multiple Access with Collision Detection,CSMA/CD):CSMA/CD 是一种争用型的介质访问控制协议,基本原理是:每个节点都共享网络传输信道,在每个站要发送数据之前,都会检测信道是否空闲,如果空闲则发送,否则就等待;在发送出信息后,则对冲突进行检测,当发现冲突时,则取消发送。
它比 CSMA/CA 更快,因为它在涉及较少数据帧传输的网络站中运行。CSMA/CD 在防止网络冲突方面不如 CSMA/CA 有效。这是因为它只检测网线中的巨大数据流量,巨大的数据流量增加了发生碰撞的可能性。 - 需求优先(Demand priority):需求优先是 CSMA/CD 的改进版,此数据控制策略使用“活动集线器”来调节网络的访问方式。需求优先级要求网络终端在传输数据之前从活动集线器获得授权。
- 令牌传递(Token passing):此媒体访问控制方法使用免费令牌传递来防止冲突。只有拥有免费令牌(即小型数据帧)的计算机才有权传输。
MAC 的相关标准定义于 IEEE Std 802.3 中。IEEE Std 802.3-1985 中规定的半双工媒体访问控制协议是带有冲突检测的载波侦听多址访问(CSMA/CD),1997 年添加了全双工 MAC 协议。双工 MAC 协议不需要使用 CSMA/CD 协议,因为采用收发线路完全分离的物理介质,点到点的连接,不存在冲突。
IEEE Std 802.3 第一部分就是对于 MAC 的定义,其中的第三节详细定义了 MAC 协议的帧格式。这个帧格式在博文 Network 之五 TCP/IP 协议族、工作流程、(TCP、IP、MAC、VLAN)常用协议格式详解 中已经介绍过了,这里就不在详细说了。
传输类型
MAC 协议在局域网上的通信数据帧可以分为单播、广播、组播三种类型来进行传输。
单播
单播(Unicast)是指从单一的源端发送到单一的目的端的通信方式。每个主机接口由一个 MAC 地址唯一标识。在一个局域网环境中,所有主机都能收到源主机发送的单播帧,但是其他主机发现目的地址与本地 MAC 地址不一致后会丢弃收到的帧,只有真正的目的主机才会接收并处理收到的帧。
广播
广播(Broadcast)表示帧从单一的源发送到局域网环境中的所有主机。广播帧的目的 MAC 地址必须全为 FF,所有收到该广播帧的主机都要接收并处理这个帧。当需要网络中的所有主机都能接收到相同的信息并进行处理的情况下,通常会使用广播方式,例如 ARP 协议就是使用广播地址。
广播方式会产生大量流量,导致带宽利用率降低,进而影响整个网络的性能。
组播
组播(Multicast)也称为多播可以理解为选择性的广播,主要用来实现在一个局域网环境中,只有部分主机响应的这种需求。主机侦听特定组播地址,接收并处理目的 MAC 地址为该组播 MAC 地址的帧。当需要网络上的一组主机(而不是全部主机)接收相同信息,并且其他主机不受影响的情况下通常会使用组播方式。
注意,这里要区分一下 IP 地址中的组播地址。根据 IANA 的定义,IPv4 组播 MAC 地址的最高 24 位是 0x01005E。第 25 位为 0,其余 23 位为 IPv4 组播地址的最低有效 23 位。IPv6 组播 MAC 地址的最高 16 位是 0x3333。从 IPv6 组播地址的最低有效 32 位映射到最低有效 32 位。因此,IPv6 到 MAC 地址映射的重复问题也会像 IPv4 到 MAC 地址映射一样出现。
MAC 控制器
MAC 控制器就是符合 MAC 协议规范的一个硬件实现。MAC 控制器工作在 OSI 七层通信模型中数据链路层的下半部分,主要负责通过定义于 IEEE Std 802.3 中的 MII、RMII 等接口控制与连接物理层的物理介质。
硬件设计
从硬件的角度看,以太网接口电路主要由 MAC(Media Access Control,MAC)控制器 和 物理层接口 PHY(Physical Layer,PHY) 两大部分构成,再加上 CPU,就形成了 CPU ⇄ MAC ⇄ PHY
的通信通道,如下图所示:
但是,在实际的设计中,以上三部分并不一定是独立分开的,也不一定是集成在一起。 由于 PHY 整合了大量模拟硬件,而 MAC 则是典型的全数字器件,同时考虑到芯片面积及模拟/数字混合架构等原因,通常,将 MAC 集成进微控制器而将 PHY 留在片外。总的来说,可分为下列几种类型:
- CPU 集成 MAC 与 PHY。目前来说并不多见,多出现在某些功能强大的 SoC 中。时至今日,随着技术的越来越完善,CPU 集成 MAC 与 PHY 的情况越来越多。
- CPU 集成 MAC,PHY 采用独立芯片。这种情况在嵌入式控制芯片中比较常见,因为嵌入式控制器芯片的成本及大小考虑,往往不会将 PHY 集成到芯片内部。
- CPU 不集成 MAC 与 PHY,而是将 MAC + PHY 形成一个独立的硬件模块(也可以将 MAC 与 PHY 集成为一个芯片)。这个模块再加上其他一些芯片就形成了网络接口控制器 (Network Interface Controller ,NIC),通常也被称为网卡(Network Interface Card)、网络适配器(Network Adapter)、LAN adapter 等。这种情况在 x86 架构下非常常见,例如我们 PC 上的网卡就是这种情况!
MAC 地址
MAC 地址(媒体访问控制地址)是分配给网络接口控制器 (Network Interface Controller ,NIC) 的唯一标识符,用于在网段内通信时用作网络地址,也称为局域网地址(LAN Address)、以太网地址(Ethernet Address)或物理地址(Physical Address)。
EUI-48
IEEE 802 MAC 地址最初称为 MAC-48,现在称为 EUI-48 标识符(Extended Unique Identifiers)。EUI-48 和 MAC-48 标识符之间的区别仅在于名称和应用。MAC-48 用于在现有的基于 802 的网络应用程序中寻址硬件接口;EUI-48 现在用于基于 802 的网络,也用于识别其他设备和软件,例如蓝牙。以下网络技术使用 EUI-48 标识符格式:
- IEEE 802 网络
- 以太网
- 802.11无线网络 ( Wi-Fi )
- 蓝牙
- IEEE 802.5令牌环
- 光纤分布式数据接口(FDDI)
- 异步传输模式(ATM),仅交换虚拟连接,作为 NSAP 地址的一部分
- 光纤通道和串行连接 SCSI (作为全球名称的一部分)
- ITU-T G.hn标准,它提供了一种使用现有家庭布线(电力线、电话线和同轴电缆)创建高速(高达 1 吉比特/秒)局域网的方法。G.hn 应用协议会聚 (APC) 层接受使用 EUI-48 格式的以太网帧并将它们封装到 G.hn 媒体访问控制服务数据单元 (MSDU) 中。
格式
IEEE 802 MAC 地址最初来自施乐网络系统以太网寻址方案,采用 48 个比特位,分为 6 组,每组 8 BIT(一个十六进制数),中间由 连字符 -
或 冒号 :
分隔开 或者 不使用任何分隔符 这三种常见格式来表示。这个48 位地址空间可能包含 248 个可能的 MAC 地址(真正用在网卡上并且全球唯一的只有 246 个)。
IEEE 802 MAC 地址的前 3 个 8 BIT 被称为组织唯一的标识符(Organizationally Unique Identifier,OUI),通常用来标识设备制造商,该部分由 IEEE 负责分配(所有分配详细列表可以在 https://standards-oui.ieee.org/oui/oui.txt 处查看),后 3 个 8 BIT 是设备制造商为其设备自定义的唯一标识。
第一个 8 BIT 的第 0 比特位被称为 I/G(Individual/Group)位,I/G = 0
表示该地址是单播地址(即某台设备的地址),I/G = 1
表示多播地址(组播 + 广播 = 多播);
第一个 8 BIT 的第 1 比特位被称为 U/L(Universal/Local)位(也称为 G/L),U/L = 0
表示全球唯一的由 IEEE 负责分配的地址(用于标识全球的制造商和供应商),U/L = 1
表示本地管理,类似于 LAN (Local Area Network) IP 地址,仅用于管理员对自己的内部网络管理。
只有在 I/G 位 和 U/L 位均为 0 的情况下的 MAC 地址才能用来表示全球唯一的设备,因此,真正用在网卡上并且全球唯一的只有 246 个。观察一下网卡的 MAC 地址,其第一个字节一般都是 4 的倍数,但是,早期以太网没有本地地址的概念,所以分配的 OUI 里面U/L 位也可能是 1。
获取
IEEE 负责分配所有的 MAC 地址。现在,IEEE 提供了三种规格的 MAC 地址分配方式,价格差别很多。如果要获取 MAC 地址,在官网 https://standards.ieee.org/products-programs/regauth/ 中有详细的介绍如何购买。
EUI-64
EUI-64 即 64 比特的 EUI,同样由 IEEE 负责分配。EUI-64 是一个产生 IPV6 接口 ID 的方式,在 IPv6 中,允许主机为自身分配唯一的 64 位 IPv6 接口标识符 (EUI-64)。EUI-64 标识符用于:
- IEEE 1394(用于高速通信和同步实时数据传输的串行总线的接口标准)
- InfiniBand
- IPv6
- Zigbee / 802.15.4 / 6LoWPAN 无线个域网
- IEEE 11073-20601(符合 IEEE 11073-20601 标准的医疗设备)
IPv6 EUI-64 格式地址也可以通过 48 位 MAC 地址来进行转换。方法是将 16 位的 0xFFFE 插入到 OUI 和 NIC 之间,从而形成 64 位 EUI 地址。IEEE 已经将 FFFE 作为保留值,该值只能出现在从 EUI-64 MAC 地址生成的 EUI-48 中。
然后,原 EUI-48 的 U/L 位需要反转。 此位标识此接口标识符是通用管理的还是本地管理的。如果为 0,则地址在本地管理,如果为 1,则地址全局唯一。
值得注意的是,在 EUI-48 中的 OUI 部分中,IEEE 分配的全局唯一地址始终设置为 0,而本地创建的地址配置了 1。因此,当位反转时,它会保持其原始作用域(全局唯一地址仍然是全局唯一地址,反之亦然)。反转的原因可以在 RFC4291 第 2.5.1 节中找到。
字节序
对于数据传输来说,数据是按每个字节中一位一位地传输的,一个字节传输完了才到下一个字节。因此,就必须要明确是先传一个字节中的高位还是低位,这关系到 EUI-48 中 I/G 位 和 U/L 位的位置。尽管不同的 IEEE 802 中不同规范要求不同,但是两种看似不一样,但是结果还是一样的。
注意,MAC 本身是一个 6 字节的序列,发送时会优先发送第一个字节。但是,在实际存储环境中,有可能是使用 4 字节单元或者 8 字节单元的存储环境,由于存在大小端问题,此时需要自行处理哪个是第一个字节。
参考
- https://www.cnblogs.com/lsgxeva/p/13932262.html
- https://en.wikipedia.org/wiki/MAC_address
- https://packetlife.net/blog/2008/aug/4/eui-64-ipv6/
- https://m.elecfans.com/article/1554014.html
- https://techhub.hpe.com/eginfolib/networking/docs/switches/5950/5200-4010_ip-multi_cg/content/499798327.htm
- https://ipcisco.com/lesson/multicast-mac-addresses/