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

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


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

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

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

这个问题非常合理。

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

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

先给结论:

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

再短一点:

IP 管远方,MAC 管眼前。

这句话很重要。

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


🔧 技术对应:一句话版

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

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

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

text 复制代码
你的电脑:192.168.1.10
网关:192.168.1.1
远程服务器:93.184.216.34

数据真正发出去时,会同时用到 IP 和 MAC。
#mermaid-svg-eagVxWr2SnMLeUji{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-eagVxWr2SnMLeUji .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-eagVxWr2SnMLeUji .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-eagVxWr2SnMLeUji .error-icon{fill:#552222;}#mermaid-svg-eagVxWr2SnMLeUji .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-eagVxWr2SnMLeUji .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-eagVxWr2SnMLeUji .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-eagVxWr2SnMLeUji .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-eagVxWr2SnMLeUji .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-eagVxWr2SnMLeUji .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-eagVxWr2SnMLeUji .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-eagVxWr2SnMLeUji .marker{fill:#333333;stroke:#333333;}#mermaid-svg-eagVxWr2SnMLeUji .marker.cross{stroke:#333333;}#mermaid-svg-eagVxWr2SnMLeUji svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-eagVxWr2SnMLeUji p{margin:0;}#mermaid-svg-eagVxWr2SnMLeUji .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-eagVxWr2SnMLeUji .cluster-label text{fill:#333;}#mermaid-svg-eagVxWr2SnMLeUji .cluster-label span{color:#333;}#mermaid-svg-eagVxWr2SnMLeUji .cluster-label span p{background-color:transparent;}#mermaid-svg-eagVxWr2SnMLeUji .label text,#mermaid-svg-eagVxWr2SnMLeUji span{fill:#333;color:#333;}#mermaid-svg-eagVxWr2SnMLeUji .node rect,#mermaid-svg-eagVxWr2SnMLeUji .node circle,#mermaid-svg-eagVxWr2SnMLeUji .node ellipse,#mermaid-svg-eagVxWr2SnMLeUji .node polygon,#mermaid-svg-eagVxWr2SnMLeUji .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-eagVxWr2SnMLeUji .rough-node .label text,#mermaid-svg-eagVxWr2SnMLeUji .node .label text,#mermaid-svg-eagVxWr2SnMLeUji .image-shape .label,#mermaid-svg-eagVxWr2SnMLeUji .icon-shape .label{text-anchor:middle;}#mermaid-svg-eagVxWr2SnMLeUji .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-eagVxWr2SnMLeUji .rough-node .label,#mermaid-svg-eagVxWr2SnMLeUji .node .label,#mermaid-svg-eagVxWr2SnMLeUji .image-shape .label,#mermaid-svg-eagVxWr2SnMLeUji .icon-shape .label{text-align:center;}#mermaid-svg-eagVxWr2SnMLeUji .node.clickable{cursor:pointer;}#mermaid-svg-eagVxWr2SnMLeUji .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-eagVxWr2SnMLeUji .arrowheadPath{fill:#333333;}#mermaid-svg-eagVxWr2SnMLeUji .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-eagVxWr2SnMLeUji .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-eagVxWr2SnMLeUji .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-eagVxWr2SnMLeUji .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-eagVxWr2SnMLeUji .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-eagVxWr2SnMLeUji .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-eagVxWr2SnMLeUji .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-eagVxWr2SnMLeUji .cluster text{fill:#333;}#mermaid-svg-eagVxWr2SnMLeUji .cluster span{color:#333;}#mermaid-svg-eagVxWr2SnMLeUji div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-eagVxWr2SnMLeUji .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-eagVxWr2SnMLeUji rect.text{fill:none;stroke-width:0;}#mermaid-svg-eagVxWr2SnMLeUji .icon-shape,#mermaid-svg-eagVxWr2SnMLeUji .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-eagVxWr2SnMLeUji .icon-shape p,#mermaid-svg-eagVxWr2SnMLeUji .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-eagVxWr2SnMLeUji .icon-shape .label rect,#mermaid-svg-eagVxWr2SnMLeUji .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-eagVxWr2SnMLeUji .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-eagVxWr2SnMLeUji .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-eagVxWr2SnMLeUji :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 你的电脑

IP: 192.168.1.10

MAC: AA:AA
网关路由器

