第 5 篇:MAC 地址——IP 管远方,MAC 管眼前

0 阅读12分钟

上一篇我们讲了网卡到底在干什么。今天继续往数据链路层走,聊一个经常听到、但很多人说不清楚的东西:MAC 地址。


开场:有了 IP,为什么还要 MAC?

很多人第一次接触 MAC 地址,都会有一个疑问:

不是已经有 IP 地址了吗?为什么还要 MAC 地址?

这个问题非常合理。

毕竟 IP 地址已经像门牌号了。

那 MAC 地址又是什么?身份证?工牌?户口本?

先给结论:

IP 地址负责跨网络找到目标主机,MAC 地址负责在当前链路上找到下一跳设备。

再短一点:

IP 管远方,MAC 管眼前。

这句话很重要。

如果你记住了它,后面理解 ARP、交换机、网关、路由都会轻松很多。


🔧 技术对应:一句话版

IP 地址 → 端到端寻址(从源主机到目标主机)
MAC 地址 → 逐跳转发(从当前设备到下一跳设备)

先看一张图:IP 和 MAC 分别负责什么

假设你的电脑要访问一台远程服务器。

你的电脑:192.168.1.10
网关:192.168.1.1
远程服务器:93.184.216.34

数据真正发出去时,会同时用到 IP 和 MAC。

flowchart LR
    A[你的电脑\nIP: 192.168.1.10\nMAC: AA:AA] --> B[网关路由器\nIP: 192.168.1.1\nMAC: BB:BB]
    B --> C[互联网中的多个路由器]
    C --> D[目标服务器\nIP: 93.184.216.34\nMAC: ZZ:ZZ]

这一步里:

  • 目标 IP 是远程服务器:93.184.216.34
  • 目标 MAC 是当前下一跳:网关的 MAC

也就是说,你的电脑并不会直接把以太网帧发给远程服务器的 MAC。

它只需要先交给网关。

网关再继续往后转发。

🔧 技术对应:以太网帧中的 目标 MAC = 网关 MAC,IP 头中的 目标 IP = 最终服务器 IP

这就像寄快递。

快递单上的最终地址可能是北京。

但你第一步不是亲自开车去北京。

你只是把包交给小区门口的快递站。

这个快递站,就是你的下一跳。


MAC 地址到底长什么样?

MAC 地址通常是 48 位,也就是 6 个字节。

常见写法是 6 组十六进制数:

00:1A:2B:3C:4D:5E

也可能写成:

00-1A-2B-3C-4D-5E

或者在某些设备里写成:

001A.2B3C.4D5E

它们表达的是同一个东西。

只是格式不同。

就像手机号可以写成:

13812345678
138-1234-5678
138 1234 5678

号码还是那个号码。

只是看起来有没有仪式感的问题。


MAC 地址的结构:前半段像厂商信息

一个传统 MAC 地址可以粗略分成两部分:

前 24 位:OUI,厂商标识
后 24 位:设备标识,由厂商分配

示意图:

00:1A:2B:3C:4D:5E
└──────┘ └──────┘
  OUI     设备编号
 厂商标识  厂商分配

OUI 全称是 Organizationally Unique Identifier。

翻译成人话就是:

这个 MAC 地址大概属于哪个厂商。

比如某些前缀可能属于 Intel、Apple、Cisco、Huawei 等厂商。

当然,现代系统里 MAC 地址不一定永远暴露真实厂商信息。

手机、电脑为了隐私,可能会使用随机 MAC。

这就像你出门不想被熟人认出来,于是戴了帽子和口罩。设备也有点隐私意识。


MAC 地址工作在哪一层?

MAC 地址属于数据链路层。

它主要出现在以太网帧里。

以太网帧大致长这样:

┌───────────────────────────────┐
│          目标 MAC (6字节)      │
├───────────────────────────────┤
│          源 MAC (6字节)        │
├───────────────────────────────┤
│          类型 (2字节)          │
├───────────────────────────────┤
│          数据载荷 (46-1500字节)│
├───────────────────────────────┤
│          FCS 校验 (4字节)      │
└───────────────────────────────┘

