为什么 Mac 地址不需要全球唯一

为什么 Mac 地址不需要全球唯一

为什么这么设计(Why’s THE Design)是一系列关于计算机领域中程序设计决策的文章,我们在这个系列的每一篇文章中都会提出一个具体的问题并从不同的角度讨论这种设计的优缺点、对具体实现造成的影响。如果你有想要了解的问题,可以在文章下面留言。

MAC 地址(Media access control address)是分配给网络接口控制器(Network interface controller, NIC)的唯一标识符,它会在网络段中充当网络地址使用1,所有具有网卡的主机都有单独的 MAC 地址,该地址总共包含 48 位,占 6 字节的空间,可以表示 281,474,976,710,656 个网络设备,一个正常的 MAC 地址如下所示的格式表示,每个字节都会使用两位 16 进制的数字:

Bash
6e:77:0f:b8:8b:6b

因为 MAC 地址需要保证唯一,所以 IEEE 会根据设备的制造商分配地址段,48 位 MAC 地址的前 24 位是设备制造商的标识符2,也就是组织唯一标识符(Organizationally Unique Identifier,OUI),后面的 24 位是序列号;如果每个设备制造商都能保证在同一个命名空间中的全部 MAC 地址唯一,那么全世界所有的 MAC 地址就可以保证唯一。

mac-address

图 1 - MAC 地址

MAC 地址可以使用两种不同的格式表示,分别是 48 位的 EUI-48 和 64 位的 EUI-643,本文会使用 EUI-48 格式的 MAC 地址,EUI-64 主要用于 IPv6 协议,我们在这篇文章就不展开讨论了。在通常情况下,MAC 地址会使用 24 位表示组织的序列号,但是因为很多组织不会生产这么多的设备,所以在实际操作中会划分出三种不同大小的地址块4

what-is-a-ma-l-ma-m-ma-s-assignment

图 2 - MA-L, MA-M, MA-S

  • MA-L(MAC Address Block Large) - 包含 24 位组织标识符和 24 位地址;
  • MA-M(MAC Address Block Medium) - 包含 28 位组织标识符和 20 位地址;
  • MA-S(MAC Address Block Small) - 包含 36 位组织标识符和 12 位地址;

这三种不同大小的地址块价格也完全不同,MA-L 的注册价格为 2995 美金,而 MA-S 的注册价格为 755 美金,感兴趣并且有需要的读者可以在 IEEE 的官方购买5,在理想情况下,所有的地址加起来价值大概在 52 万亿美金左右~~,果然定义和掌握了标准就可以躺着等别人注册来赚钱~~。

这种由机构分发 MAC 地址段并由设备商保证地址唯一的方式就是为了保证全世界所有硬件的网络地址唯一,但是在实际操作中,全球唯一是无法保证的而且我们也并不需要地址的全球唯一,这主要因为以下两个原因:

  • 在不同操作系统上,我们都可以通过软件直接修改网卡的 MAC 地址;
  • 只需要保证一个局域网内的 MAC 地址不重复,网络就可以正常工作;

修改地址

无论是在 Linux 上还是在 macOS 上,修改网络设备的 MAC 地址都是非常简单的。在 Linux 操作系统中我们可以使用命令 ifconfig 修改设备上的 MAC 地址:

$ ifconfig eth0 | grep ether
        ether 6e:77:0f:b8:8b:6b  txqueuelen 1000  (Ethernet)
$ ifconfig eth0 down
$ ifconfig eth0 hw ether 6e:77:0f:b8:8b:6a
$ ifconfig eth0 up
$ ifconfig eth0 | grep ether
        ether 6e:77:0f:b8:8b:6a  txqueuelen 1000  (Ethernet)

只要我们使用上述的命令就可以轻松地修改当前网卡的 MAC 地址,不过建议不要在远程的 Linux 机器上使用,最好在本地的 Linux 上测试相关的命令,在修改测试完成之后也最好使用命令将 MAC 地址改回去;在 macOS 上修改 MAC 地址也可以使用 ifconfig 命令,使用的方式与 Linux 几乎完全相同。

因为 MAC 地址是与硬件绑定的,所以这种修改 MAC 地址的方式其实都是临时的,一旦操作系统重启,这些变更就会被系统撤销,想要让类似的变更永久生效需要在系统重启时执行相应的命令或者修改对应的网卡配置文件6

局域网通信