IP: 192.168.1.1

MAC: BB:BB
互联网中的多个路由器
目标服务器

IP: 93.184.216.34

MAC: ZZ:ZZ

这一步里:

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

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

它只需要先交给网关。

网关再继续往后转发。

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

这就像寄快递。

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

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

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

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


MAC 地址到底长什么样?

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

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

text 复制代码
00:1A:2B:3C:4D:5E

也可能写成:

text 复制代码
00-1A-2B-3C-4D-5E

或者在某些设备里写成:

text 复制代码
001A.2B3C.4D5E

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

只是格式不同。

就像手机号可以写成:

text 复制代码
13812345678
138-1234-5678
138 1234 5678

号码还是那个号码。

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


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

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

text 复制代码
前 24 位:OUI,厂商标识
后 24 位:设备标识,由厂商分配

示意图:

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

OUI 全称是 Organizationally Unique Identifier。

翻译成人话就是:

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

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

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

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

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


MAC 地址工作在哪一层?

MAC 地址属于数据链路层。

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

以太网帧大致长这样:

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

其中:

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

用图表示:
#mermaid-svg-CylRemrhjV0eAGol{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-CylRemrhjV0eAGol .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-CylRemrhjV0eAGol .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-CylRemrhjV0eAGol .error-icon{fill:#552222;}#mermaid-svg-CylRemrhjV0eAGol .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-CylRemrhjV0eAGol .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-CylRemrhjV0eAGol .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-CylRemrhjV0eAGol .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-CylRemrhjV0eAGol .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-CylRemrhjV0eAGol .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-CylRemrhjV0eAGol .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-CylRemrhjV0eAGol .marker{fill:#333333;stroke:#333333;}#mermaid-svg-CylRemrhjV0eAGol .marker.cross{stroke:#333333;}#mermaid-svg-CylRemrhjV0eAGol svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-CylRemrhjV0eAGol p{margin:0;}#mermaid-svg-CylRemrhjV0eAGol .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-CylRemrhjV0eAGol .cluster-label text{fill:#333;}#mermaid-svg-CylRemrhjV0eAGol .cluster-label span{color:#333;}#mermaid-svg-CylRemrhjV0eAGol .cluster-label span p{background-color:transparent;}#mermaid-svg-CylRemrhjV0eAGol .label text,#mermaid-svg-CylRemrhjV0eAGol span{fill:#333;color:#333;}#mermaid-svg-CylRemrhjV0eAGol .node rect,#mermaid-svg-CylRemrhjV0eAGol .node circle,#mermaid-svg-CylRemrhjV0eAGol .node ellipse,#mermaid-svg-CylRemrhjV0eAGol .node polygon,#mermaid-svg-CylRemrhjV0eAGol .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-CylRemrhjV0eAGol .rough-node .label text,#mermaid-svg-CylRemrhjV0eAGol .node .label text,#mermaid-svg-CylRemrhjV0eAGol .image-shape .label,#mermaid-svg-CylRemrhjV0eAGol .icon-shape .label{text-anchor:middle;}#mermaid-svg-CylRemrhjV0eAGol .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-CylRemrhjV0eAGol .rough-node .label,#mermaid-svg-CylRemrhjV0eAGol .node .label,#mermaid-svg-CylRemrhjV0eAGol .image-shape .label,#mermaid-svg-CylRemrhjV0eAGol .icon-shape .label{text-align:center;}#mermaid-svg-CylRemrhjV0eAGol .node.clickable{cursor:pointer;}#mermaid-svg-CylRemrhjV0eAGol .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-CylRemrhjV0eAGol .arrowheadPath{fill:#333333;}#mermaid-svg-CylRemrhjV0eAGol .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-CylRemrhjV0eAGol .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-CylRemrhjV0eAGol .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-CylRemrhjV0eAGol .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-CylRemrhjV0eAGol .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-CylRemrhjV0eAGol .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-CylRemrhjV0eAGol .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-CylRemrhjV0eAGol .cluster text{fill:#333;}#mermaid-svg-CylRemrhjV0eAGol .cluster span{color:#333;}#mermaid-svg-CylRemrhjV0eAGol div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-CylRemrhjV0eAGol .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-CylRemrhjV0eAGol rect.text{fill:none;stroke-width:0;}#mermaid-svg-CylRemrhjV0eAGol .icon-shape,#mermaid-svg-CylRemrhjV0eAGol .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-CylRemrhjV0eAGol .icon-shape p,#mermaid-svg-CylRemrhjV0eAGol .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-CylRemrhjV0eAGol .icon-shape .label rect,#mermaid-svg-CylRemrhjV0eAGol .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-CylRemrhjV0eAGol .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-CylRemrhjV0eAGol .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-CylRemrhjV0eAGol :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 以太网帧
目标 MAC