其中:

  • 源 MAC:这个帧从哪个网卡发出
  • 目标 MAC:这个帧要交给当前链路上的哪个设备
  • 类型:里面装的是 IPv4、IPv6 还是其他协议
  • FCS:帧校验序列,检查数据是否损坏

用图表示:

flowchart TD
    A[以太网帧] --> B[目标 MAC\n这一跳要交给谁]
    A --> C[源 MAC\n这一跳从谁发出]
    A --> D[类型\nIPv4 / IPv6 / ARP]
    A --> E[载荷\n通常是 IP 包或 ARP 数据]
    A --> F[FCS\n帧校验]

注意关键词:

当前链路。

MAC 地址不是互联网全程导航地址。

它更像“当前这一段路”的收件人。


IP 地址和 MAC 地址的核心区别

我们用一张表直接对比。

对比项IP 地址MAC 地址
所在层次网络层数据链路层
作用范围跨网络寻址当前链路转发
是否会变经常会变通常固定,但可修改/随机化
谁来分配网络管理员、DHCP、运营商等厂商烧录或系统生成
典型例子192.168.1.1000:1A:2B:3C:4D:5E
类比门牌地址身份证 / 设备编号

再用一句话总结:

IP 让数据知道最终要去哪,MAC 让数据知道下一步交给谁。

一个看远方。

一个看脚下。

做人也是这样。既要有远方,也要看脚下有没有坑。网络更现实,它每一跳都要看脚下。


🧠 为什么不能只用 IP?

既然 IP 可以表示目标,为什么链路层还需要 MAC?

因为底层链路设备,比如交换机,主要是按 MAC 地址转发以太网帧。

在一个局域网里,设备之间通信不是直接“喊 IP”。

以太网帧需要目标 MAC。

比如你的电脑要和同一个局域网里的打印机通信:

你的电脑 IP:192.168.1.10
打印机 IP:192.168.1.50

真正发帧时,需要知道打印机的 MAC。

源 MAC:你的电脑网卡 MAC
目标 MAC:打印机网卡 MAC
载荷:IP 包

如果没有目标 MAC,交换机就不知道这帧应该从哪个端口转发出去。

交换机会说:

你说目标 IP 是 192.168.1.50,这我不熟,我主要看 MAC。

这就是链路层的规则。

每一层都有自己的语言。

  • 网络层说 IP
  • 链路层说 MAC
  • 应用层说 HTTP

产品经理说“这个需求很简单”。每层语言都不一样。


同一局域网通信:目标 MAC 就是对方

如果目标主机和你在同一个局域网里,目标 MAC 通常就是对方的 MAC。

flowchart LR
    A[主机A\nIP: 192.168.1.10\nMAC: AA:AA] --> S[交换机]
    S --> B[主机B\nIP: 192.168.1.20\nMAC: BB:BB]

主机 A 发给主机 B 时:

源 IP:192.168.1.10
目标 IP:192.168.1.20
源 MAC:AA:AA
目标 MAC:BB:BB

这很直观。

同一个小区里送东西,直接送到对方家。

不用经过小区大门口的中转站。


跨网段通信:目标 MAC 是网关

如果目标主机不在同一个网段,目标 MAC 就不是最终服务器。

而是网关

flowchart LR
    A[你的电脑\n192.168.1.10\nMAC AA:AA] --> G[网关\n192.168.1.1\nMAC GG:GG]
    G --> R[互联网路由]
    R --> S[目标服务器\n93.184.216.34]

这时你的电脑发出的第一跳帧是:

源 IP:192.168.1.10
目标 IP:93.184.216.34
源 MAC:AA:AA
目标 MAC:GG:GG

看到没有?

  • 目标 IP 是最终服务器
  • 目标 MAC 是网关

这就是很多初学者抓包时最容易疑惑的点。

我明明访问的是远程服务器,为什么目标 MAC 是路由器?

因为你现在只负责把帧交给下一跳。

后面的路,网关继续安排。

网络世界也讲分工。你不要试图一个人扛下所有路由。


