链路层:以太网帧与 ARP 协议
本文是《计算机网络学习笔记》系列的第十二篇。前几篇从传输层讲到网络层,数据包已经知道"要去哪里"了——但它具体怎么从一台机器传到下一台机器?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 字节
标识上层协议,告诉接收方拆开帧后数据应该交给谁处理:
| 值 | 上层协议 |
|---|---|
0x0800 | IPv4 |
0x0806 | ARP |
0x86DD | IPv6 |
0x8100 | VLAN 标签(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 -aARP 缓存与超时
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 背后的协议》
参考资料:《计算机网络:自顶向下方法》