这一跳要交给谁
源 MAC

这一跳从谁发出
类型

IPv4 / IPv6 / ARP
载荷

通常是 IP 包或 ARP 数据
FCS

帧校验

注意关键词:

当前链路。

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

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


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

我们用一张表直接对比。

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

再用一句话总结:

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

一个看远方。

一个看脚下。

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


🧠 为什么不能只用 IP?

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

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

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

以太网帧需要目标 MAC。

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

text 复制代码
你的电脑 IP:192.168.1.10
打印机 IP:192.168.1.50

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

text 复制代码
源 MAC:你的电脑网卡 MAC
目标 MAC:打印机网卡 MAC
载荷:IP 包

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

交换机会说:

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

这就是链路层的规则。

每一层都有自己的语言。

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

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


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

如果目标主机和你在同一个局域网里,目标 MAC 通常就是对方的 MAC。
#mermaid-svg-fhGoB9uyr5gLECIM{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-fhGoB9uyr5gLECIM .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-fhGoB9uyr5gLECIM .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-fhGoB9uyr5gLECIM .error-icon{fill:#552222;}#mermaid-svg-fhGoB9uyr5gLECIM .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-fhGoB9uyr5gLECIM .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-fhGoB9uyr5gLECIM .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-fhGoB9uyr5gLECIM .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-fhGoB9uyr5gLECIM .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-fhGoB9uyr5gLECIM .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-fhGoB9uyr5gLECIM .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-fhGoB9uyr5gLECIM .marker{fill:#333333;stroke:#333333;}#mermaid-svg-fhGoB9uyr5gLECIM .marker.cross{stroke:#333333;}#mermaid-svg-fhGoB9uyr5gLECIM svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-fhGoB9uyr5gLECIM p{margin:0;}#mermaid-svg-fhGoB9uyr5gLECIM .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-fhGoB9uyr5gLECIM .cluster-label text{fill:#333;}#mermaid-svg-fhGoB9uyr5gLECIM .cluster-label span{color:#333;}#mermaid-svg-fhGoB9uyr5gLECIM .cluster-label span p{background-color:transparent;}#mermaid-svg-fhGoB9uyr5gLECIM .label text,#mermaid-svg-fhGoB9uyr5gLECIM span{fill:#333;color:#333;}#mermaid-svg-fhGoB9uyr5gLECIM .node rect,#mermaid-svg-fhGoB9uyr5gLECIM .node circle,#mermaid-svg-fhGoB9uyr5gLECIM .node ellipse,#mermaid-svg-fhGoB9uyr5gLECIM .node polygon,#mermaid-svg-fhGoB9uyr5gLECIM .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-fhGoB9uyr5gLECIM .rough-node .label text,#mermaid-svg-fhGoB9uyr5gLECIM .node .label text,#mermaid-svg-fhGoB9uyr5gLECIM .image-shape .label,#mermaid-svg-fhGoB9uyr5gLECIM .icon-shape .label{text-anchor:middle;}#mermaid-svg-fhGoB9uyr5gLECIM .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-fhGoB9uyr5gLECIM .rough-node .label,#mermaid-svg-fhGoB9uyr5gLECIM .node .label,#mermaid-svg-fhGoB9uyr5gLECIM .image-shape .label,#mermaid-svg-fhGoB9uyr5gLECIM .icon-shape .label{text-align:center;}#mermaid-svg-fhGoB9uyr5gLECIM .node.clickable{cursor:pointer;}#mermaid-svg-fhGoB9uyr5gLECIM .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-fhGoB9uyr5gLECIM .arrowheadPath{fill:#333333;}#mermaid-svg-fhGoB9uyr5gLECIM .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-fhGoB9uyr5gLECIM .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-fhGoB9uyr5gLECIM .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-fhGoB9uyr5gLECIM .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-fhGoB9uyr5gLECIM .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-fhGoB9uyr5gLECIM .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-fhGoB9uyr5gLECIM .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-fhGoB9uyr5gLECIM .cluster text{fill:#333;}#mermaid-svg-fhGoB9uyr5gLECIM .cluster span{color:#333;}#mermaid-svg-fhGoB9uyr5gLECIM div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-fhGoB9uyr5gLECIM .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-fhGoB9uyr5gLECIM rect.text{fill:none;stroke-width:0;}#mermaid-svg-fhGoB9uyr5gLECIM .icon-shape,#mermaid-svg-fhGoB9uyr5gLECIM .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-fhGoB9uyr5gLECIM .icon-shape p,#mermaid-svg-fhGoB9uyr5gLECIM .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-fhGoB9uyr5gLECIM .icon-shape .label rect,#mermaid-svg-fhGoB9uyr5gLECIM .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-fhGoB9uyr5gLECIM .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-fhGoB9uyr5gLECIM .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-fhGoB9uyr5gLECIM :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 主机A