MAC 地址怎么知道?这就要靠 ARP

这里会引出下一篇的主角:ARP。

当你的电脑知道目标 IP,但不知道对应 MAC 时,就需要问:

谁是这个 IP?把你的 MAC 告诉我。

这就是 ARP 要解决的问题。

简化流程是:

sequenceDiagram
    participant A as 主机A
    participant LAN as 局域网
    participant B as 主机B

    A->>LAN: ARP广播:谁是 192.168.1.20?
    LAN->>B: 所有设备都能听到
    B-->>A: 我是 192.168.1.20,我的 MAC 是 BB:BB
    A->>A: 写入 ARP 缓存

关键规则:

  • 如果目标在同一网段,就问目标 IP 的 MAC
  • 如果目标不在同一网段,就问网关 IP 的 MAC

🔧 技术对应:ARP 找的是下一跳的 MAC,不一定是最终目标的 MAC。

下一篇我们会专门展开。

先埋个钩子。


交换机怎么使用 MAC 地址?

交换机工作在数据链路层。

它主要根据 MAC 地址转发帧。

交换机会维护一张 MAC 地址表(也叫 CAM 表)。

大概像这样:

MAC 地址端口
AA:AAPort 1
BB:BBPort 2
CC:CCPort 3

当交换机收到一个帧时,会看目标 MAC:

目标 MAC = BB:BB

然后查表:

BB:BB 在 Port 2

于是只从 Port 2 转发出去。

flowchart TD
    A[交换机收到帧] --> B[读取源 MAC 学习端口]
    B --> C[读取目标 MAC]
    C --> D{MAC 表里有目标吗?}
    D -- 有 --> E[转发到对应端口]
    D -- 没有 --> F[泛洪到除入口外的所有端口]

这里有两个动作:

  1. 学习:根据源 MAC 记录设备从哪个端口来
  2. 转发:根据目标 MAC 决定从哪个端口走

交换机不是一开始就什么都知道。它也是边工作边学习。听起来很励志。比某些只会转发会议通知的人更主动。


MAC 地址会不会变?

传统理解里,MAC 地址是网卡出厂时写好的,比较固定。

但在现代系统里,它并不是绝对不能变。

常见情况包括:

  • 虚拟机的 MAC 地址由虚拟化平台生成
  • Docker / Kubernetes 网络里会生成虚拟网卡 MAC
  • 手机连接 Wi-Fi 时可能使用随机 MAC
  • 操作系统可以手动修改网卡 MAC

在 Linux 上,可以查看 MAC 地址:

ip link

输出里类似:

link/ether 00:1a:2b:3c:4d:5e

也可以临时修改 MAC 地址,例如:

ip link set dev eth0 down
ip link set dev eth0 address 02:11:22:33:44:55
ip link set dev eth0 up

⚠️ 生产环境不要随便改。MAC 地址冲突可能导致很奇怪的问题。奇怪到你以为撞鬼。实际上只是两个设备拿了同一张“身份证”。


MAC 地址冲突会怎样?

如果一个局域网里出现两个相同 MAC 地址,交换机可能会混乱。

因为它的 MAC 表会来回变化。

比如:

AA:AA 一会儿出现在 Port 1
AA:AA 一会儿又出现在 Port 3

交换机:

你到底住哪?

结果可能表现为:

  • 网络时通时断
  • 包被转发到错误端口
  • 连接偶发中断
  • 抓包现象很诡异

这类问题排查起来很烦。

因为它不是完全不通。

而是“看心情通”。

网络最怕这种。完全不通反而好查。偶发问题才是值班工程师的精神攻击。


广播 MAC 和多播 MAC

MAC 地址里有一些特殊地址。

最常见的是广播 MAC

FF:FF:FF:FF:FF:FF

它表示:

当前局域网里的所有设备都听一下。

ARP 请求就经常使用广播 MAC。

因为发送方还不知道目标 MAC,只能先广播问:

谁是这个 IP?出来认领一下。

除了广播,还有多播 MAC,用于一组设备接收同一类流量。

