文章目录
-
- [1. 引入](#1. 引入)
- [2. 以太网](#2. 以太网)
-
- [2.1 问题背景:从主机B到主机C的数据传输](#2.1 问题背景:从主机B到主机C的数据传输)
- [2.2 数据链路层的核心任务:解决"相邻节点"通信](#2.2 数据链路层的核心任务:解决“相邻节点”通信)
- [2.3 以太网:最主流的局域网技术](#2.3 以太网:最主流的局域网技术)
- [2.4 以太网帧格式](#2.4 以太网帧格式)
- [2.4.1 以太网帧结构(RFC 894)](#2.4.1 以太网帧结构(RFC 894))
- [2.4.2 一些共识](#2.4.2 一些共识)
- [2.5 关于MTU](#2.5 关于MTU)
- [3. 重谈局域网通信原理](#3. 重谈局域网通信原理)
-
- [3.1 一些共识](#3.1 一些共识)
- [3.2 一些细节](#3.2 一些细节)
- [3.3 交换机:划分碰撞域,解决多主机冲突](#3.3 交换机:划分碰撞域,解决多主机冲突)
- [4. ARP协议](#4. ARP协议)
-
- [4.1 ARP协议引入](#4.1 ARP协议引入)
- [4.2 ARP协议的基本原理](#4.2 ARP协议的基本原理)
- [4.3 ARP 报文格式(RFC 826)](#4.3 ARP 报文格式(RFC 826))
- [4.4 完整流程模拟](#4.4 完整流程模拟)
- [5. ARP欺骗](#5. ARP欺骗)
1. 引入

数据链路层是OSI参考模型中的第二层,介于物理层和网络层之间。
数据链路层在物理层提供的服务的基础上向网络层提供服务,
其最基本的服务是将源自物理层来的数据可靠地传输到相邻节点的目标机网络层。
数据链路层的主要功能包括封装成帧、透明传输、差错控制、流量控制和链路控制等。
一般适配器都包括了数据链路层和物理层这两层的功能。
2. 以太网

2.1 问题背景:从主机B到主机C的数据传输
当主机B要向主机C发送数据时:
- 网络层(IP层) 负责决定"往哪走"------即根据目的IP地址查询路由表,确定下一跳是哪个路由器(如F、G、H等)。
- 但真正把数据"送出去"的动作,发生在数据链路层------即如何将数据帧交给下一跳设备(比如路由器F)。
✅ 关键点:IP报文本身不能直接在物理线路上跑;它必须封装在数据链路层的帧中(如以太网帧),而帧的传输依赖于MAC地址。
2.2 数据链路层的核心任务:解决"相邻节点"通信
-
什么是"相邻节点"?
- 指处于同一个局域网(LAN)内的两台设备 ,例如:
- 主机B 和 路由器F 的接口在同一以太网交换机下;
- 两台PC通过同一Wi-Fi接入点连接。
- 指处于同一个局域网(LAN)内的两台设备 ,例如:
-
数据链路层要解决的问题:
- 如何在同一个局域网内,把数据准确地从一个节点传送到另一个节点?
- 这需要:
- 物理地址(MAC地址)寻址;
- 帧的封装与解封装;
- 差错检测(如CRC);
- 介质访问控制(如CSMA/CD 或 CSMA/CA)。
🔍 注意:IP地址是逻辑地址 ,用于跨网络寻址;MAC地址是物理地址,用于本地链路通信。
✨ IP让数据"知道去哪",MAC让数据"真正到达下一跳"。二者缺一不可。
在局域网中,数据链路层主要解决同一网络内相邻设备(如主机与默认网关)如何通过MAC地址进行帧传输的问题,而以太网是最常见的局域网数据链路层技术。
2.3 以太网:最主流的局域网技术
-
以太网的本质
- 不是具体的网络,而是一套技术标准(IEEE 802.3);
- 同时涵盖数据链路层(LLC + MAC子层)和部分物理层规范。
-
以太网的关键特性
特性 说明 拓扑结构 早期为总线型,现代多为星型(通过交换机) 传输介质 双绞线(如Cat5e/Cat6)、光纤等 传输速率 10 Mbps(传统以太网)、100 Mbps(快速以太网)、1 Gbps(千兆)、10 Gbps 及以上 MAC地址 48位全球唯一标识,用于局域网内设备识别 帧格式 包含目的MAC、源MAC、类型字段(如0x0800表示IP)、数据、FCS(校验) 访问控制 使用 CSMA/CD(有线以太网,半双工时)或全双工交换(现代主流) -
以太网帧 vs IP数据报
- IP数据报 是网络层的协议单元,包含源/目的IP地址;
- 以太网帧 是数据链路层的协议单元,包含源/目的MAC地址;
- 发送过程:
应用数据 → TCP/UDP段 → IP数据报 → 以太网帧 → 物理信号
-
其他局域网技术
技术 特点 现状 以太网(Ethernet) 高速、低成本、易部署、支持全双工交换 主流,占95%以上 令牌环网(Token Ring) 通过令牌控制访问,避免冲突 已淘汰 FDDI 光纤分布式数据接口,高可靠 基本淘汰 无线局域网(Wi-Fi, IEEE 802.11) 无线介质,使用CSMA/CA 广泛用于移动设备
2.4 以太网帧格式
2.4.1 以太网帧结构(RFC 894)
以太网帧是数据链路层的核心封装单位,其格式如下图所示:

📌 总长度:6 + 6 + 2 + 46~1500 + 4 = 64 ~ 1518 字节
各字段详解:
| 字段 | 长度 | 说明 |
|---|---|---|
| 目的地址 | 6字节 | 接收方的MAC地址,用于在局域网中定位目标设备 |
| 源地址 | 6字节 | 发送方的MAC地址,由网卡硬件固化(48位) |
| 类型(Type) | 2字节 | 表示上层协议类型,决定如何"分用"(demultiplexing) |
| 数据(Data) | 46~1500字节 | 封装的上层协议数据(如IP报文、ARP请求等) |
| CRC(循环冗余校验) | 4字节 | 用于检测帧传输过程中是否发生错误 |
2.4.2 一些共识
- MAC地址(硬件地址)
- 是48位(6字节)全局唯一标识符,由IEEE分配;
- 在网卡出厂时写入ROM,通常不可更改(但可通过软件伪造);
- 格式:
XX:XX:XX:YY:YY:YY,例如00:1A:2B:3C:4D:5E; - 第1位表示单播/多播:0为单播,1为多播或广播;
- 第2位表示本地/全局:0为全局(厂商分配),1为本地(私有)。
✅ 注意 :MAC地址只在同一局域网内有效,不能跨网络路由。
-
类型字段(Type Field)------实现"分用"的关键
该字段决定了帧中携带的是哪种上层协议,常见值包括:
类型值(十六进制) 协议 说明 0x0800IP 表示数据部分是IP数据报(IPv4) 0x0806ARP 地址解析协议,用于获取IP对应的MAC 0x8035RARP 反向ARP,用于无盘工作站获取IP(已基本淘汰) 0x86DDIPv6 IPv6数据报(现代以太网常用) 🔍 分用机制(Demultiplexing) :
当交换机或主机收到一个以太网帧后:
- 解析前14字节(目的MAC、源MAC、类型);
- 提取"类型"字段;
- 根据类型值决定交给哪个上层协议处理:
- 若为
0x0800→ 交给IP协议; - 若为
0x0806→ 交给ARP协议; - 其他值则按对应协议处理。
- 若为
-
数据字段长度限制:[46, 1500] 字节
Q:为什么必须 ≥46 字节?
- 以太网采用CSMA/CD机制(冲突检测),要求最小帧长能覆盖最大冲突窗口;
- 最小帧长为 64字节 (含头部和CRC),因此:
- 头部:14字节(MAC×2 + 类型)
- CRC:4字节
- 所以数据部分至少需要:64 - 14 - 4 = 46字节
- 如果数据不足46字节,则自动填充(Padding)至46字节。
为什么 ≤1500 字节? - MTU(Maximum Transmission Unit) 的标准值;
- 超过1500字节称为"巨型帧(Jumbo Frame)",需特别配置支持;
- 一般路由器、交换机默认不支持大于1500字节的帧。
✅ 1500字节是标准以太网的MTU,也是IP分片的重要参考值。
-
CRC校验码(4字节)
- 使用 CRC-32 算法 对整个帧(除CRC外的所有字段)计算校验值;
- 收到帧后,接收端重新计算CRC并与帧末尾的CRC对比;
- 若不一致,说明帧在传输中受损,直接丢弃;
- 属于差错检测机制,不提供纠错功能。
2.5 关于MTU
-
什么是 MTU?
MTU(Maximum Transmission Unit,最大传输单元) 是指数据链路层一次能够传输的最大有效载荷(Payload)字节数 。它不是整个帧的长度 ,而是帧中"数据"部分的最大限制。
- 以太网的标准 MTU = 1500 字节
这意味着:IP 数据报(即网络层 PDU)不能超过 1500 字节,否则无法被封装进一个标准以太网帧。
📌 注意:以太网帧总长度 = 14(MAC头) + 1500(数据) + 4(CRC) = 1518 字节
所以,"1500"指的是有效载荷上限,而非整个帧的大小。
- 以太网的标准 MTU = 1500 字节
-
MTU 的作用:防止帧过大
不同网络类型有不同的 MTU:
- 以太网:1500 字节
- PPP(拨号):通常 576 字节
- Wi-Fi:一般也是 1500,但可能受配置影响
- 巨型帧(Jumbo Frame):可达 9000 字节(需全网支持)
如果上层(如 IP 层)要发送的数据超过当前链路的 MTU ,则必须进行分片(Fragmentation)。
⚠️ 但 IP 分片会带来问题:
- 增加丢包风险(任一片丢失,整个报文重传)
- 增加路由器处理负担
- 可能被防火墙丢弃
因此,应尽量避免 IP 分片。
-
如何避免分片?------引入 MSS(Maximum Segment Size)
为了避免 IP 层分片,传输层(TCP)需要提前控制发送的数据长度 ,这就引出了 MSS(最大报文段长度)。
-
MSS 的定义
- MSS 是 TCP 报文段中"应用层数据"的最大长度(不包括 TCP 和 IP 头部)。
- 它是在TCP 三次握手阶段协商的参数。
-
MSS 与 MTU 的关系(以太网为例)
层级 内容 长度 数据链路层(以太网帧) 最大有效载荷 1500 字节(即 MTU) 网络层(IP 报文) IP 头部 + TCP 报文段 ≤ 1500 字节 → IP 头部(典型值) 固定头部 20 字节 → 可留给 TCP 的空间 1500 − 20 1480 字节 传输层(TCP 报文段) TCP 头部 + 应用数据 ≤ 1480 字节 → TCP 头部(典型值) 固定头部 20 字节 → 应用层最大数据量(即 MSS) 1480 − 20 1460 字节
✅ 因此,在标准以太网中:
MSS = MTU − IP头部 − TCP头部 = 1500 − 20 − 20 = 1460 字节
💡 注意:MSS 不一定等于 1460!如果 IP 或 TCP 使用了选项字段(头部 >20 字节),MSS 会更小。- MSS 的协商机制
- 在 TCP 三次握手中,双方通过
MSS Option通告自己的 MSS 值; - 实际通信时,采用双方 MSS 中的较小值作为本次连接的 MSS;
- 这样可确保双方发送的 TCP 报文段都能被对方网络无分片地接收。
- 在 TCP 三次握手中,双方通过
-
-
最小帧长与填充(Padding)
除了最大限制,以太网还规定最小帧长为 64 字节(含头部和 CRC):
- 帧头(14B)+ 数据 + 帧尾 CRC(4B) ≥ 64B
⇒ 数据部分 ≥ 46 字节
如果上层数据不足 46 字节(如 ARP 报文仅 28 字节),数据链路层会自动在数据后添加填充字节(Padding),使帧达到最小长度。
✅ 填充由硬件或驱动完成,对上层透明。
- 帧头(14B)+ 数据 + 帧尾 CRC(4B) ≥ 64B
- 46 <= MTU <= 1500的原因:
从临界资源的角度解释:
当多台主机处于同一个局域网下,同时使用以太网,会产生数据碰撞的情况。因此以太网是一种临界资源。 因此,每台主机使用局域网的时间要越短越好 。如果一味的将数据缩短,确实会使单个主机使用局域网的时间减少,但是会大大增加丢包的概率。因此 传输的数据要越长越好。
这里就出现了矛盾。 之所以46 <= MTU <= 1500是经过反复计算得出的最佳情况。
从碰撞检测的角度理解:
最小 46 字节: 源于早期共享式以太网的 CSMA/CD 冲突检测机制。为确保发送方在完成发送前能检测到最远端的冲突,帧必须持续发送足够长时间,对应最小帧长 64 字节(含头尾),故数据部分至少46 字节。不足时由数据链路层填充。
最大 1500字节(MTU): 出于效率与可靠性的平衡。帧太大易因单比特错误导致大量数据重传,且可能长时间占用信道,影响其他设备;帧太小则头部开销占比高。1500字节是广泛接受的经验值。 现代交换式以太网已无碰撞,但为兼容性和标准化,仍沿用这些限制。
- MTU对IP协议的影响 :
由于数据链路层MTU的限制, 对于较大的IP数据包要进行分包.- 将较大的IP包分成多个小包, 并给每个小包打上标签;
- 每个小包IP协议头的 16位标识(id) 都是相同的;
- 每个小包的IP协议头的3位标志字段中, 第2位置为0, 表示允许分片, 第3位来表示结束标记(当前是否是最后一个小包, 是的话置为1, 否则置为0);
- 到达对端时再将这些小包, 会按顺序重组, 拼装到一起返回给传输层;
- 一旦这些小包中任意一个小包丢失, 接收端的重组就会失败. 但是IP层不会负责重新传输数据;
- MTU对UDP协议的影响 :
- 一旦UDP携带的数据超过1472(1500 - 20(IP首部) - 8(UDP首部)), 那么就会在网络层分成多个IP数据报.
- 这多个IP数据报有任意一个丢失, 都会引起接收端网络层重组失败. 那么这就意味着, 如果UDP数据报在网络层被分片, 整个数据被丢失的概率就大 增加了.
- MTU对于TCP协议的影响 :
- TCP的一个数据报也不能无限大, 还是受制于MTU. TCP的单个数据报的最大消息长度, 称为MSS(Max Segment Size);
- TCP在建立连接的过程中, 通信双方会进行MSS协商.
- 最理想的情况下, MSS的值正好是在IP不会被分片处理的最大长度(这个长度仍然是受制于数据链路层的MTU).
- 双方在发送SYN的时候会在TCP头部写入自己能支持的MSS值.
- 然后双方得知对方的MSS值之后, 选择较小的作为最终MSS
- MSS的值就是在TCP首部的40字节变长选项中(kind=2);
3. 重谈局域网通信原理
3.1 一些共识

-
通信过程类比
- 老师(主机A)在教室(局域网)喊话:张三(主机E),作业怎么没做?
- 教室里所有人(所有主机)都能听见,但只做两件事:
- 提取名字(目标MAC地址)
- 和自己名字(本机MAC)比对
- 不是自己 → 直接忽略(丢弃报文)
- 是自己 → 响应并回复
-
真实网络流程
主机A → 主机E 数据发送:
- 局域网内所有主机都能收到数据帧(广播特性)
- 主机B/C/D:提取目标MAC=E,与本机MAC不符 → 丢弃报文,用户无感知
- 主机E:目标MAC匹配本机 → 继续向上层协议栈交付
- 数据链路层:类型0800 → 交给网络层IP
- 网络层:协议字段 → 交给传输层TCP
- TCP:目标端口 → 交给对应进程
- 主机E处理后,按同样流程回复主机A
核心结论:
- 局域网通信本质是广播+地址过滤
- 网络通信本质是主机间进程通信,数据要贯穿完整网络协议栈
- 网卡混杂模式
普通网卡:只接收发给自己的帧
混杂模式:接收局域网内所有数据帧(不做地址过滤)
3.2 一些细节
细节1: 数据碰撞问题
多台主机(处于同一局域网)同时发送数据 会产生信号互相干扰最终导致数据碰撞
规则:同一时刻,局域网只能有一台主机发送数据(局域网是临界资源)
细节2: 碰撞检测与碰撞避免(CSMA/CD思想)碰撞检测:主机发送时持续监测信道
碰撞避免:发生碰撞后,随机等待一段时间再重发
本质:通过特殊机制实现临界资源互斥访问
细节3: 碰撞域整个会发生数据碰撞的局域网范围,称为一个碰撞域
细节4: 碰撞域内主机数量主机越多 → 碰撞概率越高 → 网络越慢
结论:一个碰撞域内主机越少越好
主机过多解决方案:使用交换机
细节5: 数据帧长度(MTU:46~1500)太长:发送耗时久、占用信道久、重传代价大 → 易碰撞
太短:发送帧数变多、密度变大 → 也易碰撞且丢包概率增加
结论:帧长度不能过长也不能过短
细节6: 局域网攻击思路攻击方式:主机持续发送垃圾数据,制造大量碰撞 → 全网断网
但是攻击机发送也要走网络协议栈,你一旦发生碰撞了不是会执行碰撞避免等一会再发吗?
绕过机制:部分工具可绕过协议栈,直接让硬件发送,无视碰撞避免
3.3 交换机:划分碰撞域,解决多主机冲突

-
核心作用
交换机可以划分碰撞域,隔离冲突,提升网络效率 -
工作流程
- 学习MAC地址
- 交换机从某个端口收到帧,记录源MAC + 对应端口
- 逐步建立MAC地址与端口的映射表
- 精准转发
- 已知目标MAC:只转发到对应端口,不泛洪
- 未知目标MAC:才向除入端口外所有端口转发
- 隔离碰撞域
- 同一侧端口内碰撞,不影响另一侧
- 交换机每个端口独立为一个碰撞域
- 学习MAC地址
-
示例场景
- 主机A(左)→ 主机D(左):交换机判断同属左侧,不转发到右侧
- 主机E(右)→ 主机C(右):交换机判断同属右侧,不转发到左侧
- 左右侧互不干扰,碰撞域被有效隔离
4. ARP协议
4.1 ARP协议引入

主机B给主机C发送数据,在将数据转发到目标网络之前都是使用IP地址进行路由的。
而当数据到了路由器D,路由器D就是入口路由器,它和主机C在一个子网中,这时候就需要将数据从路由器D转发给主机C。
现在问题是,我们只知道源IP地址:ipb。目的IP地址:ipc。并不知道主机C的MAC地址。
我们必须得知道主机C的MAC地址,因为需要继续向下交付给数据链路层然后封装成MAC帧才能发送。
因此,在局域网中,我们需要一种能力:把IP地址转换为MAC地址的能力!
由此需要引入一种将IP地址转化为MAC地址的协议 ARP协议。
为什么需要 ARP?
- IP 地址 用于跨网络寻址(逻辑地址);
- MAC 地址 用于同一局域网内设备间的直接通信(物理地址);
- 当主机 A 要向同一局域网内的主机 B 发送数据时:
- 已知 B 的 IP 地址;
- 但不知道 B 的 MAC 地址;
- 而以太网帧必须填写目的 MAC 地址才能发送。
4.2 ARP协议的基本原理
ARP 的作用:通过已知的 IP 地址,查询对应的 MAC 地址。
ARP(Address Resolution Protocol,地址解析协议)是用于将网络层的 IP 地址解析为数据链路层的 MAC 地址 的关键协议,工作在 TCP/IP 模型的网络层与数据链路层之间(或 OSI 模型的第 2~3 层交界处)。它是局域网(LAN)中实现主机间通信的基础。
模拟场景:主机 A(IP_A, MAC_A)要发数据给主机 B(IP_B, MAC_B),两者在同一局域网。
步骤 1:查询本地 ARP 缓存
- 主机 A 先检查自己的 ARP 缓存表 (
arp -a可查看); - 若已有
IP_B → MAC_B的映射 → 直接使用,跳过后续步骤。
步骤 2:广播 ARP 请求(ARP Request)
- 若缓存中没有,则构造一个 ARP 请求帧 :
- 目的 MAC :
FF:FF:FF:FF:FF:FF(广播地址); - 源 MAC :
MAC_A; - 发送方 IP :
IP_A; - 目标 IP :
IP_B; - 操作码(Opcode) :
1(表示请求)。
- 目的 MAC :
- 该帧被广播到整个局域网,所有主机都能收到。
步骤 3:目标主机响应(ARP Reply)
- 主机 B 收到后,发现"目标 IP"是自己 → 构造 ARP 响应帧 :
- 目的 MAC :
MAC_A(单播); - 源 MAC :
MAC_B; - 发送方 IP :
IP_B; - 目标 IP :
IP_A; - 操作码 :
2(表示响应)。
- 目的 MAC :
- 其他主机收到 ARP 请求后,发现目标 IP 不是自己 → 直接丢弃。
步骤 4:更新 ARP 缓存 & 发送数据
- 主机 A 收到 ARP 响应后:
- 将
IP_B → MAC_B存入 ARP 缓存(通常缓存几分钟); - 现在可以封装以太网帧(目的 MAC = MAC_B),正常发送数据。
- 将
思路梳理:
主机A第一次向主机B发送数据时,已知B的IP地址,但不知道其MAC地址。于是,主机A会向整个局域网广播一个ARP请求帧,询问"谁拥有IP_B?请告诉我你的MAC地址"。
局域网内所有主机都能收到这个广播帧,并将其交给上层协议处理。每台主机都会检查ARP请求中的目标IP地址:
- 如果不是自己的IP(如主机C、D等),就直接丢弃,不做响应;
- 只有主机B发现目标IP正是自己的IP,才会构造一个ARP响应,单播回复自己的MAC地址给主机A。
注意这里:ARP 响应是单播帧,虽然局域网中其他主机可能在物理上接收到该帧,但它们的网卡会在数据链路层的 MAC地址匹配阶段直接丢弃,根本不会将帧交给上层的 ARP 协议处理。这与第一次广播 ARP 请求时所有主机都需解析 ARP 报文的情况完全不同------这一次,只靠 MAC 帧头就完成了过滤。
主机A收到该响应后,将IP_B与MAC_B的映射关系存入本地ARP缓存。
此后一段时间内,只要缓存未过期,主机A再向B发送数据时,就无需再次广播ARP请求,而是直接使用缓存中的MAC地址封装以太网帧。
4.3 ARP 报文格式(RFC 826)
ARP协议也是在数据链路层,在MAC帧之上的协议。以太网帧中有2字节的类型,0800表示IP协议,0806表示ARP协议。

| 字段 | 长度 | 典型值 | 说明 |
|---|---|---|---|
| 硬件类型(Hardware Type) | 2 字节 | 0x0001 |
表示底层网络类型• 1 = 以太网(Ethernet)• 其他值用于 FDDI、令牌环等 |
| 协议类型(Protocol Type) | 2 字节 | 0x0800 |
表示要解析的上层协议• 0x0800 = IPv4• 0x86DD = IPv6(但 IPv6 不用 ARP) |
| 硬件地址长度(HLEN) | 1 字节 | 6 |
MAC 地址长度(字节) |
| 协议地址长度(PLEN) | 1 字节 | 4 |
IP 地址长度(字节) |
| 操作码(Opcode) | 2 字节 | 1 或 2 |
• 1 = ARP 请求(Request)• 2 = ARP 响应(Reply) |
| 发送方硬件地址(SHA) | 6 字节 | 如 aa:bb:cc:dd:ee:ff |
发送者的 MAC 地址 |
| 发送方协议地址(SPA) | 4 字节 | 如 192.168.1.10 |
发送者的 IP 地址 |
| 目标硬件地址(THA) | 6 字节 | 请求时为 00:00:00:00:00:00响应时为真实 MAC |
• 请求时未知,填全 0 • 响应时填目标 MAC |
| 目标协议地址(TPA) | 4 字节 | 如 192.168.1.20 |
要查询的 IP 地址 |
4.4 完整流程模拟

在数据链路层中,当路由器 R 需要获取主机 E 的 MAC 地址时,会首先构建一个 ARP 请求报文。在 ARP 报头中,各字段含义如下:
- 硬件类型填
1,表示以太网; - 协议类型填
0x0800,表示需要解析的是 IP 协议; - 硬件地址长度填
6,表示 MAC 地址长度为 6 字节; - 协议地址长度填
4,表示 IP 地址长度为 4 字节; - 发送端以太网地址填写
MACR; - 发送端 IP 地址填写
IPR; - 目的以太网地址未知,因此填写全
FF:FF:FF:FF:FF:FF; - 目的 IP 地址填写
IPE。
随后,该 ARP 报文向下交付给数据链路层进行封装,构造成一个 MAC 帧:
- 以太网目的地址:全 F(广播)
- 以太网源地址:MACR
- 帧类型:
0x0806(表示 ARP 协议)
由于这是广播帧,因此会被同一局域网内的所有主机接收。
主机 B、C、D 的处理过程
当主机 B 收到该 MAC 帧后,会进行如下处理:
- 首先检查以太网目的地址,发现是全 F,说明是广播帧,需要处理;
- 查看帧类型为
0x0806,上交给 ARP 协议层; - 在 ARP 层检查
op字段,发现值为1,表示 ARP 请求; - 再检查目的 IP 地址,发现并非自己的 IP 地址;
- 因此直接丢弃该 ARP 请求。
主机 C 和主机 D 的处理逻辑完全相同。
主机 E 的处理过程
主机 E 收到广播帧后:
- 检查目的 MAC 地址为全 F,因此继续处理;
- 查看帧类型为
0x0806,交付给 ARP 协议; - 检查
op = 1,确认为 ARP 请求; - 检查目的 IP 地址为
IPE,与自身 IP 相同; - 因此确认该 ARP 请求是发给自己的。
于是,主机 E 构建 ARP 应答报文。

在 ARP 应答中:
- 发送端以太网地址:MACE
- 发送端 IP 地址:IPE
- 目的以太网地址:MACR
- 目的 IP 地址:IPR
op = 2(ARP 应答)
然后向下封装 MAC 帧:
- 以太网目的地址:MACR(单播)
- 以太网源地址:MACE
- 帧类型:
0x0806
单播帧的处理差异
此时主机 B、C、D 也可能收到该数据帧,但它们会在 MAC 层 就进行检查:
- 发现目的 MAC 地址不是自己;
- 直接在数据链路层丢弃。
这里与之前广播丢弃的区别在于:
- 第一次丢弃是在 ARP 协议层(因为广播必须先上交);
- 第二次丢弃是在 MAC 层(单播帧直接过滤)。
路由器 R 的处理
路由器 R 收到该单播帧后:
- 检查 MAC 目的地址等于自身地址 MACR;
- 查看帧类型
0x0806,交付给 ARP 协议层; - 检查
op = 2,确认是 ARP 应答; - 读取发送端 IP 地址和 MAC 地址;
- 将
IPE : MACE的映射关系写入 ARP 缓存表。
至此,一次完整的 ARP 请求-应答流程完成。
随后,路由器即可将 IP 报文向下封装为 MAC 帧,并将数据转发给主机 E。
ARP 报文的通用处理逻辑
任何主机都可能收到 ARP 请求或 ARP 应答。因此,ARP 的通用处理流程是:
-
先检查
op字段; -
根据
op类型决定处理方式:1→ ARP 请求2→ ARP 应答

从更高层视角看数据转发
当主机发送数据时,网络层首先根据目标 IP 地址查找路由表:
- 若目标在同一子网内,直接 ARP 获取目标 MAC;
- 若不在同一子网内,则查找下一跳或默认路由;
- 下一跳一定与当前主机处于同一子网;
- 主机发起 ARP 请求获取下一跳的 MAC 地址;
- 然后向下封装 MAC 帧并发送。
在路由器处:
- 网卡接收 MAC 帧;
- 数据链路层解包;
- 向上交付网络层;
- 根据目的 IP 查找路由表;
- 再次确定下一跳;
- 通过 ARP 获取下一跳 MAC;
- 再向下封装并继续转发。
这个过程会不断重复,直到数据到达最终主机。
分层协作机制
如果在传输过程中发生丢包或某个路由器故障:
- 发送方长时间得不到响应;
- TCP 在传输层执行超时重传;
- 网络层只负责路径选择;
- 数据链路层负责局域网内的帧转发;
- 传输层负责可靠性策略。
因此可以总结:
- 数据链路层:真正传输的是 MAC 帧
- 网络层:逻辑上传递的是 IP 报文
- 传输层:逻辑上是端到端的 TCP/UDP
- 应用层:直接面向应用程序
逻辑上我们认为:
- 网络层报文穿越多个网络层节点;
- 传输层数据直接从一端传到另一端;
- 应用层数据直接从发送方应用传给接收方应用。
而在接收端,应用程序需要解决:
- TCP 粘包问题;
- 数据的序列化与反序列化问题。
至此,ARP 的广播解析机制、单播响应机制,以及跨网络转发的完整流程就清晰地串联起来了
5. ARP欺骗

在正常情况下的流程:
-
主机 A
- IP:ipA
- MAC:macA
-
路由器 R
- IP:ipR
- MAC:macR
① 主机 A 要访问外网
主机 A 发现目标不在同一子网,于是:
-
查路由表 → 下一跳是 ipR
-
发送 ARP 请求:
谁是 ipR?请告诉我你的 MAC 地址
这是一个广播。
② 路由器 R 回复
路由器 R 收到后:
ipR 对应的 MAC 是 macR
然后单播给主机 A。
③ 双方更新 ARP 表
此时:
-
主机 A 记录:
ipR → macR -
路由器 R 记录:
ipA → macA
通信建立成功。
主机 A 发给路由器的帧:
目的 MAC = macR
源 MAC = macA
一切正常。

现在多了一个攻击者:
-
主机 M
- MAC:macM
攻击者的目标:
让主机 A 和 路由器 R 都误认为 macM 才是对方。
攻击过程详解
第一步:欺骗主机 A
攻击者 M 主动发送 ARP 应答(伪造):
ipR 的 MAC 地址是 macM
注意:
- ARP 是无状态协议
- 不需要请求就可以发送应答
- 主机 A 收到后会直接更新 ARP 表
于是主机 A 的 ARP 表变成:
ipR → macM ❌(被污染)
第二步:欺骗路由器 R
攻击者再向路由器发送伪造 ARP 应答:
ipA 的 MAC 地址是 macM
路由器更新:
ipA → macM ❌(被污染)
现在情况变成:
主机 A 认为:
ipR → macM
路由器 R 认为:
ipA → macM
于是:
-
主机 A 发往外网的数据
→ 实际发给 macM
-
路由器回复给 ipA 的数据
→ 实际发给 macM
攻击者 M 成了"中间人"。
攻击者可以做什么?

攻击者现在掌握了全部流量,可以:
1️⃣ 监听(最常见)
- 抓包
- 读取账号密码
- 读取 Cookie
- 读取明文数据
2️⃣ 篡改数据
- 替换网页内容
- 注入广告
- 植入恶意脚本
3️⃣ 阻断通信
攻击者如果不转发数据:
- 主机 A 和路由器 R 无法通信
- 网络中断
这叫:
ARP 断网攻击
为什么 ARP 会被欺骗?
因为 ARP 协议有三个致命特点:
① 无认证机制
ARP 没有身份验证机制,任何人都可以发 ARP 应答。
② 无连接状态
即使你没发请求,只要收到 ARP 应答,也会更新缓存。
③ 自动更新缓存
系统默认:
收到 ARP 应答 → 更新 ARP 表
完