IP: 192.168.1.10

MAC: AA:AA
交换机
主机B

IP: 192.168.1.20

MAC: BB:BB

主机 A 发给主机 B 时:

text 复制代码
源 IP:192.168.1.10
目标 IP:192.168.1.20
源 MAC:AA:AA
目标 MAC:BB:BB

这很直观。

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

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


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

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

而是网关
#mermaid-svg-bRPP05VLC7Wf9edU{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-bRPP05VLC7Wf9edU .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-bRPP05VLC7Wf9edU .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-bRPP05VLC7Wf9edU .error-icon{fill:#552222;}#mermaid-svg-bRPP05VLC7Wf9edU .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-bRPP05VLC7Wf9edU .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-bRPP05VLC7Wf9edU .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-bRPP05VLC7Wf9edU .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-bRPP05VLC7Wf9edU .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-bRPP05VLC7Wf9edU .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-bRPP05VLC7Wf9edU .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-bRPP05VLC7Wf9edU .marker{fill:#333333;stroke:#333333;}#mermaid-svg-bRPP05VLC7Wf9edU .marker.cross{stroke:#333333;}#mermaid-svg-bRPP05VLC7Wf9edU svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-bRPP05VLC7Wf9edU p{margin:0;}#mermaid-svg-bRPP05VLC7Wf9edU .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-bRPP05VLC7Wf9edU .cluster-label text{fill:#333;}#mermaid-svg-bRPP05VLC7Wf9edU .cluster-label span{color:#333;}#mermaid-svg-bRPP05VLC7Wf9edU .cluster-label span p{background-color:transparent;}#mermaid-svg-bRPP05VLC7Wf9edU .label text,#mermaid-svg-bRPP05VLC7Wf9edU span{fill:#333;color:#333;}#mermaid-svg-bRPP05VLC7Wf9edU .node rect,#mermaid-svg-bRPP05VLC7Wf9edU .node circle,#mermaid-svg-bRPP05VLC7Wf9edU .node ellipse,#mermaid-svg-bRPP05VLC7Wf9edU .node polygon,#mermaid-svg-bRPP05VLC7Wf9edU .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-bRPP05VLC7Wf9edU .rough-node .label text,#mermaid-svg-bRPP05VLC7Wf9edU .node .label text,#mermaid-svg-bRPP05VLC7Wf9edU .image-shape .label,#mermaid-svg-bRPP05VLC7Wf9edU .icon-shape .label{text-anchor:middle;}#mermaid-svg-bRPP05VLC7Wf9edU .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-bRPP05VLC7Wf9edU .rough-node .label,#mermaid-svg-bRPP05VLC7Wf9edU .node .label,#mermaid-svg-bRPP05VLC7Wf9edU .image-shape .label,#mermaid-svg-bRPP05VLC7Wf9edU .icon-shape .label{text-align:center;}#mermaid-svg-bRPP05VLC7Wf9edU .node.clickable{cursor:pointer;}#mermaid-svg-bRPP05VLC7Wf9edU .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-bRPP05VLC7Wf9edU .arrowheadPath{fill:#333333;}#mermaid-svg-bRPP05VLC7Wf9edU .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-bRPP05VLC7Wf9edU .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-bRPP05VLC7Wf9edU .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-bRPP05VLC7Wf9edU .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-bRPP05VLC7Wf9edU .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-bRPP05VLC7Wf9edU .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-bRPP05VLC7Wf9edU .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-bRPP05VLC7Wf9edU .cluster text{fill:#333;}#mermaid-svg-bRPP05VLC7Wf9edU .cluster span{color:#333;}#mermaid-svg-bRPP05VLC7Wf9edU div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-bRPP05VLC7Wf9edU .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-bRPP05VLC7Wf9edU rect.text{fill:none;stroke-width:0;}#mermaid-svg-bRPP05VLC7Wf9edU .icon-shape,#mermaid-svg-bRPP05VLC7Wf9edU .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-bRPP05VLC7Wf9edU .icon-shape p,#mermaid-svg-bRPP05VLC7Wf9edU .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-bRPP05VLC7Wf9edU .icon-shape .label rect,#mermaid-svg-bRPP05VLC7Wf9edU .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-bRPP05VLC7Wf9edU .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-bRPP05VLC7Wf9edU .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-bRPP05VLC7Wf9edU :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 你的电脑

