【计算机网络 | 数据链路层3:MAC 地址是什么?它和 IP 地址有什么区别?】

上一篇我们已经知道,IP 数据报跨越网络时,需要在每一段链路上重新封装成帧。但这里马上会出现一个问题:帧的首部里究竟应该写什么地址?交换机和网卡又靠什么判断一帧数据应该交给谁?

答案是 MAC 地址

IP 地址和 MAC 地址都被称为"地址",但它们解决的不是同一个层次的问题:IP 地址负责网络层的分层寻址和跨网络路由,MAC 地址负责当前局域网或当前链路上的本地交付。理解二者的分工,是继续学习 ARP、以太网和交换机的前提。

一、为什么有了 IP 地址,还需要 MAC 地址?

网络层解决的是"数据应该往哪个网络、哪个方向走"。路由器根据目的 IP 地址和路由表选择下一跳,但 IP 数据报最终还要通过某一段具体链路发送出去。

而在局域网中,交换机、网卡等链路层设备主要识别的是帧首部中的链路层地址。它们并不负责读取 IP 数据报并完成跨网络路由。换句话说:

  • IP 地址告诉网络层:目的设备位于哪个网络,以及数据报应该向哪个方向转发;
  • MAC 地址告诉当前链路:这一帧应该交给哪个网络接口,或者是否应该广播给本地网络中的多个接口。

可以把一次快递运输想象成两套地址同时存在:IP 地址类似最终收货地址,帮助快递系统决定跨城市的路线;MAC 地址更像当前这一段运输的交接信息,帮助这一站把包裹交给相邻的具体设备。

二、MAC 地址究竟是什么?

1. MAC 地址是接口的链路层标识

MAC 地址(Media Access Control Address)也称硬件地址、物理地址,是数据链路层在局域网中使用的地址。

严格来说,MAC 地址标识的不是"整台主机",而是网络接口。一台电脑可能同时有有线网卡、无线网卡和虚拟网卡,因此它可能拥有多个 MAC 地址。一个路由器也通常有多个网络接口,每个接口都有自己的链路层地址。

所以,"一台电脑对应一个 MAC 地址"只是简化说法。更准确的说法是:一个参与链路通信的网络接口,需要一个 MAC 地址或等价的链路层标识。

通过IP地址能明确的唯一的找到某一个节点吗?

  • 不能。因为当一个节点处于不同的局域网中时,IP地址会发送变化。因此我们需要一个类似于人的身份证号一样的东西,来唯一的标识某一个节点。

2. MAC 地址通常有 48 位

IEEE 802 系列局域网标准中,常见 MAC 地址长度是 48 bit,也就是 6 个字节。通常写成 6 组十六进制数,例如:

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

也可以写成:

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

传统全球管理的 MAC 地址中,前 24 bit 通常对应组织唯一标识符(OUI),由 IEEE 分配给厂商;后 24 bit 由厂商在自己的分配范围内管理,用来标识具体网络接口。

需要注意的是,48 位只是地址空间的长度,并不意味着现实中所有地址都一定由厂商永久、唯一地写死在硬件里。

现代设备可能支持软件修改 MAC 地址,也可能使用本地管理地址、随机 MAC 地址或虚拟接口地址。考试和基础概念中常说"MAC 地址固化在网卡中",实际工程中应理解为"网卡通常有一个出厂或默认的 MAC 地址"。

3. MAC 地址是平面式的

IP 地址具有层次结构,例如 IPv4 地址可以结合子网掩码区分网络号和主机号;MAC 地址通常只是一个接口标识,本身不包含"它位于哪个城市、哪个局域网、哪条路由"的层次信息。

这也是 MAC 地址适合局域网、却不适合承担互联网全局路由的原因:交换机只需要在本地网络中学习某个 MAC 地址位于哪个端口,而互联网路由器不可能为全球每一个接口维护一张按 MAC 地址组织的完整路由表。

三、IP 地址和 MAC 地址分别放在哪里?

