上一篇我们讲了网卡到底在干什么。今天继续往数据链路层走,聊一个经常听到、但很多人说不清楚的东西: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 表里有目标吗?
转发到对应端口
泛洪到除入口外的所有端口
这里有两个动作:
- 学习:根据源 MAC 记录设备从哪个端口来
- 转发:根据目标 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 地址。
核心记住几句话:
- MAC 地址属于数据链路层。
- MAC 地址通常用来标识当前链路上的设备。
- IP 地址负责最终目标,MAC 地址负责下一跳。
- 同网段通信时,目标 MAC 通常是对方设备。
- 跨网段通信时,目标 MAC 通常是网关。
- 交换机根据 MAC 地址表转发以太网帧。
- ARP 负责根据 IP 找到下一跳 MAC。
最重要的一句:
IP 管远方,MAC 管眼前。
如果你以后抓包看到目标 IP 和目标 MAC 对不上,先别慌。
它们本来就不是同一种"目的地"。
- 一个是最终目的地
- 一个是下一跳
下一篇预告
下一篇我们继续讲:
第 6 篇:ARP 协议------谁在帮我们找 MAC?
严格说,ARP 不是帮我们找 IP。
它是已知 IP,帮我们找 MAC。
下一篇我们就看看:
- ARP 请求为什么是广播?
- ARP 缓存是什么?
- 为什么 ARP 出问题会导致网络不通?
- 为什么它也是内网安全里的常客?
继续往下拆。