192.168.1.10

MAC AA:AA
网关

192.168.1.1

MAC GG:GG
互联网路由
目标服务器

93.184.216.34

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

text 复制代码
源 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 要解决的问题。

简化流程是:
主机B 局域网 主机A 主机B 局域网 主机A #mermaid-svg-bk78vPwTpTRNHD2N{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-bk78vPwTpTRNHD2N .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-bk78vPwTpTRNHD2N .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-bk78vPwTpTRNHD2N .error-icon{fill:#552222;}#mermaid-svg-bk78vPwTpTRNHD2N .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-bk78vPwTpTRNHD2N .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-bk78vPwTpTRNHD2N .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-bk78vPwTpTRNHD2N .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-bk78vPwTpTRNHD2N .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-bk78vPwTpTRNHD2N .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-bk78vPwTpTRNHD2N .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-bk78vPwTpTRNHD2N .marker{fill:#333333;stroke:#333333;}#mermaid-svg-bk78vPwTpTRNHD2N .marker.cross{stroke:#333333;}#mermaid-svg-bk78vPwTpTRNHD2N svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-bk78vPwTpTRNHD2N p{margin:0;}#mermaid-svg-bk78vPwTpTRNHD2N .actor{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-bk78vPwTpTRNHD2N text.actor>tspan{fill:black;stroke:none;}#mermaid-svg-bk78vPwTpTRNHD2N .actor-line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-bk78vPwTpTRNHD2N .innerArc{stroke-width:1.5;stroke-dasharray:none;}#mermaid-svg-bk78vPwTpTRNHD2N .messageLine0{stroke-width:1.5;stroke-dasharray:none;stroke:#333;}#mermaid-svg-bk78vPwTpTRNHD2N .messageLine1{stroke-width:1.5;stroke-dasharray:2,2;stroke:#333;}#mermaid-svg-bk78vPwTpTRNHD2N #arrowhead path{fill:#333;stroke:#333;}#mermaid-svg-bk78vPwTpTRNHD2N .sequenceNumber{fill:white;}#mermaid-svg-bk78vPwTpTRNHD2N #sequencenumber{fill:#333;}#mermaid-svg-bk78vPwTpTRNHD2N #crosshead path{fill:#333;stroke:#333;}#mermaid-svg-bk78vPwTpTRNHD2N .messageText{fill:#333;stroke:none;}#mermaid-svg-bk78vPwTpTRNHD2N .labelBox{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-bk78vPwTpTRNHD2N .labelText,#mermaid-svg-bk78vPwTpTRNHD2N .labelText>tspan{fill:black;stroke:none;}#mermaid-svg-bk78vPwTpTRNHD2N .loopText,#mermaid-svg-bk78vPwTpTRNHD2N .loopText>tspan{fill:black;stroke:none;}#mermaid-svg-bk78vPwTpTRNHD2N .loopLine{stroke-width:2px;stroke-dasharray:2,2;stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-bk78vPwTpTRNHD2N .note{stroke:#aaaa33;fill:#fff5ad;}#mermaid-svg-bk78vPwTpTRNHD2N .noteText,#mermaid-svg-bk78vPwTpTRNHD2N .noteText>tspan{fill:black;stroke:none;}#mermaid-svg-bk78vPwTpTRNHD2N .activation0{fill:#f4f4f4;stroke:#666;}#mermaid-svg-bk78vPwTpTRNHD2N .activation1{fill:#f4f4f4;stroke:#666;}#mermaid-svg-bk78vPwTpTRNHD2N .activation2{fill:#f4f4f4;stroke:#666;}#mermaid-svg-bk78vPwTpTRNHD2N .actorPopupMenu{position:absolute;}#mermaid-svg-bk78vPwTpTRNHD2N .actorPopupMenuPanel{position:absolute;fill:#ECECFF;box-shadow:0px 8px 16px 0px rgba(0,0,0,0.2);filter:drop-shadow(3px 5px 2px rgb(0 0 0 / 0.4));}#mermaid-svg-bk78vPwTpTRNHD2N .actor-man line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-bk78vPwTpTRNHD2N .actor-man circle,#mermaid-svg-bk78vPwTpTRNHD2N line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;stroke-width:2px;}#mermaid-svg-bk78vPwTpTRNHD2N :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} ARP广播:谁是 192.168.1.20?所有设备都能听到我是 192.168.1.20,我的 MAC 是 BB:BB写入 ARP 缓存