在一次网络通信中,两个地址分别位于不同的协议数据单元中:

text 复制代码
链路层帧首部:源 MAC 地址 | 目的 MAC 地址
帧数据载荷:IP 数据报
                 └─ IP 首部:源 IP 地址 | 目的 IP 地址
  • 源 IP 地址和目的 IP 地址位于 IP 数据报首部;
  • 源 MAC 地址和目的 MAC 地址位于当前链路层帧的首部。

链路层帧的载荷通常包含 IP 数据报,但链路层并不因此负责 IP 路由。

对于只工作在物理层的设备,例如传统集线器,它甚至不会识别 MAC 地址,只会复制和转发信号;交换机则会读取 MAC 帧首部,根据目的 MAC 地址决定是否转发。

四、跨网络传输时,哪个地址会变化?

这是 MAC 地址和 IP 地址最重要的区别之一。

1. IP 数据报跨网络转发

假设主机 A 要访问远端网络中的主机 B,数据可能经过多个路由器:

text 复制代码
主机 A ── 局域网1 ── 路由器 R1 ── 局域网2 ── 路由器 R2 ── 局域网3 ── 主机 B

从网络层的角度看,源 IP 和目的 IP 用于描述这次端到端通信,通常会随着数据报跨越多个网络继续存在。路由器读取目的 IP,根据路由表选择下一跳。

2. 每一跳重新生成 MAC 帧

从链路层的角度看,每一段链路都是一次本地交付:

  1. 主机 A 把 IP 数据报封装进局域网1适用的帧,目的 MAC 通常是下一跳接口的 MAC;
  2. R1 收到帧后,检查并去掉当前帧的首部和尾部,取出 IP 数据报;
  3. R1 根据目的 IP 选择从哪个接口转发;
  4. R1 在局域网2中重新封装一个新的帧,使用局域网2中下一跳接口的 MAC 地址;
  5. 后续路由器重复这个过程,直到最后一个局域网把帧交给主机 B。

因此可以概括为:

跨网络传输时,IP 数据报负责持续表达端到端的网络层目标;MAC 地址负责当前这一跳的链路层交付。

在 NAT、隧道、代理或其他特殊机制下,IP 首部也可能发生变化,但这不改变"IP 面向网络层寻址、MAC 面向当前链路交付"的基本分工。

五、同一局域网内,MAC 地址如何帮助交付?

1. 单播:发给特定接口

当主机 A 已经知道目标接口的 MAC 地址时,它会把这个地址写入帧的目的地址字段:

text 复制代码
源 MAC:A 的接口地址
目的 MAC:B 的接口地址
数据载荷:IP 数据报或其他上层数据

同一局域网中的网卡和交换设备会根据这个目的 MAC 地址处理帧。

目标接口接收并向上层交付,不属于目标的接口通常会丢弃该帧,交换机则可以尽量只把帧转发到目标所在端口。

2. 广播:发给本地广播域

以太网中常见的广播 MAC 地址是:

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

它表示"本地链路或广播域中的所有设备"。设备首次接入网络、进行地址配置或执行地址解析时,可能需要使用广播帧。

广播的范围是本地链路或广播域,路由器通常不会把普通二层广播直接转发到另一个网络。因此,不能通过广播 MAC 地址跨越互联网寻找远端主机。

单播帧的精准匹配

  • 当发送适配器

    向特定目标发送数据时,它会将目的MAC地址写入帧头(如00:1A:2B:3C:4D:5E ),并广播到局域网。接收适配器收到帧后,执行以下判断:

    • 匹配检查:若帧中的目的MAC地址与自身MAC地址一致(如 00:25:9C:00:00:01 ),则提取封装的数据报(如视频流数据),沿协议栈上交。
    • 不匹配处理:若目的MAC地址不匹配,则直接丢弃帧。

