数据帧在一段链路上跑,光知道"要发给哪台机器"是不够的——一台机器往往有好几个接口(有线口、Wi-Fi 口、虚拟网卡),到底从哪个口出去、进哪个口进来? 回答这件事的就是 MAC 地址。它是接口的名字,不是设备的名字。48 位、6 个字节、12 个十六进制数字,前 24 位是 IEEE 分配给厂商的编号(OUI)、后 24 位由厂商自己编号——所以一查前 3 字节就能认出厂商。它有两条要命的性质:① 出厂烧进网卡、跟接口走(换网卡就换 MAC,搬去别的网络 MAC 也不变,这一点和 IP 恰好相反);② 它是一段链路内的身份,没有"位置"含义——所以可以在一段网里指认接口,却没法拿它去跨网络找路。这就是为什么世界上需要两套地址:IP 管全程,MAC 管这一跳。
⚠️ 本节标题里那个"接口",和 2.3 说的"接口(端口)"、3.17 说的"端口号" 是三个不同的东西——本节最后会把三个"口"摆在一起分清楚。
5.2 拆帧头时已经见过那两个 6 字节的地址(目的 MAC、源 MAC),当时只说了"它们是什么",没回答"它们标的是谁"。本节就是把这两个字段扶正做主角。
- 3.2 网络接口层:当时说过"双层门牌——IP 头端到端不变、MAC 头段段更换"。为什么 MAC 只能管一段?本节的 48 位结构会给出答案
- 3.8 IP 地址:IP 地址是"跟位置走"的地址(分了网络部分和主机部分)。本节要讲的 MAC 正好相反——跟接口走、不分层
- 2.3 接口与链路:那里说的"接口 = 设备插座"是物理层面;本节说的"接口 = 用 MAC 标明的那个收发单元",是它的身份
- 2.2 设备:网卡是"出门流水线"的第一站,本节讲它身上那个被烧录进去的号
- 3.16 ARP:ARP 干的事就是"用 IP 换 MAC",换来的 MAC 正好填进本节讲的帧头
- 3.9 单播 / 广播 / 组播:MAC 地址的第一位就标着"这帧是给一个还是给一群",本节补上这一位的出处
- 3.17 端口号:那是软件端口(应用程序的门牌)。本节要把它和物理接口分清
- 5.1 / 5.2:交换机靠 MAC 送帧、路由器靠 IP 送包——这个分工的根,就在本节
一、问题的起点:帧到了链路上,怎么写"给谁"
先接上 5.2。以太网的帧头长这样:
| 目的 MAC | 源 MAC | 类型 | 数据 | FCS |
|---|---|---|---|---|
| 6 字节 | 6 字节 | 2 字节 | 46~1500 | 4 字节 |
有两个地址字段,一个写"给谁"、一个写"谁给的"。
那为什么不用 IP 地址直接写在这里?
因为这一帧只管一段路。数据从你电脑出发,要经过交换机、路由器、路由器……才到服务器。IP 地址全程不变(收 3.2),但"这一段路该交给谁"每段都不一样:你家这一段交给网关,下一段交给运营商的下一台设备,再下一段又换一个。
IP 地址管"最终要去哪台机器",MAC 地址管"这一跳交给哪个接口"。
打个比方:寄快递时,包裹上写的是收件人地址(IP,全程不变);但每一段路换一个快递员,快递员之间交接时问的是"这趟归你送还是归我送"——MAC 就是快递员的工号。
二、MAC 地址长什么样
名字先补全:MAC = Media Access Control(介质访问控制)——就是 5.2 说的"共用介质的那套规矩"。所以 MAC 地址就是这套规矩发给每个接口的编号。
它的样子是固定的:
48 位 = 6 个字节 = 12 个十六进制数字
写成文字时有三种常见写法,说的是同一个号:
| 写法 | 例子 | 常见于 |
|---|---|---|
| 连字符 | 00-1A-2B-3C-4D-5E |
Windows(ipconfig /all 里的"物理地址") |
| 冒号 | 00:1A:2B:3C:4D:5E |
Linux、macOS、Wireshark、Cisco |
| 点分三段 | 001a.2b3c.4d5e |
部分 Cisco 设备的配置 |
这 48 位不是随便编的,它分成两截(本节配图一):
| 位置 | 名称 | 谁分配 | 长度 |
|---|---|---|---|
| 前 24 位(前 3 字节) | OUI(Organizationally Unique Identifier,组织唯一标识符) | IEEE 统一分配给厂商 | 2²⁴ ≈ 1677 万 |
| 后 24 位(后 3 字节) | 序列号 | 厂商自己编号 | 2²⁴ ≈ 1677 万 |
所以同一家厂商的所有产品共用同一段前缀,靠后半截区分具体是哪一张网卡。
因为 OUI 是公开名册(IEEE 官网可查),所以拿到任何一个 MAC 地址的前 3 字节,就能查出它是哪家做的。
这件事的日常用法:
- 网络排查:交换机上看到一个陌生 MAC,查一下厂商,能大致判断这是什么设备(是台打印机?是个摄像头?还是某人的手机?)
- 识别虚拟网卡:虚拟机软件(VirtualBox、VMware)的 MAC 前缀是固定的,一查就知道这是虚拟出来的
- 安全审计:一家公司内网里出现某个不该出现的厂商前缀,可能意味着有人私接了设备
第一个字节里还藏着两个"暗号"
在 48 位里,第一个字节的最低位和次低位有特殊用途:
| 位 | 名称 | 值 | 含义 |
|---|---|---|---|
| 最低位(bit 0) | I/G 位(Individual / Group) | 0 |
单播(发给一个接口) |
1 |
组播(发给一组接口;全 F 就是广播) | ||
| 次低位(bit 1) | U/L 位(Universal / Local) | 0 |
全球唯一(IEEE 分配的正式地址) |
1 |
本地管理(软件自己定的,不保证全球唯一) |
对照着看第一个字节:
| 首字节 | 二进制 | I/G | U/L | 说明 |
|---|---|---|---|---|
00 |
0000 0000 | 0 单播 | 0 全球 | 最普通的网卡 |
01 |
0000 0001 | 1 组播 | 0 | 组播地址(如 01:00:5E:...) |
02 |
0000 0010 | 0 单播 | 1 本地 | 本地自定义地址 |
03 |
0000 0011 | 1 | 1 | 两个都置位 |
① FF:FF:FF:FF:FF:FF 是广播地址(收 3.9)——全 1,所以 I/G 位自然是 1(组播的一种极端情况)。它就是 5.2 里 ARP 请求用的那个"大喇叭"地址。
② 第二个十六进制数字如果是 2 / 6 / A / E,那它就是"本地管理地址"——因为这一位上被置了 1。
这个判据的现实意义很大:现在所有手机、平板、以及新版 Windows 连 Wi-Fi 时默认开启"随机 MAC"(隐私随机化),随机出来的地址就是本地管理地址。所以:
- 你在路由器上看到一堆
x2:/xA:开头的设备,不是设备坏了,是隐私保护在起作用 - 反过来,如果你靠 MAC 白名单来限制上网,随机化会直接让你的白名单失效——这是现在公司 Wi-Fi 普遍改用账号认证(收 5.3 的 802.1X)的原因之一
三、关键一问:它是"接口"的号,不是"设备"的号
本节标题问的是"接口是哪个",答案的重点落在最后那个词上。
一台电脑长这样(本节配图二):
| 接口 | 有没有 MAC |
|---|---|
| 有线网卡(以太网口) | 有一个 |
| Wi-Fi 网卡 | 另有一个 |
| 虚拟网卡(VPN、虚拟机、容器、蓝牙) | 每一个都各有一个 |
三个不同的号,同一台机器。
这件事在别的设备上更明显:
- 路由器:每个口一个 MAC——WAN 口、各个 LAN 口、Wi-Fi 接口,全都不一样
- 手机:Wi-Fi 一个、蓝牙一个;开热点时那个"热点接口"又是另一个(所以热点和 Wi-Fi 同时用是可以的)
- 服务器:一台物理机跑 20 台虚拟机,就多出 20 多个 MAC 地址
因为转发的单位就是接口。
交换机收到一帧,要决定的是"从我这台设备的哪个口送出去";网卡收到一帧,要决定的是"这帧是不是给我的这个口"。整个链路上被指名的,从头到尾都是接口,不是"机器"。
顺带说个有意思的后果:一台设备如果同时有两个接口接在同一个交换机上,它在交换机眼里就是两台设备(两条记录)。这也是排查网络时容易看走眼的一处。
四、三个性质,把 MAC 和 IP 彻底分开
| 性质 | 说明 | 现实后果 |
|---|---|---|
| ① 出厂烧录 | MAC 写在网卡的 ROM / EEPROM 里,出厂就定死了 | 换一块网卡 = 换一个 MAC;虚拟机、虚拟网卡则是软件"造"出来的号 |
| ② 跟接口走,不跟位置走 | 电脑搬去公司、搬去咖啡馆、连手机热点,MAC 一直不变 | 正因如此,它不能用来判断"你在哪儿" |
| ③ 没有层次、没有"位置"含义 | 00:1A:2B:... 这一串里看不出任何地理或网络结构 |
所以不能拿它跨网络找路(下一条详说) |
为什么不能拿 MAC 地址来"路由"
这是本节最有价值的一个"为什么",也顺便把 3.8 那笔账结清了。
回头看一下 IP 地址的形状:分了网络部分和主机部分(收 3.8),比如 192.168.1.0/24——前 24 位代表"哪一片",后 8 位代表"片里的哪台"。路由器能靠这个一路往前送,靠的是它有结构:相邻的地址往往属于同一片区,所以路由表里能一条记录代表一大片(收 3.7 的最长前缀匹配)。
MAC 地址完全没有这个结构:它只有"前 24 位是厂商"这一层,再往后的号和"在哪个网络里"没有任何关系。所以:
全世界的 MAC 地址表是无法聚合的——路由器如果想靠 MAC 找路,就得记住每一台设备在哪,这根本做不到。
而且更根本的一点:MAC 地址表只在"一段链路"里有效。你在家里看到的 MAC,走出路由器那一步就没意义了。
这就是世界上必须有两层地址的真正原因(收 3.2 的双层门牌):
| IP 地址 | MAC 地址 | |
|---|---|---|
| 作用范围 | 全程(从你到服务器) | 只有一跳 |
| 变不变 | 全程不变 | 每跳都换 |
| 有没有结构 | 有(网络部分 + 主机部分) | 没有(扁平的) |
| 跟什么走 | 跟位置走 | 跟接口走 |
| 谁用它做决定 | 路由器 | 交换机 |
| 谁分配 | 管理员 / DHCP(收 3.12、3.22) | 厂商出厂烧录 |
五、MAC 地址在链路上怎么被用上
知道了它是什么,再看它怎么被填进帧里的。
① 要用的时候,先"问"出来——靠 ARP(收 3.16)
你有对方的 IP,但不知道它的 MAC。这时发一个 ARP 请求(广播帧,目的 MAC 全 F),对方回一个 ARP 应答告诉你它的 MAC。拿到之后,这个 MAC 就被写进帧头的"目的 MAC"。
② 每跳换一次 MAC,IP 一个字不动(收 3.2)
看一次"访问外网"的帧头,对照关系非常清楚:
| 字段 | 值 | 说明 |
|---|---|---|
| 源 IP | 你自己的 IP | 全程不变 |
| 目的 IP | 服务器的 IP | 全程不变 |
| 源 MAC | 你自己网卡的 MAC | 只在这一跳有效 |
| 目的 MAC | 网关(路由器)那个口的 MAC | 注意:不是服务器的 MAC |
最后一格最值得琢磨:你根本不知道服务器的 MAC,也不需要知道——跨网络时,你只需要把帧交给网关,剩下的路由由网关负责(收 5.1 的判据)。
③ 交换机就是靠"源 MAC"来学习的
交换机看到一帧进来,会记下"这个源 MAC 出现在我这个口上",攒成一张 MAC 地址表;之后再收到发给这个 MAC 的帧,就知道该从哪个口送出去。这一整套是下一节(交换机的工作方式)的正题,这里先记一句话:交换机看的从头到尾是 MAC,不看 IP(收 5.2)。
六、把三个"口"摆清楚
这是本节最容易混的一处。前面几章陆续说过三个"接口 / 端口",长得像,管的完全不是一回事:
| 说法 | 出自 | 是什么 | 例子 |
|---|---|---|---|
| 接口(端口) | 2.3 | 设备上的物理插座 / 链路端点 | 网口、RJ45、光纤口 |
| 网络接口 | 本节 | 插座背后那个用 MAC 标识的收发单元 | "有线网卡"这个身份 |
| 端口号 | 3.17 | TCP / UDP 的软件端口,用来区分应用程序 | 80、443、53 |
三句话记住它们的层级:
插座是 2.3 的(看得见摸得着)→ 插座背后的身份是 5.4 的(一个 MAC)→ 程序的门牌是 3.17 的(一个端口号)。
数据往上走的顺序正好是:先进接口 → 认出是给哪个 MAC 的 → 再按端口号交给哪个程序。
七、这一节给你带来的实际好处
- 看设备能认出厂商:前 3 字节一查,大致知道内网里混进来的是什么设备
- 看懂
ipconfig /all里"物理地址"那一行:它和下面"IPv4 地址"是两种完全不同的东西——一个跟接口、一个跟位置 - 明白为什么换了网卡(或换了 USB 网卡)IP 设置要重配:MAC 变了,原来的固定绑定就对不上了
- 遇到"随机 MAC"不再困惑:第二个十六进制数字是 2 / 6 / A / E 就是它;也知道了靠 MAC 白名单限网会被它绕开
- 虚拟机 / 容器网络问题有了入口:那些"多出来的网卡"和"多出来的 MAC"都是虚拟接口,排查时先分清哪个是真的网卡
八、动手:Demo53 把你的接口和 MAC 一个个对上
第 1 步|先看一台机器上有几个接口。
getmac /v
输出是一张表:每张网卡的名字、MAC(叫"物理地址")、以及它绑在哪个连接上。数一数你有几个——大概率不止一个。
第 2 步|挑一个 MAC,查它的厂商。
取第一列任意一个 MAC 的前 3 字节,去 IEEE 的 OUI 查询页(或任意在线 OUI 查询)搜一下。
看到厂商名字的那一刻,本节最实用的一条推论就落地了:MAC 前半截是"谁造的",后半截是"造的哪一个"。
第 3 步|对照两种地址(这一步是本节的核心现场)。
ipconfig /all
在同一个网卡的信息块里找这两行:
物理地址 . . . . . . . . . . . . : 00-1A-2B-3C-4D-5E
IPv4 地址 . . . . . . . . . . . . : 192.168.1.23
一个是 6 字节十六进制,一个是 4 字节十进制——它们不是"同一种东西的两种写法",是两种完全不同的地址。
第 4 步|判断是不是"本地管理地址"。
看每个 MAC 的第二个十六进制数字:
| 第二个数字 | 是什么 |
|---|---|
| 0 / 4 / 8 / C | 全球唯一(IEEE 分配的正式地址) |
| 2 / 6 / A / E | 本地管理(虚拟网卡、或随机化 MAC) |
虚拟机网卡、VPN 虚拟网卡通常就在这里露馅。
第 5 步|看邻居的 MAC。
arp -a
这一张表就是"IP ↔ MAC 的对应名册"(收 3.16)。注意它只有你同一网段的邻居——这正好印证了"MAC 只在一段链路里有效"。
第 6 步|亲手验证"目的 MAC 是网关,不是服务器"。
发一个去外网的包,同时抓包(Wireshark 过滤 ip.addr == <目标IP>),看帧头:
- 源 MAC = 你自己网卡的 MAC
- 目的 MAC = 你网关那个口的 MAC(不是服务器的!)
再去 arp -a 里找网关的 IP,对一下——是不是同一个号?
第 7 步|对照实验:IP 变,MAC 不变。
- 记下现在电脑的 IP 和 MAC
- 断掉家里的 Wi-Fi,改连手机热点(有的就用有线换 Wi-Fi,效果一样)
- 再跑一次
ipconfig /all
对照结果:
| 换网络前 | 换网络后 | |
|---|---|---|
| IP 地址 | 变了(不同网络给不同的号) | 变了 |
| MAC 地址 | 同一个号 | 没变 |
这一格对照就是本节全部论点的实物证据:IP 跟位置走,MAC 跟接口走。
第 8 步|30 秒实验:制造一个"多出来的接口"。
连上一个 VPN(或启动一个虚拟机),然后再跑一次:
getmac /v
会多出一张网卡、多出一个 MAC。 断开 VPN,它又消失。
默念一遍:我不是多了一台设备,我只是多了一个接口。
九、常见误区
- "MAC 地址是电脑的身份证,一台电脑一个。" —— 是接口的标识。一台电脑有有线口、Wi-Fi、虚拟网卡,各有一个 MAC(本节配图二)。
- "MAC 地址和 IP 地址是一回事,只是写法不同。" —— 完全两种东西:MAC 跟接口走、不进不改、无结构、只管一跳;IP 跟位置走、会变、有结构、管全程。
- "MAC 地址永远不变,不能改。" —— 出厂烧录是真,但软件可以改(叫 MAC 地址欺骗),手机和 Windows 默认开的"随机 MAC"就是主动改。但改了只在你这一段有效,走出网关没人认。
- "Mac 电脑的地址就是 MAC 地址。" —— 纯粹同名巧合。MAC = Media Access Control,和苹果的 Mac 没有任何关系。
- "MAC 地址能拿来找路,就像 IP 一样。" —— 不能。它没有网络部分和主机部分,全世界的 MAC 无法聚合成路由表;它只在一段链路里有意义。
- "用 MAC 地址做上网白名单很安全。" —— 现在已经不牢靠了:随机化 MAC 可以直接绕开,改 MAC 也很容易。所以企业 Wi-Fi 越来越依赖账号认证(802.1X)而不是 MAC(收 5.3)。
- "
FF:FF:FF:FF:FF:FF是一台设备的地址。" —— 它是广播地址,不属于任何设备,意思是"这一段里所有接口都看"(收 3.9 / 5.2)。 - "MAC 地址的前 3 字节是随便编的。" —— 是 IEEE 分配的厂商编号(OUI),严格登记,公开可查——所以才查得出厂商。
- "跨网络传输时,帧里的目的 MAC 是最终服务器的。" —— 错。是网关那个口的 MAC。服务器在好几个网络之外,你根本不知道、也不需要知道它的 MAC(本节第五节的表)。
- "物理地址(MAC)和端口号是一回事。" —— 一个在网络接口层(接口的身份),一个在传输层(应用程序的门牌)。中间还隔着 IP 那一层(收 2.3 / 3.17 和本节第六节)。
十、动手自测
- MAC 地址一共多少位、多少字节?写出它的三种常见写法。
- 48 位分成哪两截?各是谁分配的、各有什么长度?
- 为什么看到前 3 字节就能查出厂商?这件事有什么实际用处?
- MAC 地址第一个字节的最低位和次低位分别是什么?各有什么含义?
- 看到
x2:、xA:开头的 MAC,说明什么?为什么会这样? - MAC 地址标的是"设备"还是"接口"?举三个能说明这件事的例子。
- MAC 和 IP 最本质的两条区别是什么?
- 为什么不能拿 MAC 地址来做跨网络的路由?
- 你访问
baidu.com时,发出去的帧里"目的 MAC"是谁?为什么? - 2.3 的"接口"、本节的"网络接口"、3.17 的"端口号",分别是什么?
答案:
① 48 位 = 6 字节 = 12 个十六进制数字。三种写法:连字符 00-1A-2B-3C-4D-5E(Windows)、冒号 00:1A:2B:3C:4D:5E(Linux / Wireshark)、点分三段 001a.2b3c.4d5e(部分 Cisco)。 ② 前 24 位 = OUI(组织唯一标识符),IEEE 统一分配给厂商;后 24 位是序列号,厂商自己编号。两段各 2²⁴ ≈ 1677 万种。 ③ 因为 OUI 是 IEEE 严格登记、公开可查的名册;同厂产品共用前缀。用处:排查时认出设备类型 / 认出虚拟网卡 / 审计时发现不该出现的设备。 ④ 最低位(bit 0)是 I/G 位:0 单播、1 组播(全 F 即广播);次低位(bit 1)是 U/L 位:0 全球唯一(IEEE 分配)、1 本地管理。 ⑤ 说明它是本地管理地址(U/L 位置了 1)。原因是虚拟网卡(虚拟机 / VPN),或手机和新版 Windows 连 Wi-Fi 时默认开启的"随机 MAC"隐私保护。推论:靠 MAC 白名单限网会被它绕开。 ⑥ 是接口,不是设备。例子:一台电脑同时有有线口、Wi-Fi、虚拟网卡(三个 MAC);路由器每个口(WAN / 各 LAN / Wi-Fi)各一个 MAC;手机开热点时"热点接口"是另一个 MAC。 ⑦ ① 跟什么走:MAC 跟接口走(换网络不变、换网卡才变),IP 跟位置走(换网络就变);② 有没有结构:IP 分网络部分与主机部分、可以聚合成路由表、管全程,MAC 是扁平的、无法聚合、只管一跳。 ⑧ 因为 MAC 没有"网络部分 / 主机部分"这种结构(看不出任何位置信息),全世界的 MAC 地址表无法聚合,路由器没法用它找路;而且MAC 的有效范围只有一段链路,出了路由器就没意义。所以路由必须靠有层次的 IP。 ⑨ 是你网关(路由器)那个口的 MAC,不是百度的服务器的 MAC。因为你只要能把这帧交给网关,跨网络的路由由网关负责——你连服务器的 MAC 是多少根本无从知道,也不需要知道(收 5.1)。 ⑩ 2.3 的"接口(端口)"是物理插座 / 链路端点(看得见摸得着);本节的"网络接口"是插座背后那个用 MAC 标明的收发单元;3.17 的"端口号"是 TCP / UDP 的软件端口,用来区分应用程序(如 80 / 443 / 53)。
十一、下一步学什么
- ☑ 5.5 常用的网络接口和线缆是什么(RJ-45接口与UTP线缆) —— 已学:MAC 说的"接口"具体长什么样(RJ-45 / 8P8C)、线是 UTP 双绞线、"绞"为什么能抗干扰、T568A/B 线序、百兆 4 根 vs 千兆 8 根、Cat 等级与 100 米上限
- ☐ 5.6(按教材顺序) —— 报个标题接着走:本节把"接口是哪个"讲清了(48 位两截结构、OUI 查厂商、两个特殊位、接口级而非设备级、为什么不能拿它路由);配图还顺手提到了交换机的 MAC 地址表是怎么学的——下一节大概率是交换机的作用与转发原理(MAC 地址表、泛洪、学习)、无线局域网(Wi-Fi)的机制(CSMA/CA、信道、AP 与 SSID),或以太网的传输机制细节。等你报标题。
相关笔记
- 以太网标准(IEEE802委员会) —— 上一节:谁定的规矩(IEEE 802、802.3 与 802.11);OUI 也是 IEEE 登记的名册
- 负责传输数据的以太网(以太网概要) —— 帧头里那两个 MAC 字段第一次出场;本节回答"它们标的是谁"
- 在同一网络中传输数据(以太网、无线局域网(Wi-Fi)) —— 同一个网络内交换机直接送达:它靠的就是 MAC(本节第五节的预告)
- 将IP地址与MAC地址对应(ARP) —— 用 IP 换 MAC,换来的 MAC 正好填进本节讲的帧头
- 负责传输数据的网络分层(网络接口层与网际层) —— 双层门牌:IP 头端到端不变、MAC 头段段更换;本节给出了"为什么 MAC 只能管一段"的答案
- 通信的对象(IP地址) —— IP 地址分网络部分与主机部分(有结构);本节讲的 MAC 恰好相反(扁平、无位置含义)
- 接收方是1个还是多个(单播、广播、组播) —— 三种收件人形态;本节补上 MAC 地址里 I/G 这一位的出处
- 根据端口号分配数据到应用程序(端口号、已知端口号) —— 软件端口:和本节讲的物理接口放在一起才分得清(第六节的三口对照)
- 网络的具体结构(接口(端口)、链路) —— 物理插座意义上的"接口";本节讲的是它的身份
- 用于构建网络的设备(网络设备) —— 网卡:被烧录进 MAC 的那个零件
- 数据的称谓(信息、数据段、数据包、数据帧) —— 只有数据帧带帧尾校验;帧头里就是本节这两个 MAC