关键规则:

  • 如果目标在同一网段,就问目标 IP 的 MAC
  • 如果目标不在同一网段,就问网关 IP 的 MAC
    🔧 技术对应 :ARP 找的是下一跳的 MAC,不一定是最终目标的 MAC。

下一篇我们会专门展开。

先埋个钩子。


交换机怎么使用 MAC 地址?

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

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

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

大概像这样:

MAC 地址 端口
AA:AA Port 1
BB:BB Port 2
CC:CC Port 3

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

text 复制代码
目标 MAC = BB:BB

然后查表:

text 复制代码
BB:BB 在 Port 2

于是只从 Port 2 转发出去。
#mermaid-svg-EEJonJxN9Bne2IlE{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-EEJonJxN9Bne2IlE .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-EEJonJxN9Bne2IlE .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-EEJonJxN9Bne2IlE .error-icon{fill:#552222;}#mermaid-svg-EEJonJxN9Bne2IlE .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-EEJonJxN9Bne2IlE .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-EEJonJxN9Bne2IlE .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-EEJonJxN9Bne2IlE .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-EEJonJxN9Bne2IlE .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-EEJonJxN9Bne2IlE .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-EEJonJxN9Bne2IlE .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-EEJonJxN9Bne2IlE .marker{fill:#333333;stroke:#333333;}#mermaid-svg-EEJonJxN9Bne2IlE .marker.cross{stroke:#333333;}#mermaid-svg-EEJonJxN9Bne2IlE svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-EEJonJxN9Bne2IlE p{margin:0;}#mermaid-svg-EEJonJxN9Bne2IlE .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-EEJonJxN9Bne2IlE .cluster-label text{fill:#333;}#mermaid-svg-EEJonJxN9Bne2IlE .cluster-label span{color:#333;}#mermaid-svg-EEJonJxN9Bne2IlE .cluster-label span p{background-color:transparent;}#mermaid-svg-EEJonJxN9Bne2IlE .label text,#mermaid-svg-EEJonJxN9Bne2IlE span{fill:#333;color:#333;}#mermaid-svg-EEJonJxN9Bne2IlE .node rect,#mermaid-svg-EEJonJxN9Bne2IlE .node circle,#mermaid-svg-EEJonJxN9Bne2IlE .node ellipse,#mermaid-svg-EEJonJxN9Bne2IlE .node polygon,#mermaid-svg-EEJonJxN9Bne2IlE .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-EEJonJxN9Bne2IlE .rough-node .label text,#mermaid-svg-EEJonJxN9Bne2IlE .node .label text,#mermaid-svg-EEJonJxN9Bne2IlE .image-shape .label,#mermaid-svg-EEJonJxN9Bne2IlE .icon-shape .label{text-anchor:middle;}#mermaid-svg-EEJonJxN9Bne2IlE .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-EEJonJxN9Bne2IlE .rough-node .label,#mermaid-svg-EEJonJxN9Bne2IlE .node .label,#mermaid-svg-EEJonJxN9Bne2IlE .image-shape .label,#mermaid-svg-EEJonJxN9Bne2IlE .icon-shape .label{text-align:center;}#mermaid-svg-EEJonJxN9Bne2IlE .node.clickable{cursor:pointer;}#mermaid-svg-EEJonJxN9Bne2IlE .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-EEJonJxN9Bne2IlE .arrowheadPath{fill:#333333;}#mermaid-svg-EEJonJxN9Bne2IlE .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-EEJonJxN9Bne2IlE .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-EEJonJxN9Bne2IlE .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-EEJonJxN9Bne2IlE .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-EEJonJxN9Bne2IlE .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-EEJonJxN9Bne2IlE .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-EEJonJxN9Bne2IlE .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-EEJonJxN9Bne2IlE .cluster text{fill:#333;}#mermaid-svg-EEJonJxN9Bne2IlE .cluster span{color:#333;}#mermaid-svg-EEJonJxN9Bne2IlE div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-EEJonJxN9Bne2IlE .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-EEJonJxN9Bne2IlE rect.text{fill:none;stroke-width:0;}#mermaid-svg-EEJonJxN9Bne2IlE .icon-shape,#mermaid-svg-EEJonJxN9Bne2IlE .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-EEJonJxN9Bne2IlE .icon-shape p,#mermaid-svg-EEJonJxN9Bne2IlE .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-EEJonJxN9Bne2IlE .icon-shape .label rect,#mermaid-svg-EEJonJxN9Bne2IlE .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-EEJonJxN9Bne2IlE .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-EEJonJxN9Bne2IlE .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-EEJonJxN9Bne2IlE :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 有
没有
交换机收到帧
读取源 MAC 学习端口
读取目标 MAC
MAC 表里有目标吗?
转发到对应端口
泛洪到除入口外的所有端口