广播帧的"全民通知"

  • 当发送适配器需要局域网内所有设备接收帧时 (如网络初始化或组播服务),会使用广播MAC地址( FF-FF-FF-FF-FF-FF )。所有连接到同一局域网的适配器无论自身MAC地址为何,都会接收并处理该帧(如新设备首次加入网络时的广播请求)。

3. 交换机为什么能减少无关帧?

共享总线或集线器网络中,一个信号可能被多个接口观察到;交换机则可以根据帧中的目的 MAC 地址,把帧转发到对应端口。

交换机需要先学习"哪个 MAC 地址位于哪个端口",形成 MAC 地址表。这个学习和转发过程将在后面的以太网和交换机专题中详细讨论。

当前只要记住:MAC 地址提供了交换机进行本地转发所需要的接口标识

六、为什么不能只使用 MAC 地址?

乍看之下,既然帧最终靠 MAC 地址交付,似乎可以让路由器也只使用 MAC 地址。但这样会让互联网路由失去层次结构。

1. MAC 地址无法表达网络位置

MAC 地址通常是平面式标识。生产厂商可以分配一个地址给网卡,但这个地址本身无法告诉路由器:接口现在属于哪个城市、哪个运营商、哪个子网。

设备从南京移动到北京,只要继续使用同一块网卡,它的 MAC 地址可以不变;但它接入的网络位置已经发生变化。反过来,电脑位置不变,更换网卡后 MAC 地址也可能变化。

这说明 MAC 地址适合表达"你是谁",却不适合表达"你现在位于哪个网络"。

2. IP 地址可以聚合路由信息

IP 地址具有分层结构,路由器可以按网络前缀聚合很多主机的可达信息,只在路由表中记录网络范围和下一跳,而不必记录每台主机的 MAC 地址。

如果互联网完全依赖 MAC 地址路由,路由器就可能需要维护全球所有接口的地址信息,路由表规模、更新开销和查表延迟都会变得难以接受。

所以,IP 和 MAC 并不是互相重复的两套地址,而是分层网络中有意设计的两套寻址机制

对比维度 IP 地址 MAC 地址
所属层次 网络层 数据链路层
主要作用 跨网络寻址和路由 当前链路或局域网内交付
结构特点 分层、可聚合 通常平面式、接口级标识
作用范围 可以跨越多个网络 通常只在当前链路有效
写入位置 IP 数据报首部 链路层帧首部
转发设备 路由器 网卡、交换机等
是否随换网变化 通常会随接入网络变化 通常默认不随位置变化,但可被软件修改或随机化

七、MAC 地址、IP 地址与公网/局域网地址

家庭设备通常同时接触到三种容易混淆的身份:网卡的 MAC 地址、家庭路由器分配的局域网 IP,以及运营商提供的公网 IP。

例如:

text 复制代码
笔记本网卡:MAC 地址
家庭内网:192.168.1.20
家庭出口:公网 IP
  • MAC 地址用于笔记本与同一局域网中的路由器、打印机或其他设备进行链路层交付;
  • 192.168.1.20 这类私有 IP 用于家庭内部的网络层通信;
  • 公网 IP 通常配置在家庭路由器的外网接口上,外部网站看到的往往是这个出口地址。

家庭路由器还可能通过 NAT 把多个内网设备的连接映射到一个公网 IP。NAT 处理的是 IP 地址和端口的转换,不是把 MAC 地址变成公网 IP。MAC 地址通常不会穿过家庭路由器继续出现在互联网远端的帧首部中。

八、结合一次跨网访问理解两套地址

假设笔记本访问一个不在本地网络的服务器:

  1. 笔记本先根据目的 IP 判断服务器不在本地网络;
  2. 它不需要知道服务器的 MAC 地址,而是把帧交给本地默认网关;
  3. 笔记本需要获得的是"默认网关接口的 MAC 地址",再把它写入当前局域网帧;
  4. 路由器收到帧后,取出 IP 数据报,依据目的 IP 选择下一跳;
  5. 路由器在自己的另一个接口上构造新帧,把下一跳接口的 MAC 地址写入帧首部;
  6. 经过多次逐跳转发后,目的主机所在网络的路由器再把 IP 数据报装入以目的主机 MAC 为目标的帧。