这里先不展开。

你现在只要记住:

  • 单播:发给一个 MAC
  • 广播:发给所有设备
  • 多播:发给一组设备

类比一下:

单播:老板单独找你谈话
广播:老板在群里 @所有人
多播:老板只 @项目组

技术上不一定痛苦。

但类比场景确实有点痛苦。


🧠 工程排查:什么时候该关注 MAC?

平时写业务代码,不会天天关心 MAC。

但遇到下面这些问题时,MAC 就很重要:

  • 同网段机器互通异常
  • ARP 表异常
  • 网关 MAC 解析失败
  • 虚拟机网络不通
  • 容器网络异常
  • 交换机 MAC 表抖动
  • MAC 地址冲突
  • 抓包看到目标 MAC 不符合预期

常用命令

查看本机 MAC:

ip link

查看 ARP / 邻居表:

ip neigh

抓 ARP 包:

tcpdump -i eth0 arp

查看某个网卡统计:

ip -s link show eth0

抓包解读

如果你抓包时看到:

Ethernet II, Src: aa:aa, Dst: gg:gg
Internet Protocol, Src: 192.168.1.10, Dst: 93.184.216.34

不要慌。

这非常正常。

  • 目标 MAC 是网关
  • 目标 IP 是远程服务器

MAC 管下一跳,IP 管最终目的地。

再重复一遍。

这句值得背。


🧠 实战排查流程:MAC 相关问题的排查思路

当你怀疑是 MAC 层的问题时,按以下顺序排查:

步骤检查什么怎么查如果不对
1本机 MAC 是否存在ip link网卡驱动/虚拟网卡问题
2ARP 表是否正确ip neigh手动删除错误条目
3能否学到对端 MACping 后看 ip neigh广播域隔离/VLAN问题
4是否有 MAC 冲突抓包看是否有重复源 MAC修改其中一个 MAC
5交换机 MAC 表是否稳定登录交换机查看 MAC 表抖动环路/攻击/网卡问题

常见误区

误区一:MAC 地址全球绝对唯一

理论上厂商分配时应该尽量保证唯一。

但现实里,虚拟化、随机 MAC、手动修改、厂商异常都可能导致重复。

所以不要把“全球唯一”理解成数学定理。

它更像一个设计目标。现实世界总会给设计目标一点颜色看看。

误区二:访问远程服务器时,目标 MAC 是服务器 MAC

不对。

如果服务器不在同一局域网,第一跳目标 MAC 是网关。

每经过一跳,链路层头部都会重新封装。

IP 目标通常不变,MAC 目标每一跳都可能变。

误区三:MAC 地址只和物理机有关

不对。

虚拟机、容器、虚拟网卡、网桥、隧道网络里都会出现 MAC。

现代云原生网络里,MAC 地址仍然很常见。

只是它可能不再只对应一块真实物理网卡。


小结

这一篇我们讲了 MAC 地址。

核心记住几句话:

  1. MAC 地址属于数据链路层。
  2. MAC 地址通常用来标识当前链路上的设备。
  3. IP 地址负责最终目标,MAC 地址负责下一跳。
  4. 同网段通信时,目标 MAC 通常是对方设备。
  5. 跨网段通信时,目标 MAC 通常是网关。
  6. 交换机根据 MAC 地址表转发以太网帧。
  7. ARP 负责根据 IP 找到下一跳 MAC。

最重要的一句:

IP 管远方,MAC 管眼前。

如果你以后抓包看到目标 IP 和目标 MAC 对不上,先别慌。

它们本来就不是同一种“目的地”。

  • 一个是最终目的地
  • 一个是下一跳

下一篇预告

下一篇我们继续讲:

第 6 篇:ARP 协议——谁在帮我们找 MAC?

严格说,ARP 不是帮我们找 IP。

它是已知 IP,帮我们找 MAC。

下一篇我们就看看:

  • ARP 请求为什么是广播?
  • ARP 缓存是什么?
  • 为什么 ARP 出问题会导致网络不通?
  • 为什么它也是内网安全里的常客?

继续往下拆。