这里有两个动作:

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

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


MAC 地址会不会变?

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

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

常见情况包括:

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

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

bash 复制代码
ip link

输出里类似:

text 复制代码
link/ether 00:1a:2b:3c:4d:5e

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

bash 复制代码
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 表会来回变化。

比如:

text 复制代码
AA:AA 一会儿出现在 Port 1
AA:AA 一会儿又出现在 Port 3

交换机:

你到底住哪?

结果可能表现为:

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

这类问题排查起来很烦。

因为它不是完全不通。

而是"看心情通"。

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


广播 MAC 和多播 MAC

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

最常见的是广播 MAC

text 复制代码
FF:FF:FF:FF:FF:FF

它表示:

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

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

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

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

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

这里先不展开。

你现在只要记住:

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

类比一下:

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

技术上不一定痛苦。

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


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

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

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

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

查看本机 MAC:

bash 复制代码
ip link

查看 ARP / 邻居表:

bash 复制代码
ip neigh

抓 ARP 包:

bash 复制代码
tcpdump -i eth0 arp

查看某个网卡统计:

bash 复制代码
ip -s link show eth0
抓包解读

如果你抓包时看到:

text 复制代码
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 网卡驱动/虚拟网卡问题
2 ARP 表是否正确 ip neigh 手动删除错误条目
3 能否学到对端 MAC ping 后看 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 出问题会导致网络不通?
  • 为什么它也是内网安全里的常客?

继续往下拆。


相关推荐
元Y亨H2 小时前
Mac 办公效率进阶笔记
macos
元Y亨H2 小时前
Mac 高级程序员配置笔记 (Java & Python 篇)
macos
元Y亨H2 小时前
Mac 从入门到精通:效率进阶笔记
macos
开开心心loky4 小时前
[OC 底层] (五) iOS 中常见的几种锁
macos·ios·cocoa
技术小结-李爽8 小时前
Mac快捷键设计规律总结
macos·键盘
铁锚8 小时前
macOS 禁用 mediaanalysisd
macos·策略模式
酉鬼女又兒11 小时前
零基础入门计算机网络:MAC地址、IP地址与ARP协议全面解析(含考研真题详解)
网络·网络协议·tcp/ip·计算机网络·考研·macos·职场和发展
资源分享助手11 小时前
PeekDesktop:实现类似 macOS Sonoma 点击桌面预览(Windows工具教程)
windows·macos·点击回到桌面
鹤卿12312 小时前
iOS OC NSUserDefaults
macos·ios·objective-c