这个过程解释了一个常见现象:访问远端服务器时,笔记本并不会通过 ARP 询问"远端服务器的 MAC 地址",而是先解析本地默认网关的 MAC 地址。

下一篇讲 ARP 时,会详细说明主机如何通过广播请求获得同一局域网中某个 IP 对应的 MAC,以及 ARP 缓存为什么必须设置生存时间。

九、常见误区

1. MAC 地址就是电脑的身份证,永远不会变

不够准确。MAC 地址首先是网络接口的标识;更换网卡、使用虚拟网卡、启用随机 MAC 或软件修改地址,都可能让系统呈现不同的 MAC。它通常不随地理位置自动改变,但不能简单说绝对不变。

2. IP 地址和 MAC 地址都能直接定位互联网中的主机

不对。IP 地址负责跨网络路由,MAC 地址通常只在当前链路或局域网内有意义。路由器不会依靠远端 MAC 地址完成全球寻址。

3. 跨网络时 MAC 地址不变

不对。每经过一段新的链路,帧通常会被重新封装,源 MAC 和目的 MAC 也会换成当前链路所需的接口地址。

4. 目标 IP 不在本地,所以帧的目的 MAC 也应该写远端服务器

不对。跨网访问时,源主机第一跳的帧目的 MAC 通常是默认网关接口的 MAC。后续每一跳再由路由器根据下一段链路重新确定目的 MAC。

5. ARP 可以解析任意远端 IP 的 MAC

不对。ARP 解决的是本地链路上的 IP 到 MAC 映射。远端主机不在同一广播域时,源主机解析的是默认网关的 MAC;后续由各路由器在相邻网络中完成下一跳解析。

十、总结

MAC 地址和 IP 地址是分层网络中互相配合的两套地址:IP 地址具有分层结构,用于跨网络路由和描述网络位置;MAC 地址是网络接口的链路层标识,用于当前链路或局域网内的帧交付。

IP 数据报在多个网络之间转发时,源 IP 和目的 IP 通常保持端到端的寻址作用;每经过一段链路,外层帧都会被拆除并重新封装,源 MAC 和目的 MAC 随当前链路变化。也正因为如此,IP 地址负责"走哪条路",MAC 地址负责"这一跳交给谁"。

下一篇将继续解决二者之间的映射问题:已知同一局域网中目标设备的 IP 地址,主机如何自动找到它的 MAC 地址?这就是 ARP 协议要完成的工作。

如果这篇文章对你有帮助,欢迎点赞、评论、关注、收藏。你们的支持是我前进的动力!

相关推荐
电子云与长程纠缠1 小时前
UE5 Lyra PocketWorld进行3D内容UI预览 - 下
开发语言·学习·游戏·ui·ue5
poiu12346571 小时前
视频离线观看用什么软件方便?2026多场景工具实测对比
学习
爱编程的Zion1 小时前
Jenkins 从 0 到 1 学习笔记
笔记·学习·jenkins
FPGA小迷弟1 小时前
AXI4-Stream协议详解与Vivado自定义IP核封装实战
网络协议·tcp/ip·fpga开发·fpga·硬件开发
hsjiasb10 小时前
FreeRTOS学习(二十七)——任务栈与栈溢出检测
开发语言·stm32·学习·学习笔记·freertos
小弥儿10 小时前
GitHub今日热榜 | 2026-08-16:大模型微调与编码工具扎堆
学习·开源·github
xian_wwq13 小时前
【学习笔记】光伏“四可”装置纵密模块--配置方法和原理
笔记·学习
min(a,b)13 小时前
学习第17天:Agent Memory 与 MCP 协议
python·学习
lifallen14 小时前
模型不是函数:claude-cookbooks/misc 十四篇的公共底层
人工智能·学习·ai·ai编程