文章目录
-
- [数据链路层与以太网详解:从 MAC 地址到 ARP 的完整指南](#数据链路层与以太网详解:从 MAC 地址到 ARP 的完整指南)
- 一、数据链路层的作用
-
- [1.1 什么是数据链路层](#1.1 什么是数据链路层)
- [1.2 数据链路层 vs 网络层](#1.2 数据链路层 vs 网络层)
- [1.3 为什么需要两层地址](#1.3 为什么需要两层地址)
- 二、以太网技术
-
- [2.1 什么是以太网](#2.1 什么是以太网)
- [2.2 以太网帧格式](#2.2 以太网帧格式)
-
- [1. 目的MAC地址(6字节)](#1. 目的MAC地址(6字节))
- [2. 源MAC地址(6字节)](#2. 源MAC地址(6字节))
- [3. 类型/长度字段(2字节)](#3. 类型/长度字段(2字节))
- [4. 数据字段(46-1500字节)](#4. 数据字段(46-1500字节))
- [5. CRC校验码(4字节)](#5. CRC校验码(4字节))
- [2.3 以太网的工作原理](#2.3 以太网的工作原理)
-
- [1. CSMA/CD(载波侦听多路访问/冲突检测)](#1. CSMA/CD(载波侦听多路访问/冲突检测))
- [2. 交换机的工作原理](#2. 交换机的工作原理)
- 三、MAC地址
-
- [3.1 认识MAC地址](#3.1 认识MAC地址)
- [3.2 MAC地址的特点](#3.2 MAC地址的特点)
-
- [1. 出厂时固化](#1. 出厂时固化)
- [2. 通常不能修改](#2. 通常不能修改)
- [3. 局域网内唯一](#3. 局域网内唯一)
- [3.3 MAC地址 vs IP地址](#3.3 MAC地址 vs IP地址)
- 四、MTU(最大传输单元)
-
- [4.1 什么是MTU](#4.1 什么是MTU)
- [4.2 MTU的限制原因](#4.2 MTU的限制原因)
- [4.3 MTU对IP协议的影响](#4.3 MTU对IP协议的影响)
-
- [1. IP分片的过程](#1. IP分片的过程)
- [2. IP首部的分片字段](#2. IP首部的分片字段)
- [3. IP分片的问题](#3. IP分片的问题)
- [4.4 MTU对UDP协议的影响](#4.4 MTU对UDP协议的影响)
-
- [1. UDP数据包的大小限制](#1. UDP数据包的大小限制)
- [2. UDP的最佳实践](#2. UDP的最佳实践)
- [4.5 MTU对TCP协议的影响](#4.5 MTU对TCP协议的影响)
-
- [1. MSS(最大报文段长度)](#1. MSS(最大报文段长度))
- [2. MSS协商](#2. MSS协商)
- [3. MSS和MTU的关系](#3. MSS和MTU的关系)
- [4. TCP避免IP分片](#4. TCP避免IP分片)
- 五、ARP协议
-
- [5.1 为什么需要ARP协议](#5.1 为什么需要ARP协议)
- [5.2 ARP协议的工作流程](#5.2 ARP协议的工作流程)
-
- 场景设定
- [Step 1:发送ARP请求(广播)](#Step 1:发送ARP请求(广播))
- [Step 2:接收ARP请求](#Step 2:接收ARP请求)
- [Step 3:发送ARP应答(单播)](#Step 3:发送ARP应答(单播))
- [Step 4:接收ARP应答并缓存](#Step 4:接收ARP应答并缓存)
- [5.3 ARP数据报格式](#5.3 ARP数据报格式)
- [5.4 ARP缓存表](#5.4 ARP缓存表)
-
- [1. 什么是ARP缓存表](#1. 什么是ARP缓存表)
- [2. ARP缓存表的特点](#2. ARP缓存表的特点)
- [3. 免费ARP(Gratuitous ARP)](#3. 免费ARP(Gratuitous ARP))
- 六、ARP实战应用
-
- [6.1 ARP协议的完整过程演示](#6.1 ARP协议的完整过程演示)
-
- [Step 1:判断目标是否在同一子网](#Step 1:判断目标是否在同一子网)
- [Step 2:获取网关的MAC地址](#Step 2:获取网关的MAC地址)
- [Step 3:封装以太网帧](#Step 3:封装以太网帧)
- [Step 4:网关转发](#Step 4:网关转发)
- [Step 5:逐跳转发](#Step 5:逐跳转发)
- [Step 6:到目标](#Step 6:到目标)
- [6.2 ARP欺骗原理](#6.2 ARP欺骗原理)
-
- [1. 什么是ARP欺骗](#1. 什么是ARP欺骗)
- [2. ARP欺骗的原理](#2. ARP欺骗的原理)
- [3. 双向ARP欺骗](#3. 双向ARP欺骗)
- [6.3 ARP欺骗的防范](#6.3 ARP欺骗的防范)
-
- [1. 静态ARP绑定](#1. 静态ARP绑定)
- [2. ARP防护软件](#2. ARP防护软件)
- [3. 交换机端口安全](#3. 交换机端口安全)
- [4. 使用加密协议](#4. 使用加密协议)
- [5. 网络隔离](#5. 网络隔离)
- 七、本篇总结
-
- [7.1 核心要点](#7.1 核心要点)
- [7.2 容易混淆的点](#7.2 容易混淆的点)
数据链路层与以太网详解:从 MAC 地址到 ARP 的完整指南
💬 开篇 :前面我们学习了网络层的IP协议,它负责跨越多个网络的端到端传输。但在同一个局域网内,数据是如何传输的?两台在同一交换机下的电脑如何找到对方?这就是数据链路层的职责。数据链路层是网络协议栈中非常重要的一层,它定义了物理网络上的数据传输格式(以太网帧)、设备标识(MAC地址)、以及IP地址到物理地址的映射(ARP协议)。理解了数据链路层,你就理解了局域网是如何工作的,也就理解了为什么网络层和数据链路层缺一不可。这一篇会详细讲解以太网帧格式、MAC地址、MTU对各层协议的影响、ARP协议的工作原理,以及ARP欺骗的原理和防范。
👍 点赞、收藏与分享:这篇会把数据链路层讲透,包括以太网帧结构、MAC地址与IP地址的区别、MTU的重要性、ARP协议的完整工作流程,以及ARP欺骗的实战分析。如果对你有帮助,请点赞收藏!
🚀 循序渐进:从数据链路层的作用讲起,到以太网标准,到MAC地址,到MTU的影响,到ARP协议,到ARP实战应用,一步步掌握数据链路层的核心知识。
一、数据链路层的作用
1.1 什么是数据链路层
数据链路层的核心任务:
bash
在同一个数据链路(局域网)上,将数据从一个设备传输到另一个设备
数据链路的概念:
bash
数据链路是指在物理层之上建立的,能够在两个或多个节点之间传输数据的通信链路
典型的数据链路:以太网、Wi-Fi、PPP(点对点协议)
类比:唐僧取经的白龙马
bash
唐僧要从长安到西天取经:
* 整个旅程:长安 → 西天(网络层负责)
* 每一段路程:驿站A → 驿站B → 驿站C(数据链路层负责)
* 交通工具:白龙马(物理层)
网络通信也是一样:
* 整个通信:北京电脑 → 上海电脑(网络层负责)
* 每一跳:路由器A → 路由器B → 路由器C(数据链路层负责)
* 传输介质:网线、光纤、无线电波(物理层)
1.2 数据链路层 vs 网络层
对比理解:
| 特性 | 网络层 | 数据链路层 |
|---|---|---|
| 作用范围 | 端到端(可跨越多个网络) | 点到点(同一数据链路内) |
| 地址类型 | IP地址(逻辑地址) | MAC地址(物理地址) |
| 寻址范围 | 全球范围 | 局域网范围 |
| 核心设备 | 路由器 | 交换机 |
| 典型协议 | IP、ICMP | 以太网、Wi-Fi |
| 主要功能 | 选择路径(路由) | 帧封装、差错检测 |
形象理解:
bash
寄快递的例子:
网络层:
* 写上完整地址:"上海市浦东新区XX路XX号"
* 快递公司规划路线:北京 → 天津 → 济南 → 南京 → 上海
* 这是整体的、端到端的路径规划
数据链路层:
* 每一段具体的运输:"北京分拣中心 → 天津分拣中心"
* 使用具体的车牌号识别车辆
* 每个分拣中心只关心"下一站是哪里"
* 这是局部的、点到点的传输
再举个例子:
bash
你在北京,要访问上海的一台服务器(180.10.1.100)
网络层(IP协议):
* 你的IP:123.123.123.123
* 目标IP:180.10.1.100
* 路径:你的路由器 → 运营商路由器1 → ... → 上海的路由器
数据链路层(以太网):
* 第一跳:你的电脑(MAC: AA:BB:CC:DD:EE:FF) → 你的路由器(MAC: 11:22:33:44:55:66)
* 第二跳:你的路由器 → 运营商路由器1
* ...
* 最后一跳:上海的路由器 → 目标服务器
每一跳都使用MAC地址来标识源和目的设备
1.3 为什么需要两层地址
问题:既然有了IP地址,为什么还需要MAC地址?
答案:IP地址和MAC地址各有各的用途,缺一不可。
IP地址的特点:
bash
* 逻辑地址,可以灵活分配
* 描述网络拓扑结构(网络号+主机号)
* 用于全局范围的寻址
* 可以改变(换网络、DHCP重新分配)
MAC地址的特点:
bash
* 物理地址,出厂时固化
* 不描述网络拓扑结构
* 用于局域网内的直接通信
* 基本不变(除非换网卡)
为什么两者都需要:
1. 灵活性:
bash
如果只用MAC地址:
* 路由表会变得巨大(每个MAC地址一条路由)
* 无法根据网络拓扑优化路由
* 设备移动到新网络,MAC不变,路由无法更新
有了IP地址:
* 路由表只需要记录网络号
* 根据网络拓扑聚合路由
* 设备移动到新网络,获得新IP,路由自动正确
2. 分层解耦:
bash
网络层只关心"怎么到达目标网络"
数据链路层只关心"怎么在局域网内传输"
两层各司其职,互不干扰
例子:
bash
你从家里的WiFi换到公司的WiFi:
* MAC地址:不变(网卡没换)
* IP地址:改变(192.168.1.100 → 10.0.0.50)
* 路由器根据新IP正确路由数据包
二、以太网技术
2.1 什么是以太网
以太网(Ethernet):
bash
不是一种具体的网络,而是一种技术标准
定义了局域网的工作方式
以太网标准包含的内容:
bash
1. 数据链路层的内容:
* 帧格式
* MAC地址
* 访问控制方式
2. 物理层的内容:
* 网线类型(双绞线)
* 传输速率(10M、100M、1000M、10G)
* 网络拓扑结构(星型、总线型)
以太网的发展:
| 标准 | 速率 | 名称 | 出现时间 |
|---|---|---|---|
| 10BASE-T | 10 Mbps | 以太网 | 1980年代 |
| 100BASE-TX | 100 Mbps | 快速以太网 | 1990年代 |
| 1000BASE-T | 1 Gbps | 千兆以太网 | 2000年左右 |
| 10GBASE-T | 10 Gbps | 万兆以太网 | 2010年左右 |
以太网的地位:
bash
以太网是目前应用最广泛的局域网技术
家庭、公司、学校、数据中心都在用
其他局域网技术:
* 令牌环网(Token Ring):已淘汰
* 无线LAN(Wi-Fi):无线局域网,也遵循类似的标准
* FDDI:光纤局域网,用于骨干网
2.2 以太网帧格式
以太网帧的整体结构:
bash
┌──────────┬──────────┬──────────┬───────────────┬────────┐
│ 目的MAC6 │ 源MAC6 │ 类型2 │ 数据46~1500 │ FCS/CRC4│
└──────────┴──────────┴──────────┴───────────────┴────────┘

1. 目的MAC地址(6字节)
作用:标识接收方的网卡地址。
格式:
bash
6个字节,48位
通常用冒号分隔的16进制表示
例如:AA:BB:CC:DD:EE:FF
特殊值:
bash
FF:FF:FF:FF:FF:FF:广播地址
发送给局域网内所有设备
2. 源MAC地址(6字节)
作用:标识发送方的网卡地址。
格式:与目的MAC地址相同。
3. 类型/长度字段(2字节)
作用:标识上层协议的类型。
常见的类型值:
| 类型值 | 协议 |
|---|---|
| 0x0800 | IPv4 |
| 0x0806 | ARP |
| 0x8035 | RARP |
| 0x86DD | IPv6 |
例子:
bash
如果类型字段=0x0800
说明这个以太网帧的数据部分是一个IP数据包
网卡收到后,会把数据部分交给IP层处理
4. 数据字段(46-1500字节)
最小长度:46字节
bash
如果上层协议的数据不足46字节,需要填充(Padding)
例如:ARP数据包只有28字节,需要填充18字节
最大长度:1500字节
bash
这个1500字节的限制就是MTU(最大传输单元)
超过1500字节的数据需要在网络层分片
为什么有最小长度限制:
bash
为了保证冲突检测机制的正常工作,如果帧太短,可能在冲突发生前就已经发送完毕。无法检测到冲突
这部分具体计算涉及到CSMA/CD协议,争用期51.2us,以太网标准传播速率10Mbps。
发送时延必须大于争用期,所以最小发送数据大小为512比特,即64字节
注意:最小帧长 64B 不包含前导码和帧起始定界符;在交换机全双工网络里 CSMA/CD 基本不再使用,但帧格式和最小帧长仍保留。
5. CRC校验码(4字节)
作用:检测传输过程中是否发生错误。
算法:
bash
CRC-32(循环冗余校验)
接收方重新计算CRC
如果计算结果与接收到的CRC不一致,说明数据损坏,丢弃该帧
注意:
bash
数据链路层只负责检测错误,不负责纠正错误
如果发现错误,直接丢弃
由上层协议(如TCP)负责重传
2.3 以太网的工作原理
1. CSMA/CD(载波侦听多路访问/冲突检测)
早期以太网的访问控制方式(总线型以太网):
CSMA(Carrier Sense Multiple Access):
bash
CS(Carrier Sense,载波侦听):
* 发送前先侦听信道是否空闲
* 如果有其他设备在发送,等待
MA(Multiple Access,多路访问):
* 多个设备共享同一条总线
* 任何设备都可以发送
CD(Collision Detection,冲突检测):
bash
即使侦听了,仍可能发生冲突(两个设备同时侦听到空闲,同时发送)
检测到冲突后,立即停止发送
等待随机时间后重试
现代以太网:
bash
使用交换机而不是总线
每个端口是独立的,不会发生冲突
CSMA/CD已经相对不重要了
2. 交换机的工作原理
交换机维护一个MAC地址表:
| MAC地址 | 端口号 |
|---|---|
| AA:BB:CC:DD:EE:FF | 1 |
| 11:22:33:44:55:66 | 2 |
| FF:EE:DD:CC:BB:AA | 3 |
学习过程:
bash
1. 交换机收到一个帧
2. 查看源MAC地址
3. 记录"这个MAC地址在哪个端口"
4. 更新MAC地址表
转发过程:
bash
1. 交换机收到一个帧
2. 查看目的MAC地址
3. 查找MAC地址表
4. 如果找到,从对应端口发出
5. 如果没找到目的 MAC,交换机会做"未知单播泛洪"(除入端口外向所有端口转发),直到学到该 MAC 所在端口。
例子:
bash
设备A(MAC: AA:AA:AA:AA:AA:AA,端口1)
发送数据给设备B(MAC: BB:BB:BB:BB:BB:BB,端口2)
交换机的处理:
1. 收到帧,源MAC=AA:AA:AA:AA:AA:AA
2. 记录:AA:AA:AA:AA:AA:AA在端口1
3. 查看目的MAC=BB:BB:BB:BB:BB:BB
4. 查表:BB:BB:BB:BB:BB:BB在端口2
5. 从端口2发出(只发给端口2,不发给其他端口)
这样,端口3、端口4的设备不会收到这个帧
提高了网络效率,增加了安全性
三、MAC地址
3.1 认识MAC地址
MAC(Media Access Control)地址:
bash
也叫物理地址、硬件地址、以太网地址
用于在数据链路层标识网络设备
长度:
bash
48位 = 6字节
表示方法:
bash
16进制,用冒号或短横线分隔
例如:
08:00:27:03:FB:19
08-00-27-03-FB-19
0800.2703.FB19(Cisco格式)
结构:
bash
┌────────────────────────┬────────────────────────┐
│ 厂商标识(OUI) │ 网卡序列号 │
│ 24位 │ 24位 │
└────────────────────────┴────────────────────────┘
OUI(Organizationally Unique Identifier):
* 由IEEE分配给各个厂商
* 全球唯一
* 例如:
* 08:00:27 → Oracle VirtualBox
* 00:1C:42 → Parallels(虚拟机)
* 00:50:56 → VMware
查看MAC地址:
bash
# Linux
ifconfig
ip addr
# Windows
ipconfig /all
# macOS
ifconfig
例子:
bash
$ ifconfig eth0
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.1.100 netmask 255.255.255.0
ether 08:00:27:03:fb:19 txqueuelen 1000 (Ethernet)
↑
这就是MAC地址
3.2 MAC地址的特点
1. 出厂时固化
bash
网卡生产时,厂商会给每块网卡分配一个唯一的MAC地址
烧录在网卡的ROM中
理论上全球唯一
2. 通常不能修改
bash
物理MAC地址固化在硬件中,不能修改
但是:
1. 某些网卡支持修改MAC地址(修改的是软件层面的,硬件层面不变)
2. 虚拟机的MAC地址可以修改
3. 操作系统可以临时修改MAC地址(重启后恢复)
3. 局域网内唯一
bash
同一局域网内,MAC地址必须唯一
否则会发生冲突
但是:
- 不同局域网的MAC地址可以重复(虽然理论上全球唯一,但实际可能重复)
- 虚拟机的MAC地址可能冲突(虚拟机软件随机生成)
3.3 MAC地址 vs IP地址
对比:
| 特性 | MAC地址 | IP地址 |
|---|---|---|
| 层次 | 数据链路层 | 网络层 |
| 长度 | 48位(6字节) | 32位(4字节,IPv4) |
| 分配方式 | 厂商分配,出厂固化 | 网络管理员分配或DHCP动态分配 |
| 作用范围 | 局域网内 | 全球范围 |
| 是否可变 | 基本不变 | 经常变化 |
| 是否唯一 | 理论上全球唯一 | 私有IP可以重复,公网IP全球唯一 |
| 是否有层次结构 | 无(只有厂商标识和序列号) | 有(网络号+主机号) |
类比:身份证 vs 地址
bash
MAC地址 → 身份证号:
- 出生时分配
- 终身不变
- 全国唯一
- 没有层次结构(不能看出你在哪个省份)
IP地址 → 家庭住址:
- 可以改变(搬家)
- 有层次结构(省/市/区/街道/门牌号)
- 描述了你在网络中的位置
为什么需要两种地址:
bash
快递的例子:
IP地址:快递面单上的地址
- 描述目的地:"北京市朝阳区XX路XX号"
- 用于长距离路由
MAC地址:快递员的对讲机号
- 在小区内,快递员之间用对讲机联系
- "3号楼的快递员,有你的包裹"
- 用于短距离通信
两者配合:
- 跨城市运输:用地址(IP)
- 小区内投递:用对讲机号(MAC)
四、MTU(最大传输单元)
4.1 什么是MTU
MTU(Maximum Transmission Unit,最大传输单元):
bash
数据链路层一次能传输的最大数据包大小
类比:快递包裹尺寸限制
bash
快递公司规定:
- 单个包裹最大尺寸:60cm × 40cm × 40cm
- 超过这个尺寸,必须拆分成多个包裹
MTU也是一样:
- 以太网规定:单个帧最大1500字节
- 超过这个大小,必须在网络层分片
不同网络的MTU:
| 网络类型 | MTU |
|---|---|
| 以太网 | 1500字节 |
| PPPoE(宽带拨号) | 1492字节 |
| Wi-Fi | 通常1500字节 |
| 令牌环网 | 4464字节 |
| FDDI | 4352字节 |
查看MTU:
bash
# Linux
ifconfig
# Windows
netsh interface ipv4 show interfaces
# 输出示例:
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
↑
这是MTU
4.2 MTU的限制原因
为什么要限制MTU:
1. 硬件限制:
bash
网卡的缓冲区大小有限
帧太大,缓冲区放不下
2. 错误恢复:
bash
帧越大,出错的概率越高
一旦出错,重传的代价越大
小帧的好处:
- 出错概率小
- 重传代价小
3. 公平性:
bash
如果允许发送巨大的帧
一个设备可能长时间占用信道
其他设备无法发送
4. 延迟:
bash
帧越大,发送时间越长
增加延迟
例如:
10Mbps的网络,发送1500字节的帧
传输时间 = 1500 × 8 / 10,000,000 = 1.2ms
如果允许发送15000字节的帧
传输时间 = 15000 × 8 / 10,000,000 = 12ms
4.3 MTU对IP协议的影响
问题:如果IP数据包超过MTU怎么办?
答案:IP分片(Fragmentation)。
1. IP分片的过程
场景:
bash
发送一个数据部分为5000字节的IP数据包
以太网MTU=1500字节
需要分片
分片过程:
bash
原始IP数据包:
┌────────────┬────────────────────────────────┐
│ IP首部 │ 数据(5000字节) │
│ (20字节) │ │
└────────────┴────────────────────────────────┘
分片后:
片1:
┌────────────┬────────────────────────────────┐
│ IP首部 │ 数据1(1480字节) │
│ (20字节) │ │
└────────────┴────────────────────────────────┘
总长度:1500字节 ✓
片2:
┌────────────┬────────────────────────────────┐
│ IP首部 │ 数据2(1480字节) │
│ (20字节) │ │
└────────────┴────────────────────────────────┘
总长度:1500字节 ✓
片3:
┌────────────┬────────────────────────────────┐
│ IP首部 │ 数据3(1480字节) │
│ (20字节) │ │
└────────────┴────────────────────────────────┘
总长度:1500字节 ✓
片4:
┌────────────┬────────────────────┐
│ IP首部 │ 数据4(560字节) │
│ (20字节) │ │
└────────────┴────────────────────┘
总长度:580字节 ✓
计算:
1480 + 1480 + 1480 + 560 = 5000字节 ✓
2. IP首部的分片字段
标识字段(16位):
bash所有分片的标识字段都相同
用于重组时识别属于同一个数据包
例如:
片1: 标识=12345
片2: 标识=12345
片3: 标识=12345
片4: 标识=12345
标志字段(3位):
bash
┌──────┬──────┬──────┐
│ 保留 │ DF │ MF │
└──────┴──────┴──────┘
DF(Don't Fragment,禁止分片):
- DF=0:允许分片
- DF=1:禁止分片(如果超过MTU,丢弃并返回ICMP错误)
MF(More Fragments,更多分片):
- MF=1:后面还有分片
- MF=0:这是最后一个分片
分片偏移字段(13位):
bash
表示当前分片在原始数据中的偏移位置
单位:8字节
例如:
片1: 偏移=0(0×8=0)
片2: 偏移=185(185×8=1480)
片3: 偏移=370(370×8=2960)
片4: 偏移=555(555×8=4440)
完整示例:
bash
片1:
- 标识:12345
- MF:1(还有更多分片)
- 偏移:0
- 数据:0-1479字节
片2:
- 标识:12345
- MF:1
- 偏移:185(1480字节)
- 数据:1480-2959字节
片3:
- 标识:12345
- MF:1
- 偏移:370(2960字节)
- 数据:2960-4439字节
片4:
- 标识:12345
- MF:0(最后一个分片)
- 偏移:555(4440字节)
- 数据:4440-4999字节
3. IP分片的问题
问题1:任意一个分片丢失,整个数据包丢失
bash
发送4个分片:片1、片2、片3、片4
如果片2丢失了
接收方无法重组完整的数据包
整个数据包丢失
结果:
- 浪费了片1、片3、片4的传输
- 接收方需要等待超时才能确认丢失
- 效率低下
问题2:IP层不负责重传
bash
IP是不可靠的协议
分片丢失了,IP层不会重传
需要上层协议(TCP)重传整个数据包
问题3:分片增加丢包概率
bash
原本1个数据包的丢包概率:p
分成4个分片后,任意一个丢失就失败
成功概率 = (1-p)^4
丢失概率 = 1 - (1-p)^4 ≈ 4p(p很小时)
丢包概率增加了约4倍!
结论:
bash
尽量避免IP分片
在传输层控制数据包大小,避免分片
4.4 MTU对UDP协议的影响
1. UDP数据包的大小限制
计算:
bash
以太网MTU:1500字节
- IP首部:20字节
- UDP首部:8字节
= UDP数据部分最大:1472字节
如果超过1472字节:
bash
UDP数据包会在IP层被分片
带来前面提到的所有分片问题
2. UDP的最佳实践
建议:
bash
UDP数据部分不要超过1472字节
避免IP分片
提高传输可靠性
例子:
bash
// 错误做法:发送3000字节的UDP数据
char data[3000];
sendto(sock, data, 3000, ...);
// 会在IP层分成3个分片,任意一个丢失就失败
// 正确做法:发送多个小于1472字节的UDP数据包
char data1[1400];
char data2[1400];
char data3[200];
sendto(sock, data1, 1400, ...);
sendto(sock, data2, 1400, ...);
sendto(sock, data3, 200, ...);
// 分成3个独立的UDP数据包,一个丢失不影响其他
注意:1472 只是在 IPv4+以太网 MTU=1500 且无 IP 选项时成立;实际链路可能因为 PPPoE/VLAN/IPv6 变小,应以路径 MTU 为准。
4.5 MTU对TCP协议的影响
1. MSS(最大报文段长度)
MSS(Maximum Segment Size):
bash
TCP单个报文段的最大数据长度
不包括TCP首部和IP首部
计算:
bash
以太网MTU:1500字节
- IP首部:20字节
- TCP首部:20字节
= TCP数据部分最大:1460字节
MSS = 1460字节
2. MSS协商
过程:
bash
TCP建立连接时(三次握手),双方会协商MSS
客户端 服务器
| |
| SYN, MSS=1460 |
|------------------------------------>|
| |
| SYN+ACK, MSS=1460 |
|<------------------------------------|
| |
| ACK |
|------------------------------------>|
| |
双方协商的结果:MSS = min(1460, 1460) = 1460
MSS选项的位置:
bash
TCP首部的选项字段中
Kind=2表示MSS选项
Length=4
Value=MSS值
为什么要协商MSS:
bash
1. 双方的网络环境可能不同
- 一方是以太网(MTU=1500)
- 另一方是PPPoE(MTU=1492)
- 需要选择较小的MSS
2. 避免IP分片
- MSS设置合理,TCP报文不会超过MTU
- 不会在IP层分片
3. MSS和MTU的关系

4. TCP避免IP分片
TCP的优势:
bash
通过MSS协商,TCP可以保证:
- 每个TCP报文段 ≤ MSS
- TCP报文段 + TCP首部 + IP首部 ≤ MTU
- 不会在IP层分片
对比UDP:
bash
UDP:
- 没有MSS机制
- 应用层可以发送任意大小的数据
- 超过MTU就分片
- 应用层需要自己控制数据大小
TCP:
- 有MSS机制
- TCP自动把应用层的数据切分成不超过MSS的报文段
- 不会IP分片
- 应用层不需要关心MTU
例子:
bash
应用层要发送10000字节的数据
通过TCP:
1. TCP把10000字节切分成多个报文段
- 报文段1:1460字节
- 报文段2:1460字节
- ...
- 报文段7:1460字节
- 报文段8:780字节
2. 每个报文段都不超过MSS
3. 不会IP分片
通过UDP:
1. UDP直接发送10000字节
2. 在IP层分成7个分片
3. 任意一个分片丢失,整个数据包丢失
五、ARP协议
5.1 为什么需要ARP协议
问题的由来:
bash
网络层使用IP地址
数据链路层使用MAC地址
发送数据包时:
- 知道目标IP地址(应用层提供)
- 不知道目标MAC地址(需要查询)
没有目标MAC地址,以太网帧就无法封装和发送
ARP的作用:
bash
建立IP地址到MAC地址的映射关系
通过IP地址查询对应的MAC地址
类比:通过电话号码查地址
bash
你知道朋友的电话号码(IP地址)
但不知道朋友的家庭住址(MAC地址)
需要打电话问朋友:"你家在哪?"(ARP请求)
朋友告诉你地址(ARP应答)
然后你才能寄快递
5.2 ARP协议的工作流程
场景设定
bash
主机A:
- IP地址:192.168.1.100
- MAC地址:AA:AA:AA:AA:AA:AA
主机B:
- IP地址:192.168.1.200
- MAC地址:BB:BB:BB:BB:BB:BB
主机A要发送数据给主机B
知道B的IP地址:192.168.1.200
不知道B的MAC地址
Step 1:发送ARP请求(广播)
主机A的操作:
bash
1. 检查本地ARP缓存表
2. 没有找到192.168.1.200对应的MAC地址
3. 发送ARP请求
ARP请求的内容:
bash
发送方IP:192.168.1.100
发送方MAC:AA:AA:AA:AA:AA:AA
目标IP:192.168.1.200
目标MAC:00:00:00:00:00:00(未知,填全0)
广播方式:
bash
以太网帧的目的MAC地址:FF:FF:FF:FF:FF:FF(广播地址)
局域网内所有主机都会收到这个ARP请求
广播的内容:
bash
"我是192.168.1.100(MAC: AA:AA:AA:AA:AA:AA)
请问192.168.1.200的MAC地址是多少?"
这就是"为什么会出现两份 MAC"的本质原因。
Step 2:接收ARP请求
局域网内所有主机的反应:
bash
主机B(192.168.1.200):
- 收到ARP请求
- 发现目标IP是自己
- 准备发送ARP应答
主机C(192.168.1.150):
- 收到ARP请求
- 发现目标IP不是自己
- 丢弃这个请求
主机D(192.168.1.250):
- 收到ARP请求
- 发现目标IP不是自己
- 丢弃这个请求
Step 3:发送ARP应答(单播)
主机B的操作:
bash
1. 提取发送方的IP和MAC地址
2. 更新自己的ARP缓存表:192.168.1.100 → AA:AA:AA:AA:AA:AA
3. 发送ARP应答给主机A
ARP应答的内容:
bash
发送方IP:192.168.1.200
发送方MAC:BB:BB:BB:BB:BB:BB
目标IP:192.168.1.100
目标MAC:AA:AA:AA:AA:AA:AA
单播方式:
bash
以太网帧的目的MAC地址:AA:AA:AA:AA:AA:AA(主机A的MAC)
只发送给主机A,不广播
应答的内容:
bash
"我是192.168.1.200
我的MAC地址是BB:BB:BB:BB:BB:BB"
Step 4:接收ARP应答并缓存
主机A的操作:
bash
1. 收到主机B的ARP应答
2. 提取目标IP和MAC地址
3. 更新ARP缓存表:192.168.1.200 → BB:BB:BB:BB:BB:BB
4. 现在可以发送数据了
完整流程图:
bash
主机A 主机B
(192.168.1.100) (192.168.1.200)
| |
| 查询ARP缓存,没有找到 |
| |
| ARP请求(广播) |
| "谁是192.168.1.200?" |
|----------------------------------------->|
| |
| | 更新缓存
| | 准备应答
| |
| ARP应答(单播) |
| "我是,MAC是BB:BB:BB:BB:BB:BB" |
|<-----------------------------------------|
| |
| 更新缓存 |
| 现在可以发送数据了 |
| |
| 发送数据包 |
| 目的MAC: BB:BB:BB:BB:BB:BB |
|----------------------------------------->|
| |
关键点:ARP 报文的目标 MAC vs 以太网帧头的目的 MAC
- ARP 请求时:ARP 报文里的目标 MAC(tha)填 00:00:00:00:00:00(未知)
- 但以太网帧头的目的 MAC 必须填 FF:FF:FF:FF:FF:FF(广播), 否则交换机/网卡不知道该把帧交给谁,目标主机也收不到请求
- ARP 应答时:两者都填请求者的 MAC(单播)
👉ARP 是一个运行在数据链路层与网络层之间的辅助协议,为了适配不同链路层技术,它必须在自身报文中携带硬件地址字段,因此在以太网环境下会出现 MAC 地址在帧头和 ARP 报文中各出现一次的现象。
5.3 ARP数据报格式
ARP数据报的结构 :

bash
┌────────────────────────────────────────────────────┐
│ 以太网帧首部 │
├──────────┬──────────┬──────────┬──────────────────┤
│ 目的MAC │ 源MAC │ 类型 │ │
│ (6字节) │ (6字节) │ (2字节) │ │
│ │ │ 0x0806 │ │
└──────────┴──────────┴──────────┴──────────────────┘
│
v
┌────────────────────────────────────────────────────┐
│ ARP数据报 │
├────────────────────┬───────────────────────────────┤
│ 硬件类型(2字节) │ 协议类型(2字节) │
├────────────────────┼───────────────────────────────┤
│ 硬件地址长度(1) │ 协议地址长度(1) │
├────────────────────┴───────────────────────────────┤
│ 操作类型(2字节) │
├────────────────────────────────────────────────────┤
│ 发送方MAC地址(6字节) │
├────────────────────────────────────────────────────┤
│ 发送方IP地址(4字节) │
├────────────────────────────────────────────────────┤
│ 目标MAC地址(6字节) │
├────────────────────────────────────────────────────┤
│ 目标IP地址(4字节) │
└────────────────────────────────────────────────────┘
各字段详解:
1. 硬件类型(2字节):
bash
指定链路层网络类型
1 = 以太网
6 = IEEE 802
2. 协议类型(2字节):
bash
指定要转换的地址类型
0x0800 = IPv4
0x86DD = IPv6
3. 硬件地址长度(1字节):
bash
MAC地址的长度
以太网 = 6字节
4. 协议地址长度(1字节):
bash
IP地址的长度
IPv4 = 4字节
IPv6 = 16字节
5. 操作类型(2字节):
bash
1 = ARP请求
2 = ARP应答
3 = RARP请求
4 = RARP应答
6. 发送方MAC地址(6字节):
bash
发送方的硬件地址
7. 发送方IP地址(4字节):
bash
发送方的协议地址
8. 目标MAC地址(6字节):
bash
目标的硬件地址
ARP请求时填全0(未知)
ARP应答时填实际的MAC地址
9. 目标IP地址(4字节):
bash
目标的协议地址
ARP请求示例:
bash
硬件类型:1(以太网)
协议类型:0x0800(IPv4)
硬件地址长度:6
协议地址长度:4
操作类型:1(ARP请求)
发送方MAC:AA:AA:AA:AA:AA:AA
发送方IP:192.168.1.100
目标MAC:00:00:00:00:00:00(未知)
目标IP:192.168.1.200
5.4 ARP缓存表
1. 什么是ARP缓存表
定义:
bash
每台主机都维护一个ARP缓存表
记录IP地址到MAC地址的映射关系
避免每次通信都发送ARP请求
查看ARP缓存表:
bash
# Linux/Mac
arp -a
# Windows
arp -a
# 输出示例:
? (192.168.1.1) at aa:bb:cc:dd:ee:ff on en0 ifscope [ethernet]
? (192.168.1.100) at 11:22:33:44:55:66 on en0 ifscope [ethernet]
2. ARP缓存表的特点
表项有过期时间:
bash
通常是20分钟
如果20分钟内没有使用某个表项,则该表项失效
下次通信需要重新发送ARP请求
为什么要有过期时间:
bash
1. IP地址可能会改变
- DHCP重新分配IP
- 设备重新配置IP
- 需要更新映射关系
2. MAC地址可能会改变
- 更换网卡
- 虚拟机重启(MAC可能改变)
- 需要更新映射关系
3. 设备可能下线
- 设备关机
- 设备离开网络
- 不需要保留映射关系
4. 节省内存
- 不常用的映射关系可以删除
- 避免缓存表无限增长
例子:
bash
场景:公司网络,使用DHCP
上午9点:
- 你的电脑获得IP:192.168.1.100
- 同事的电脑:192.168.1.101
- 你的ARP缓存:192.168.1.101 → MAC_A
中午12点:
- 同事关机
- DHCP回收192.168.1.101
下午1点:
- 新同事的电脑开机
- DHCP分配192.168.1.101(IP相同)
- 但MAC地址是MAC_B(不同)
下午2点:
- 你的ARP缓存过期(20分钟)
- 你要发数据给192.168.1.101
- 重新发送ARP请求
- 获得新的MAC地址MAC_B
- 更新缓存:192.168.1.101 → MAC_B
如果没有过期机制:
- 你的缓存仍然是192.168.1.101 → MAC_A
- 发送数据到错误的MAC地址
- 通信失败
3. 免费ARP(Gratuitous ARP)
定义:
bash
主机主动发送ARP请求,通告自己的IP和MAC地址
目标IP是自己的IP地址
用途:
1. 检测IP地址冲突:
bash
主机配置了新IP地址后,发送免费ARP
如果收到应答,说明有其他主机使用了相同的IP
IP地址冲突!
2. 更新其他主机的ARP缓存:
bash
主机的MAC地址改变后(更换网卡)
发送免费ARP,通知其他主机更新缓存
3. 主机上线通知:
bash
主机开机后,发送免费ARP
让其他主机知道"我上线了"
六、ARP实战应用
6.1 ARP协议的完整过程演示
完整通信场景:
bash
主机A(192.168.1.100)要访问百度(180.101.49.11)
Step 1:判断目标是否在同一子网
bash
主机A的配置:
- IP:192.168.1.100
- 子网掩码:255.255.255.0
- 网关:192.168.1.1
判断过程:
1. 目标IP:180.101.49.11
2. 目标IP AND 子网掩码 = 180.101.49.0
3. 本机IP AND 子网掩码 = 192.168.1.0
4. 180.101.49.0 ≠ 192.168.1.0
5. 结论:目标不在同一子网,需要通过网关
Step 2:获取网关的MAC地址
bash
主机A需要把数据包发送给网关
需要知道网关的MAC地址
1. 查询ARP缓存:192.168.1.1的MAC地址
2. 如果没有,发送ARP请求(广播):
"谁是192.168.1.1?"
3. 网关回复ARP应答(单播):
"我是192.168.1.1,MAC是GW:GW:GW:GW:GW:GW"
4. 主机A更新ARP缓存
Step 3:封装以太网帧
bash
IP数据包:
- 源IP:192.168.1.100
- 目标IP:180.101.49.11
以太网帧:
- 源MAC:AA:AA:AA:AA:AA:AA(主机A)
- 目标MAC:GW:GW:GW:GW:GW:GW(网关)
注意:目标MAC是网关,不是百度的MAC!
主机A发送帧到网关
Step 4:网关转发
bash
网关收到帧:
1. 提取IP数据包
2. 查看目标IP:180.101.49.11
3. 查询路由表,确定下一跳
4. 重新封装以太网帧:
- 源MAC:网关的WAN口MAC
- 目标MAC:下一跳路由器的MAC(通过ARP查询)
5. 从WAN口发送
注意:
- IP数据包的源IP和目标IP不变
- 但每一跳的源MAC和目标MAC都会改变
Step 5:逐跳转发
bash
数据包经过多个路由器:
路由器1 → 路由器2 → ... → 百度的路由器
每一跳:
1. 查询ARP,获取下一跳的MAC地址
2. 重新封装以太网帧
3. 转发
IP数据包的首部不变
但以太网帧的首部每一跳都变化
Step 6:到目标
bash
百度的路由器:
1. 收到数据包
2. 查看目标IP:180.101.49.11
3. 判断目标在同一子网
4. 查询ARP缓存:180.101.49.11的MAC地址
5. 如果没有,发送ARP请求
6. 百度服务器回复ARP应答
7. 路由器封装以太网帧,发送给百度服务器
完整流程图:
bash
主机A 网关 百度
(192.168.1.100) (192.168.1.1) (180.101.49.11)
| | |
| ARP请求:"谁是192.168.1.1?" |
|--------------------->| |
| ARP应答:"我是,MAC=GW:GW:GW:GW:GW:GW" |
|<---------------------| |
| | |
| 以太网帧: | |
| 源MAC=AA:AA:.. | |
| 目的MAC=GW:GW:.. | |
| IP包:源IP=192.168.1.100 |
| 目的IP=180.101.49.11 |
|--------------------->| |
| | |
| | 转发(多跳) |
| |---------------------->|
| | |
6.2 ARP欺骗原理
1. 什么是ARP欺骗
定义:
bash
攻击者发送伪造的ARP应答
欺骗其他主机,让他们更新ARP缓存为错误的映射
从而劫持流量或进行中间人攻击
危害:
bash
1. 流量劫持:攻击者可以截获通信内容
2. 中间人攻击:攻击者可以篡改数据
3. 拒绝服务:攻击者可以丢弃数据包
2. ARP欺骗的原理
场景:
bash
受害者A:192.168.1.100,MAC=AA:AA:AA:AA:AA:AA
网关:192.168.1.1,MAC=GW:GW:GW:GW:GW:GW
攻击者:192.168.1.50,MAC=AT:AT:AT:AT:AT:AT
正常情况:
bash
受害者A的ARP缓存:
192.168.1.1 → GW:GW:GW:GW:GW:GW
受害者A发送数据:
目标MAC=GW:GW:GW:GW:GW:GW(网关)
数据正常通过网关转发到互联网
攻击过程:
Step 1:攻击者发送伪造的ARP应答
bash
攻击者发送ARP应答(无需请求):
- 发送方IP:192.168.1.1(冒充网关)
- 发送方MAC:AT:AT:AT:AT:AT:AT(攻击者的MAC)
- 目标IP:192.168.1.100(受害者A)
- 目标MAC:AA:AA:AA:AA:AA:AA
内容:"我是 192.168.1.1(网关),我的 MAC 是 AT:AT:AT:AT:AT:AT。"
受害者A收到ARP应答
虽然没有发送ARP请求,但仍然会更新缓存
更新后的ARP缓存:
192.168.1.1 → AT:AT:AT:AT:AT:AT(攻击者的MAC)
错误的映射!
Step 3:受害者A发送数据
bash
受害者A发送数据到互联网:
目标MAC=AT:AT:AT:AT:AT:AT(攻击者,而不是真正的网关)
数据被发送到攻击者!
Step 4:攻击者处理数据
bash
攻击者收到数据后,有多种选择:
选择1:丢弃数据
* 受害者无法上网
* 拒绝服务攻击
选择2:转发数据
* 把数据转发给真正的网关
* 同时记录或篡改数据
* 中间人攻击
选择3:伪造响应
* 返回伪造的数据
* 欺骗受害者
完整流程图:
bash
受害者A 攻击者 真正的网关
(192.168.1.100) (192.168.1.50) (192.168.1.1)
| | |
| 正常ARP缓存: | |
| 192.168.1.1→GW:GW:GW:GW:GW:GW |
| | |
| | 伪造的ARP应答: |
| | "我是192.168.1.1 |
| | MAC=AT:AT:AT:AT" |
|<----------------| |
| | |
| 更新ARP缓存: | |
| 192.168.1.1→AT:AT:AT:AT:AT:AT |
| | |
| 发送数据: | |
| 目标MAC=AT:AT:AT:AT:AT:AT |
|---------------->| |
| | (截获数据) |
| | |
| | 转发数据给真网关 |
| |----------------->|
| | |
| |<-----------------|
| | 转发响应给受害者 |
|<----------------| |
| (受害者不知道被劫持) |
3. 双向ARP欺骗
更隐蔽的攻击:
bash
攻击者不仅欺骗受害者,还欺骗网关
攻击过程:
Step 1:欺骗受害者
bash
发送ARP应答给受害者:
"我是网关(192.168.1.1),MAC=AT:AT:AT:AT:AT:AT"
受害者的ARP缓存:
192.168.1.1 → AT:AT:AT:AT:AT:AT
Step 2:欺骗网关
bash
发送ARP应答给网关:
"我是受害者(192.168.1.100),MAC=AT:AT:AT:AT:AT:AT:AT"
网关的ARP缓存:
192.168.1.100→ AT:AT:AT:AT:AT:AT
结果:
bash
受害者 → 攻击者 → 网关
网关 → 攻击者 → 受害者
双向流量都经过攻击者
完全的中间人攻击
6.3 ARP欺骗的防范
1. 静态ARP绑定
方法:
bash
手动绑定IP和MAC的映射关系
不接受ARP应答更新
Linux命令:
bash
# 添加静态ARP表项
sudo arp -s 192.168.1.1 GW:GW:GW:GW:GW:GW
# 查看ARP表
arp -a
Windows命令:
cmd
# 添加静态ARP表项
arp -s 192.168.1.1 GW-GW-GW-GW-GW-GW
优点:
bash
完全防止ARP欺骗
缺点:
bash
需要手动维护
网络变化时需要更新
不适合大型网络
2. ARP防护软件
功能:
bash
监控ARP流量
检测异常的ARP应答
自动阻止或告警
常见软件:
bash
- ARP防火墙
- 360 ARP防护
- 金山ARP防火墙
3. 交换机端口安全
方法:
bash
在交换机上绑定端口和MAC地址
只允许特定MAC地址的设备连接到特定端口
配置示例(Cisco):
bash
# 进入接口配置模式
interface FastEthernet0/1
# 启用端口安全
switchport mode access
switchport port-security
# 设置最大MAC地址数量
switchport port-security maximum 1
# 设置允许的MAC地址
switchport port-security mac-address AA:BB:CC:DD:EE:FF
# 设置违规动作(关闭端口)
switchport port-security violation shutdown
4. 使用加密协议
原理:
bash
即使流量被劫持,也无法解密
常用协议:
bash
HTTPS:加密HTTP流量
SSH:加密远程登录
VPN:加密所有流量
5. 网络隔离
方法:
bash
使用VLAN隔离不同的网络
即使被ARP欺骗,也只影响同一VLAN内的设备
七、本篇总结
7.1 核心要点
数据链路层的作用:
- 在同一数据链路(局域网)内传输数据
- 使用MAC地址标识设备
- 封装成帧、差错检测
- 与网络层配合,实现端到端通信
以太网技术:
- 最广泛的局域网技术标准
- 定义了帧格式、MAC地址、传输速率等
- 帧格式:目的MAC + 源MAC + 类型 + 数据 + CRC
- 数据长度:46-1500字节
MAC地址:
- 48位物理地址,出厂固化
- 用冒号分隔的16进制表示
- 前24位是厂商标识,后24位是序列号
- 局域网内唯一,用于数据链路层寻址
MTU(最大传输单元):
- 数据链路层一次能传输的最大数据包大小
- 以太网MTU=1500字节
- 超过MTU的IP数据包需要分片
- TCP通过MSS协商避免IP分片
- UDP需要应用层控制数据大小
ARP协议:
- 建立IP地址到MAC地址的映射
- 通过广播ARP请求,单播ARP应答
- 维护ARP缓存表,表项有过期时间(20分钟)
- 是介于网络层和数据链路层之间的协议
ARP欺骗:
- 通过伪造ARP应答欺骗其他主机
- 可以劫持流量、进行中间人攻击
- 防范方法:静态ARP绑定、ARP防护软件、交换机端口安全、加密协议
7.2 容易混淆的点
-
MAC地址 vs IP地址:
- MAC地址:物理地址,数据链路层,局域网范围,出厂固化
- IP地址:逻辑地址,网络层,全球范围,可以改变
-
MTU vs MSS:
- MTU:数据链路层的最大传输单元,包括所有首部
- MSS:TCP的最大报文段长度,只指TCP数据部分
- MSS = MTU - IP首部 - TCP首部
-
ARP请求 vs ARP应答:
- ARP请求:广播,询问IP对应的MAC地址
- ARP应答:单播,告知MAC地址
-
同一子网 vs 不同子网的通信:
- 同一子网:直接ARP查询目标主机的MAC
- 不同子网:ARP查询网关的MAC,把数据发给网关
-
以太网帧的目的MAC vs IP数据包的目的IP:
- 目的MAC:下一跳的MAC地址(可能是网关,也可能是目标主机)
- 目的IP:最终目标的IP地址(始终不变)
💬 总结 :数据链路层是网络协议栈中承上启下的一层,它把网络层的IP数据包封装成帧,通过MAC地址在局域网内传输。以太网是最常用的数据链路层技术,定义了帧格式、MAC地址、MTU等。ARP协议是连接网络层和数据链路层的桥梁,通过IP地址查询MAC地址,使得网络层的路由和数据链路层的传输能够配合工作。理解了数据链路层,你就理解了局域网是如何工作的,也就理解了为什么发送一个数据包需要同时使用IP地址和MAC地址。
👍 点赞、收藏与分享:如果这篇帮你理解了数据链路层、以太网、MAC地址、MTU和ARP协议,请点赞收藏!网络编程,从理解数据链路层开始!