MAC 地址为什么不需要全球唯一
MAC 地址(Media access control address)是分配给网络接口控制器(Network interface controller, NIC)的唯一标识符,它会在网络段中充当网络地址使用[^1],所有具有网卡的主机都有单独的 MAC 地址,该地址总共包含 48 位,占 6 字节的空间,可以表示 281,474,976,710,656 个网络设备,一个正常的 MAC 地址如下所示的格式表示,每个字节都会使用两位 16 进制的数字:
6e:77:0f:b8:8b:6b
因为 MAC 地址需要保证唯一,所以 IEEE 会根据设备的制造商分配地址段,48 位 MAC 地址的前 24 位是设备制造商的标识符[^2],也就是组织唯一标识符(Organizationally Unique Identifier,OUI),后面的 24 位是序列号;如果每个设备制造商都能保证在同一个命名空间中的全部 MAC 地址唯一,那么全世界所有的 MAC 地址就可以保证唯一。
MAC 地址可以使用两种不同的格式表示,分别是 48 位的 EUI-48 和 64 位的 EUI-64[^3],本文会使用 EUI-48 格式的 MAC 地址,EUI-64 主要用于 IPv6 协议,我们在这篇文章就不展开讨论了。在通常情况下,MAC 地址会使用 24 位表示组织的序列号,但是因为很多组织不会生产这么多的设备,所以在实际操作中会划分出三种不同大小的地址块[^4]:
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 地址:
局域网中的数据传输不是通过网络层的 IP 地址进行路由和转发的,然而 IP 地址一般都是发送数据主机知道的唯一信息,想要在局域网中发送数据,还是需要知道它们的 MAC 地址。当我们的设备想要向其他的设备发送数据时,它会先通过 ARP(Address Resolution Protocol,地址解析协议) 在局域网中获取目的 IP 地址对应的 MAC 地址:
源主机会向当前局域网中发送 ARP 请求,目标的 MAC 地址是
FF-FF-FF-FF-FF-FF
,这表示当前请求是一个广播请求,局域网内的所有设备都会收到该请求;接收到 ARP 请求的主机都会检查目的 IP 和自己的 IP 地址是否一致;
如果 IP 地址不一致,主机会忽略当前的 ARP 请求;
如果 IP 地址一致,主机会直接向源主机发送 ARP 响应;
源主机在接收到 ARP 的响应之后,会更新本地的缓存表并继续向目的主机发送数据;
在局域网中我们一般会使用集线器(Hub)或者交换机(Switch)来连接不同的网络设备。因为在集线器连接的局域网中,所有的数据帧都会被广播给局域网内的全部主机,所以使用相同的 MAC 地址一般也不会出现太多的问题;但是交换机会学习局域网中不同设备的 MAC 地址并将数据帧转发给特定主机,所以如果局域网是由交换机构成的,就会影响网络的通信。
假设局域网中的具有两台 MAC 地址完全相同的网络设备 A 和 B,即 6e:77:0f:b8:8b:6b
,当设备 A 想要向设备 B 发送以太网帧时会遇到如下所示的情况:
设备 A 在构造的以太网帧中将源地址和目的地址都设置为
6e:77:0f:b8:8b:6b
并向交换机发送数据;交换机接收到了设备 A 发送的数据帧后,会从数据帧的源地址学习到设备 A 的 MAC 地址并将
6e:77:0f:b8:8b:6b -> A
这条记录插入本地缓存中;交换机发现收到数据帧的目的地址会指向了网络设备 A,所以它会将该数据转发回 A;
因为交换机的 MAC 地址学习策略,所以我们不能在同一个局域网中使用相同的 MAC 地址,但是因为 MAC 地址是链路层网络中的概念,跨局域网的网络传输需要通过网络层的 IP 协议,所以在不同的局域网中使用相同的 MAC 地址就不存在类似的问题了。
总结
MAC 地址是链路层网络中的重要概念,在局域网中会通过 MAC 地址转发以太网数据帧,全球唯一的 MAC 地址是非常理想的情况,然而在实际的网络场景中,我们不需要保证如此强的限制:
MAC 地址可以通过软件进行修改,而第三方的山寨厂商不会在 IEEE 中申请独立的 MAC 地址段,它们也可能会盗用其他厂商申请的 MAC 地址;
保证 MAC 地址在局域网中唯一就不会造成网络问题,不同局域网中的 MAC 地址可以相同;
上述的结论不是说全球唯一的 MAC 地址没有意义,与此相反,我们应该尽可能保证 MAC 地址的唯一,这样在组建局域网时才不需要手动确认所有设备的 MAC 地址,减少网络工程师的工作量。到最后,我们还是来看一些比较开放的相关问题,有兴趣的读者可以仔细思考一下下面的问题:
MAC 地址和 IP 地址之间有什么样的关系?
为什么我们有了 MAC 地址还需要 IP 地址?
结语
如果您看完本文后有所收获, 还希望您随手点个在看
、或者分享转发
。您的支持是我坚持分享的最大动力!
好文和朋友一起看~
MAC 地址为什么不需要全球唯一的更多相关文章
- iOS编程——经过UUID和KeyChain来代替Mac地址实现iOS设备的唯一标示(OC版)
iOS编程——通过UUID和KeyChain来代替Mac地址实现iOS设备的唯一标示(OC版) 很多的应用都需要用到手机的唯一标示,而且要求这个唯一标示不能因为应用app的卸载或者改变而变化. 在iO ...
- MAC地址知识
1. 全球唯一无法保障. 软件工具可以修改网卡的MAC地址 2.不需要全球唯一. 只要保障局域网内不重复就行. 路由器 保证 数据在不同局域网内跳转. 如果局域网内使用集线器,那么可以设置相 ...
- Mac地址
Mac地址是每张网卡的唯一标识符,也叫物理地址.硬件地址或链路地址,由网络设备制造商生产时烧在网卡的ROM中,可以修改.现在的Mac地址一般都采用6字节48bit(还有2字节16bit的Mac地址,多 ...
- MAC地址是什么
简介: MAC(Media Access Control或者Medium Access Control)地址,意译为媒体访问控制,或称为物理地址.硬件地址,用来定义网络设备的位置.在OSI模型中,第三 ...
- php怎么获取mac地址?
如何用php获取mac地址呢?大家知道mac地址是电脑在全球范围的唯一标识,所以这个就非常实用,比如说要做一个投票功能,那mac地址是必不可少 的,如果单纯的靠ip地址来判断这个肯定是不准确的,水分太 ...
- 计算机网络四:网卡与MAC地址
网卡与MAC地址 ㈠网卡 1.网卡定义 网卡是工作在OSI的数据链路层的网络组件,是局域网中连接计算机和传输介质(网线或WIFI信号)的接口,不仅能实现与局域网传输介质之间的物理连接和电信号匹配,还涉 ...
- 网络编程懒人入门(九):通俗讲解,有了IP地址,为何还要用MAC地址?
1.前言 标题虽然是为了解释有了 IP 地址,为什么还要用 MAC 地址,但是本文的重点在于理解为什么要有 IP 这样的东西.本文对读者的定位是知道 MAC 地址是什么,IP 地址是什么. (本文同步 ...
- MAC地址与IP地址的区别
介绍一下MAC地址的知识,MAC地址和IP地址的区别以及MAC地址在实际应用中所涉及到的安全问题. 一.基础知识 如今的网络是分层来实现的,就像是搭积木一样,先设计某个特定功能的模块,然后把模块拼起来 ...
- 合法的MAC地址
以太网的地址为48位,由ieee统一分配给网卡制造商,每个网卡的地址都必须是全球唯一的.共6个字节的长度 字节 5 4 3 2 1 0 位 47..40 39..32 31..24 23..16 1 ...
随机推荐
- java中的正则表达式And Pattern And Macher
在哪里?? java.util.regex包下有两个用于正则表达式的类, 一个是Matcher类, 另一个Pattern 简单例子 public class RegexLeaning { public ...
- synchronized与Lock、volatile的区别
synchronized与volatile的区别 volatile是线程同步的轻量级实现,因此volatile性能好于synchronized voaltile修饰变量,synchronized修饰方 ...
- 为什么WAIT必须在同步块中
我们知道java的Object有wait和notify方法,如果要使用wait和notify的话,那么必须在synchronized块中,否则会抛出IllegalMonitorStateExcepti ...
- elasticsearch 的倒排索引是什么 ?
解答:通俗解释一下就可以. 传统的我们的检索是通过文章,逐个遍历找到对应关键词的位置. 而倒排索引,是通过分词策略,形成了词和文章的映射关系表,这种词典+映射表 即为倒排索引. 有了倒排索引,就能实现 ...
- Hashtable 与 HashMap 有什么不同之处?
这两个类有许多不同的地方,下面列出了一部分: a) Hashtable 是 JDK 1 遗留下来的类,而 HashMap 是后来增加的. b)Hashtable 是同步的,比较慢,但 HashMap ...
- three模型高亮外发光效果
页面效果如下: vue3+three完整代码如下: <template> </template> <script setup> import * as THREE ...
- weevely使用小结
Weevely 写在前面 由于比赛不确定会不会提供菜刀或者蚁剑,这里我稍微对weevely进行简单介绍一下,具体还是请看官方文档,官方文档讲的很详细(前提你英语嘚不错) 官方文档:https://gi ...
- 一步步搭建物联网系统——无处不在的CSS
无处不在的CSS 或许你觉得CSS一点儿也不重要,而事实上,如果说HTML是建筑的框架,CSS就是房子的装修.那么Javascript呢,我听到的最有趣的说法是小三--还是先让我们回到代码上来吧. C ...
- 小程序完整对接 pingpp支付
小程序完整对接 pingpp支付 有几个先要条件: 小程序需要企业认证且开通支付功能,个人认证是无法使用支付功能的(小程序微信支付官网) pingpp 本身接入的企业服务器(即商户服务器)并不强制要求 ...
- 让子弹飞,零成本让你的网站更快一点,boxopened http/3 (QUIC) 协议实战
最近HTTP-over-QUIC 协议被正式命名为 HTTP/3,协议带来的最大改变是协议底层将采用UDP协议,而不再是TCP协议,这样的好处吗,就是更低时延,更好的拥塞控制,更精确的RTT时间,更高 ...