所有的计算机和终端设备都需要通过网络适配器连接到局域网中,每一个适配器都有唯一的链路层地址,也被叫做 LAN 地址或者 MAC 地址,MAC 地址被设计成了扁平结构,它们不会随着所处网络的不同而发生改变。

当设备的网络适配器想要向其他的适配器发送数据帧时,它会将目的适配器的 MAC 地址插入到如下所示的以太网帧中,每个以太网帧都与 IP 数据报类似,包含源地址和目标地址,只是以太网帧中的地址是 MAC 地址,而 IP 数据报中的地址是 IP 地址:

original-ethernet-frame

图 3 - 以太网帧

局域网中的数据传输不是通过网络层的 IP 地址进行路由和转发的,然而 IP 地址一般都是发送数据主机知道的唯一信息,想要在局域网中发送数据,还是需要知道它们的 MAC 地址。当我们的设备想要向其他的设备发送数据时,它会先通过 ARP(Address Resolution Protocol,地址解析协议) 在局域网中获取目的 IP 地址对应的 MAC 地址:

  1. 源主机会向当前局域网中发送 ARP 请求,目标的 MAC 地址是 FF-FF-FF-FF-FF-FF,这表示当前请求是一个广播请求,局域网内的所有设备都会收到该请求;
  2. 接收到 ARP 请求的主机都会检查目的 IP 和自己的 IP 地址是否一致;
    1. 如果 IP 地址不一致,主机会忽略当前的 ARP 请求;
    2. 如果 IP 地址一致,主机会直接向源主机发送 ARP 响应;
  3. 源主机在接收到 ARP 的响应之后,会更新本地的缓存表并继续向目的主机发送数据;

arp

图 4 - 地址解析协议

在局域网中我们一般会使用集线器(Hub)或者交换机(Switch)来连接不同的网络设备。因为在集线器连接的局域网中,所有的数据帧都会被广播给局域网内的全部主机,所以使用相同的 MAC 地址一般也不会出现太多的问题;但是交换机会学习局域网中不同设备的 MAC 地址并将数据帧转发给特定主机,所以如果局域网是由交换机构成的,就会影响网络的通信。

hub-and-switch

图 5 - 集线器和交换机

假设局域网中的具有两台 MAC 地址完全相同的网络设备 A 和 B,即 6e:77:0f:b8:8b:6b,当设备 A 想要向设备 B 发送以太网帧时会遇到如下所示的情况:

  1. 设备 A 在构造的以太网帧中将源地址和目的地址都设置为 6e:77:0f:b8:8b:6b 并向交换机发送数据;
  2. 交换机接收到了设备 A 发送的数据帧后,会从数据帧的源地址学习到设备 A 的 MAC 地址并将 6e:77:0f:b8:8b:6b -> A 这条记录插入本地缓存中;
  3. 交换机发现收到数据帧的目的地址会指向了网络设备 A,所以它会将该数据转发回 A;

因为交换机的 MAC 地址学习策略,所以我们不能在同一个局域网中使用相同的 MAC 地址,但是因为 MAC 地址是链路层网络中的概念,跨局域网的网络传输需要通过网络层的 IP 协议,所以在不同的局域网中使用相同的 MAC 地址就不存在类似的问题了。

总结

MAC 地址是链路层网络中的重要概念,在局域网中会通过 MAC 地址转发以太网数据帧,全球唯一的 MAC 地址是非常理想的情况,然而在实际的网络场景中,我们不需要保证如此强的限制:

  • MAC 地址可以通过软件进行修改,而第三方的山寨厂商不会在 IEEE 中申请独立的 MAC 地址段,它们也可能会盗用其他厂商申请的 MAC 地址;
  • 保证 MAC 地址在局域网中唯一就不会造成网络问题,不同局域网中的 MAC 地址可以相同;

上述的结论不是说全球唯一的 MAC 地址没有意义,与此相反,我们应该尽可能保证 MAC 地址的唯一,这样在组建局域网时才不需要手动确认所有设备的 MAC 地址,减少网络工程师的工作量。到最后,我们还是来看一些比较开放的相关问题,有兴趣的读者可以仔细思考一下下面的问题:

  • MAC 地址和 IP 地址之间有什么样的关系?
  • 为什么我们有了 MAC 地址还需要 IP 地址?

