🌐 第五章 以太网与无线局域网
📄 一句话概括

数据帧在一段链路上跑,光知道"要发给哪台机器"是不够的——一台机器往往有好几个接口(有线口、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 和 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 的 → 再按端口号交给哪个程序。

七、这一节给你带来的实际好处

  1. 看设备能认出厂商:前 3 字节一查,大致知道内网里混进来的是什么设备
  2. 看懂 ipconfig /all 里"物理地址"那一行:它和下面"IPv4 地址"是两种完全不同的东西——一个跟接口、一个跟位置
  3. 明白为什么换了网卡(或换了 USB 网卡)IP 设置要重配:MAC 变了,原来的固定绑定就对不上了
  4. 遇到"随机 MAC"不再困惑:第二个十六进制数字是 2 / 6 / A / E 就是它;也知道了靠 MAC 白名单限网会被它绕开
  5. 虚拟机 / 容器网络问题有了入口:那些"多出来的网卡"和"多出来的 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>),看帧头:

再去 arp -a 里找网关的 IP,对一下——是不是同一个号?

第 7 步|对照实验:IP 变,MAC 不变。

  1. 记下现在电脑的 IP 和 MAC
  2. 断掉家里的 Wi-Fi,改连手机热点(有的就用有线换 Wi-Fi,效果一样)
  3. 再跑一次 ipconfig /all

对照结果:

换网络前 换网络后
IP 地址 变了(不同网络给不同的号) 变了
MAC 地址 同一个号 没变

这一格对照就是本节全部论点的实物证据:IP 跟位置走,MAC 跟接口走。

第 8 步|30 秒实验:制造一个"多出来的接口"。

连上一个 VPN(或启动一个虚拟机),然后再跑一次:

getmac /v

会多出一张网卡、多出一个 MAC。 断开 VPN,它又消失。

默念一遍:我不是多了一台设备,我只是多了一个接口。

九、常见误区

  1. "MAC 地址是电脑的身份证,一台电脑一个。" —— 是接口的标识。一台电脑有有线口、Wi-Fi、虚拟网卡,各有一个 MAC(本节配图二)。
  2. "MAC 地址和 IP 地址是一回事,只是写法不同。" —— 完全两种东西:MAC 跟接口走、不进不改、无结构、只管一跳;IP 跟位置走、会变、有结构、管全程。
  3. "MAC 地址永远不变,不能改。" —— 出厂烧录是真,但软件可以改(叫 MAC 地址欺骗),手机和 Windows 默认开的"随机 MAC"就是主动改。但改了只在你这一段有效,走出网关没人认。
  4. "Mac 电脑的地址就是 MAC 地址。" —— 纯粹同名巧合。MAC = Media Access Control,和苹果的 Mac 没有任何关系。
  5. "MAC 地址能拿来找路,就像 IP 一样。" —— 不能。它没有网络部分和主机部分,全世界的 MAC 无法聚合成路由表;它只在一段链路里有意义。
  6. "用 MAC 地址做上网白名单很安全。" —— 现在已经不牢靠了:随机化 MAC 可以直接绕开,改 MAC 也很容易。所以企业 Wi-Fi 越来越依赖账号认证(802.1X)而不是 MAC(收 5.3)。
  7. "FF:FF:FF:FF:FF:FF 是一台设备的地址。" —— 它是广播地址,不属于任何设备,意思是"这一段里所有接口都看"(收 3.9 / 5.2)。
  8. "MAC 地址的前 3 字节是随便编的。" —— 是 IEEE 分配的厂商编号(OUI),严格登记,公开可查——所以才查得出厂商。
  9. "跨网络传输时,帧里的目的 MAC 是最终服务器的。" —— 错。是网关那个口的 MAC。服务器在好几个网络之外,你根本不知道、也不需要知道它的 MAC(本节第五节的表)。
  10. "物理地址(MAC)和端口号是一回事。" —— 一个在网络接口层(接口的身份),一个在传输层(应用程序的门牌)。中间还隔着 IP 那一层(收 2.3 / 3.17 和本节第六节)。

十、动手自测

❓ 自测一下
  1. MAC 地址一共多少位、多少字节?写出它的三种常见写法。
  2. 48 位分成哪两截?各是谁分配的、各有什么长度?
  3. 为什么看到前 3 字节就能查出厂商?这件事有什么实际用处?
  4. MAC 地址第一个字节的最低位和次低位分别是什么?各有什么含义?
  5. 看到 x2:、xA: 开头的 MAC,说明什么?为什么会这样?
  6. MAC 地址标的是"设备"还是"接口"?举三个能说明这件事的例子。
  7. MAC 和 IP 最本质的两条区别是什么?
  8. 为什么不能拿 MAC 地址来做跨网络的路由?
  9. 你访问 baidu.com 时,发出去的帧里"目的 MAC"是谁?为什么?
  10. 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)。

十一、下一步学什么

相关笔记