本文是《计算机网络学习笔记》系列的第十二篇。前几篇从传输层讲到网络层,数据包已经知道"要去哪里"了——但它具体怎么从一台机器传到下一台机器?IP 地址解决的是全局寻址,而链路层解决的是局域网内"最后一公里"的实际传输。本文拆解以太网帧格式,并讲清楚 ARP——将 IP 地址翻译成 MAC 地址的关键协议。

一、链路层的职责

网络层(IP)负责跨网络的端到端路径规划,但它并不直接接触物理介质。数据包在实际传输时,走的是一段一段的链路:

你的电脑  ──► 家用路由器  ──► 运营商路由器  ──► … ──►  目标服务器
         以太网帧        以太网帧         以太网帧

每一跳之间,数据都被封装成一个帧(Frame),在这一段链路上传输。到达下一个节点后,帧被拆开,取出 IP 数据报,再重新封装成新的帧继续前进。

链路层的两个核心职责:

  • 封帧/解帧:在发送时把 IP 数据报打包成帧,接收时拆包交给上层;
  • 差错检测:通过 CRC 检测帧在传输中是否被损坏。

二、MAC 地址:链路层的"门牌号"

IP 地址是逻辑地址,可以改变(比如 DHCP 重新分配)。MAC 地址是网卡出厂时烧录的物理地址,全球唯一,理论上不会重复。

MAC 地址共 6 字节(48 位),通常写成十六进制,用冒号或连字符分隔:

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

前 3 字节是 OUI(组织唯一标识符),由 IEEE 分配给网卡厂商;后 3 字节由厂商自行分配,保证唯一性。

有一个特殊的 MAC 地址:

FF:FF:FF:FF:FF:FF  →  广播地址,局域网内所有设备都会收到

IP 地址和 MAC 地址的分工:

IP 地址MAC 地址
作用范围全局(跨网络)局部(单段链路)
类比收件人的城市+街道(可变)收件人本人(固定)
变化可动态分配出厂固化

三、以太网帧格式

以太网是目前最主流的有线局域网标准。一个以太网帧的结构如下:

+-------------+--------+--------+------+----------+-----+
| 前同步码(8B) | 目的MAC | 源 MAC | 类型 |  数据载荷  | CRC |
|             |  (6B)  |  (6B)  | (2B) | (46~1500B)| (4B)|
+-------------+--------+--------+------+----------+-----+

前同步码(Preamble)— 8 字节

前同步码不携带任何业务数据,纯粹用于物理层的信号同步,分两部分:

  • 前导码(7 字节):每字节均为 10101010,连续的交替信号,作用是"叫醒"接收方的网卡,让它锁定时钟频率,为接收数据做好准备;
  • 帧开始符 SFD(1 字节):值为 10101011,最后两位从 10 变成 11,相当于宣告"前面是预热,从下一个字节开始才是真正的帧"。

前同步码在帧到达网卡驱动之前就被硬件剥掉了,上层软件看不到它。

目的 MAC 地址 — 6 字节

接收方的 MAC 地址。网卡收到帧后,首先比对目的 MAC:

  • 与自己的 MAC 相符 → 继续处理;
  • 是广播地址 FF:FF:FF:FF:FF:FF → 继续处理;
  • 都不是 → 直接丢弃(混杂模式下例外,Wireshark 抓包就需要开启混杂模式)。

源 MAC 地址 — 6 字节

发送方的 MAC 地址,接收方可以通过它知道帧从哪里来。

类型(EtherType)— 2 字节

标识上层协议,告诉接收方拆开帧后数据应该交给谁处理:

上层协议
0x0800IPv4
0x0806ARP
0x86DDIPv6
0x8100VLAN 标签(802.1Q)

数据(Payload)— 46 ~ 1500 字节

封装的上层协议数据,通常是一个 IP 数据报。

  • 最大 1500 字节:这就是 MTU(最大传输单元)的来源,IP 层的分片机制正是为了适配这个限制;
  • 最小 46 字节:以太网要求帧的数据部分不得小于 46 字节,不足时用填充字节补齐,保证接收方能正确检测到帧的结束。

CRC — 4 字节

CRC(Cyclic Redundancy Check,循环冗余检测),覆盖目的 MAC、源 MAC、类型、数据这几个字段。

发送方计算 CRC 值并附在帧尾,接收方收到后重新计算并比对:

  • 一致 → 帧完整,继续处理;
  • 不一致 → 帧在传输中损坏,直接丢弃,不通知发送方,不重传(重传是上层 TCP 的职责)。

四、ARP:IP 地址 → MAC 地址的翻译官

有了以太网帧格式,还剩一个问题:填目的 MAC 地址时,我怎么知道对方的 MAC 是多少?