如果对文章中的内容有疑问或者想要了解更多软件工程上一些设计决策背后的原因,可以在博客下面留言,作者会及时回复本文相关的疑问并选择其中合适的主题作为后续的内容。


  1. Wikipedia: Mac Address https://en.wikipedia.org/wiki/MAC_address ↩︎

  2. Organizationally Unique Identifier Vendor List http://standards-oui.ieee.org/oui.txt ↩︎

  3. Creating EUI-64 based Interface Identifiers https://tools.ietf.org/html/rfc2373#page-19 ↩︎

  4. What is a MA-L, MA-M, MA-S assignment? https://macaddress.io/faq/what-is-a-ma-l-ma-m-ma-s-assignment ↩︎

  5. MAC Address Block Large (MA-L) https://standards.ieee.org/products-services/regauth/oui/index.html ↩︎

  6. How (and Why) to Change Your MAC Address on Windows, Linux, and Mac https://www.howtogeek.com/192173/how-and-why-to-change-your-mac-address-on-windows-linux-and-mac/ ↩︎

wechat-account-qrcode

转载申请

知识共享许可协议
本作品采用 知识共享署名 4.0 国际许可协议进行许可,转载时请注明原文链接,图片在使用时请保留全部内容,可适当缩放并在引用处附上图片所在的文章链接。

文章图片

你可以在 技术文章配图指南 中找到画图的方法和素材。
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: 网络通信使用硬件地址会存在很多问题,例如硬件地址可能因为网络拓扑变化而改变、扩展时需要对硬件进行重新编址、硬件故障时需要更换硬件等等。因此我们使用网络地址进行通信,网络地址可以因网络拓扑变化而动态调整,而且更加灵活方便。 ### 回答2: 不直接使用硬件地址进行通信的原因有以下几点: 1. 硬件地址唯一性限制:硬件地址MAC地址,是由网络设备的制造商分配的,全球范围内必须保证唯一性。然而,由于大量的网络设备和大规模的网络,硬件地址的分配和管理会变得非常困难和昂贵。 2. 硬件地址的局限性:硬件地址是固定的,不易更改。然而,在网络通信中可能需要更改或替换硬件设备,或者需要对网络进行管理和维护。如果直接使用硬件地址进行通信,一旦硬件设备发生变动,网络通信将会受到很大的影响。 3. 硬件地址的不具备路由功能:硬件地址只能用于本地局域网内的通信,无法跨越不同的网络传递。如果直接使用硬件地址进行通信,就无法实现跨网络的通信和数据传输,限制了网络的扩展性和可用性。 4. 硬件地址的安全性:直接使用硬件地址进行通信存在安全隐患。硬件地址是公开的,任何人都可以获取到设备的硬件地址。如果直接使用硬件地址进行通信,则无法保护通信内容的安全性和隐私性。 为了解决上述问题,网络通信使用了封装的方式,将硬件地址与逻辑地址相结合,通过IP地址进行通信。IP地址为逻辑地址,可以更方便地管理和分配。此外,使用IP地址可以实现路由功能,实现跨网络的通信和数据传输。同时,网络通信可以使用加密和认证等技术来保证通信内容的安全性和隐私性。 ### 回答3: 硬件地址,也称为MAC地址,是用于识别物理网络设备的唯一标识符。尽管硬件地址具有唯一性和稳定性的优势,但直接使用硬件地址进行通信存在以下几个问题。 首先,硬件地址是在数据链路层中的概念,是以太网协议定义的,而通信往往涉及到更高层的网络层和应用层。在网络中,数据包通常需要通过多个中间设备(如交换机、路由器)才能到达目标设备,而每个中间设备都有自己的转发表,其中记录着源地址和目标地址之间的映射关系。如果使用硬件地址进行通信,中间设备就需要不断更新转发表,这样会增加网络负担和转发时延。 其次,硬件地址独立于网络拓扑的,因此无法动态适应网络的变化。网络中的设备不断添加、删除和移动,如果直接使用硬件地址进行通信,就需要时刻更新硬件地址的映射关系。而使用更高层的网络地址(如IP地址)可以利用路由协议动态构建和更新路由表,使得网络更具有灵活性和可扩展性。 最后,直接使用硬件地址进行通信存在隐私和安全方面的问题。硬件地址唯一的,一旦暴露,就容易被恶意利用。而使用更高层的网络地址,可以通过网络地址转换(NAT)等技术隐藏内部网络的具体硬件地址,提高网络安全性。 综上所述,虽然硬件地址具有唯一性和稳定性的优势,但直接使用硬件地址进行通信会增加网络负担和时延,无法动态适应网络变化,并存在安全和隐私问题。因此,更高层的网络地址(如IP地址)更适合进行通信。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值