ARP(Address Resolution Protocol,地址解析协议)就是解决这个问题的——给定一个 IP 地址,找出对应的 MAC 地址。

工作流程

以主机 A(192.168.1.5)想向主机 B(192.168.1.8)发送数据为例:

第一步:A 在局域网广播 ARP Request

目的 MAC:FF:FF:FF:FF:FF:FF(广播,所有人都收)
源  MAC:A 自己的 MAC
内容:"谁的 IP 是 192.168.1.8?请告诉我你的 MAC 地址。"

第二步:B 单播回复 ARP Reply

局域网内所有设备都收到了这个广播,但只有 B 认出了自己的 IP:

目的 MAC:A 的 MAC(单播,只发给 A)
源  MAC:B 的 MAC
内容:"192.168.1.8 是我,我的 MAC 是 AA:BB:CC:DD:EE:FF。"

第三步:A 缓存结果,开始通信

A 把 B 的 IP → MAC 映射存入本地的 ARP 缓存表,下次向 B 发包时直接查表,不必再次广播。

# 查看本机 ARP 缓存表
arp -a

ARP 缓存与超时

ARP 缓存不是永久的,每条记录都有超时时间(通常几分钟),到期自动删除。这样当网络中某台设备更换网卡(MAC 变了),或者 IP 地址重新分配给了另一台机器,缓存会自动失效,下次通信时重新查询,保证地址的准确性。

跨网络通信时怎么办?

当 A 要访问的目标 IP 不在同一局域网(比如访问百度),ARP 的目标就不是百度服务器,而是网关路由器——A 先把包发给网关,由网关负责继续转发。

A 想访问 220.181.38.148(百度)
→ 发现目标不在本局域网
→ ARP 查询网关路由器(192.168.1.1)的 MAC 地址
→ 将帧的目的 MAC 填为路由器的 MAC,发送出去
→ 路由器收到后,再根据路由表决定下一跳

这也解释了为什么 IP 地址和 MAC 地址缺一不可:

  • IP 地址负责全局导航,告诉每一跳"最终目的地在哪";
  • MAC 地址负责局部传递,告诉这一段链路"这个帧该交给谁"。

ARP 与网络层的边界

ARP 是一个有些特殊的协议——它既不属于纯粹的网络层,也不属于纯粹的链路层,而是跨越两层边界:它使用以太网帧传输(链路层),但处理的是 IP 地址(网络层概念)。通常把它理解为"网络层与链路层之间的胶水"。


五、交换机:链路层的转发设备

在局域网中,设备之间通过交换机连接。交换机工作在链路层(第二层),它维护一张 MAC 地址表,记录每个 MAC 地址对应哪个端口:

MAC 地址表(交换机内部):
AA:BB:CC:DD:EE:01  →  端口 1
AA:BB:CC:DD:EE:02  →  端口 3
AA:BB:CC:DD:EE:03  →  端口 5
...

收到一个帧时:

  • 查表找到目的 MAC 对应的端口 → 单播转发,只从那个端口发出;
  • 查不到目的 MAC → 泛洪(Flood),从除入口外的所有端口发出,同时学习源 MAC 对应的端口。

交换机和路由器的区别:

  • 交换机:二层设备,只看 MAC 地址,负责局域网内部转发;
  • 路由器:三层设备,看 IP 地址,负责跨网络转发。

小结

概念一句话总结
MAC 地址网卡的物理地址,6 字节,全球唯一,用于链路层寻址
以太网帧链路层的传输单位,载荷 46~1500 字节,MTU=1500 的来源
CRC帧尾的差错检测字段,损坏直接丢弃,不重传
ARP给定 IP,广播查询对应 MAC;跨网段时查的是网关的 MAC
ARP 缓存本地缓存 IP→MAC 映射,避免每次都广播,有超时机制
交换机二层设备,按 MAC 地址表转发帧,查不到则泛洪

本系列前十一篇:
· 第1篇:《TCP 协议格式详解》
· 第2篇:《TCP 三次握手与四次挥手》
· 第3篇:《TCP 可靠数据传输》
· 第4篇:《TCP 流量控制与拥塞控制》
· 第5篇:《TLS:HTTPS 背后的加密握手》
· 第6篇:《HTTP 协议进化史》
· 第7篇:《DNS:互联网的电话簿》
· 第8篇:《IPv4 与 IPv6:网络层的寻址与路由》
· 第9篇:《NAT:家里的路由器如何帮你"上网"》
· 第10篇:《UDP 协议详解》
· 第11篇:《ICMP:ping 和 traceroute 背后的协议》


参考资料:《计算机网络:自顶向下方法》

标签: none

添加新评论