目录
[二、以太网 (Ethernet) 通信原理](#二、以太网 (Ethernet) 通信原理)
[1. 局域网技术](#1. 局域网技术)
[2. 原理:广播与"对号入座"(⭐⭐⭐)](#2. 原理:广播与“对号入座”(⭐⭐⭐))
[3. 碰撞域与碰撞避免算法 (CSMA/CD)](#3. 碰撞域与碰撞避免算法 (CSMA/CD))
[三、解剖 MAC 帧:以太网帧格式](#三、解剖 MAC 帧:以太网帧格式)
[1. 字段解读(⭐⭐⭐)](#1. 字段解读(⭐⭐⭐))
[2. MAC 帧的解包逻辑](#2. MAC 帧的解包逻辑)
[四、重谈 MTU (最大传输单元)](#四、重谈 MTU (最大传输单元))
[1. MTU 出现的原因(⭐⭐⭐)](#1. MTU 出现的原因(⭐⭐⭐))
[2. MTU 对 IP 协议的影响](#2. MTU 对 IP 协议的影响)
[3. MTU 对 UDP 协议的影响](#3. MTU 对 UDP 协议的影响)
[4. MTU 对 TCP 协议的影响](#4. MTU 对 TCP 协议的影响)
[五、ARP 协议 (地址解析协议)](#五、ARP 协议 (地址解析协议))
[1. 为什么需要 ARP?](#1. 为什么需要 ARP?)
[2. ARP 协议的位置(⭐⭐⭐)](#2. ARP 协议的位置(⭐⭐⭐))
[3. ARP 数据的格式 (核心字段)(⭐⭐⭐)](#3. ARP 数据的格式 (核心字段)(⭐⭐⭐))
[4. ARP 协议的完整工作流程(⭐⭐⭐)](#4. ARP 协议的完整工作流程(⭐⭐⭐))
[5. RARP 协议简述](#5. RARP 协议简述)
[1.1 主机的 CPU 被无辜消耗殆尽](#1.1 主机的 CPU 被无辜消耗殆尽)
[1.2 带宽灾难:瞬间引发"广播风暴"](#1.2 带宽灾难:瞬间引发“广播风暴”)
[1.3 安全裸奔:毫无隐私可言](#1.3 安全裸奔:毫无隐私可言)
[2. MAC帧和ARP的报头源和目的MAC地址的重复(⭐⭐⭐)](#2. MAC帧和ARP的报头源和目的MAC地址的重复(⭐⭐⭐))
[2.1 软件架构的"分层解耦"](#2.1 软件架构的“分层解耦”)
[2.2 语义上的根本不同](#2.2 语义上的根本不同)
[2.3 协议的通用](#2.3 协议的通用)
[2.4 ARP 欺骗的根源(⭐⭐⭐)](#2.4 ARP 欺骗的根源(⭐⭐⭐))
一、网络分层复盘与数据链路层的使命
在深入底层之前,我们先站在上帝视角复盘一下数据从一台电脑发送到另一台电脑的全过程。网络分层就像是一个极其精密的接力赛:
-
传输层 (TCP/UDP):负责"端到端"的可靠性与进程识别。它不在乎中间经过了多少路由器,只关心数据有没有完整无误地从主机A的端口送到主机B的端口。
-
网络层 (IP):负责"主机到主机"的跨网络寻址与路由。它拿着目标IP地址,在错综复杂的全球网络地图中,不断查路由表,规划出一条跨越各个子网的路径。
-
数据链路层的使命 :IP协议虽然规划了宏观路线,但数据在物理网线上穿梭时,是一跳一跳(Hop-by-Hop)传输的。数据链路层要解决的问题,就是如何将数据从当前节点,准确无误地跨越物理介质,送达到"直接相连"的下一个相邻节点(比如从主机到局域网内的路由器,或者从这台路由器到下一台路由器)。
简而言之:IP协议决定了数据的最终目的地 ,而数据链路层决定了数据的下一站怎么走。
二、以太网 (Ethernet) 通信原理
1. 局域网技术
当我们在谈论数据链路层时,往往会直接想到"以太网"。但严格来说,局域网(LAN)技术有很多种,比如曾经流行过的令牌环网 (Token Ring)、FDDI等。只不过以太网凭借其简单、廉价和不断升级的速度,最终一统江湖,成为了当今局域网的绝对霸主。
2. 原理:广播与"对号入座"(⭐⭐⭐)
以太网最核心的通信逻辑,简单粗暴:在同一个局域网内,本质上是一种"广播"通信。
想象一个没有隔音的开敞式办公室(局域网),所有人都在同一个空间里。 当主机A想把数据发给主机B时,主机A并不是拉一根秘密电话线给B,而是在办公室里"大喊一声":"这是给B的包裹!" 局域网内的所有主机(C、D、E...)都会 在物理层面上"听"到这个包裹。但是,它们的网卡在收到包裹后,会拆开看一眼收件人(目标MAC地址)。如果发现不是给自己的,网卡就会默默把包裹丢弃;只有主机B发现是给自己的,才会真正接收并交给上层处理。
3. 碰撞域与碰撞避免算法 (CSMA/CD)
既然大家都在同一个大办公室里"喊话",问题就来了:如果主机A和主机C同时 开口说话,声音就会混在一起,谁也听不清。这在网络中叫做数据碰撞 ,这个局域网就是一个碰撞域。
为了解决这个问题,早期的以太网引入了 CSMA/CD(载波侦听多路访问/碰撞检测) 算法:
-
载波侦听 (听后发):发数据前,先"听"一下网线里有没有别人在发数据。如果有人在发,就等一会儿。
-
多路访问:大家共享一根通信介质。
-
碰撞检测 (边发边听):如果两个人同时觉得没人说话,同时发了数据,发生了碰撞,网卡能检测到电压异常。
-
碰撞退避:发现碰撞后,双方立刻停止发送,各自随机等待一段极短的时间(退避算法),然后再尝试发送。
*(注:现代局域网通过使用**交换机(Switch)*划分了碰撞域,已经基本消除了物理层的碰撞问题,实现了全双工通信,但CSMA/CD的思想依然是以太网设计的基石。)
三、解剖 MAC 帧:以太网帧格式
网络层的数据(IP数据报)交到数据链路层后,会被穿上一层新的"外套",封装成 MAC 帧。
1. 字段解读(⭐⭐⭐)

目的 MAC 地址 (6 字节) & 源 MAC 地址 (6 字节):网卡的物理标识,决定数据从哪台网卡发往哪台网卡。
类型 (2 字节):非常关键的"分发开关"。它指明了有效载荷应该交给上层的哪个协议:
-
0x0800:代表里面装的是 IP 数据报。 -
0x0806:代表里面装的是 ARP 请求/应答。 -
0x8035:代表里面装的是 RARP 请求/应答。
有效载荷 (Data) :从上层拿下来的数据。注意,它的长度被严格限制在 46 ~ 1500 字节 之间。
CRC/FCS (帧检验序列, 4 字节):用于校验整个帧在物理传输过程中是否发生了错误。
扩展:为什么有效载荷最小必须是 46 字节?(⭐⭐⭐)
这是为了配合以太网底层的 CSMA/CD(碰撞检测)机制。以太网规定,一个合法的 MAC 帧总长度最小不能低于 64 字节 ,否则网卡会认为这是一个因为碰撞而产生的"无效残帧"并直接丢弃。 刨去帧头的 14 字节()和尾部的 4 字节校验,留给中间有效载荷的最小空间刚好就是:
字节。
2. MAC 帧的解包逻辑
分离报头与载荷:由于 MAC 帧的头部(14 字节)和尾部(4 字节)都是定长的,底层网卡收到数据后,直接"掐头去尾",中间剩下的部分就是纯粹的有效载荷。
向上交付:剥离报头后,网卡驱动会直接读取"2 字节类型"字段的值,精准地将载荷投递给对应的网络层协议(IP 或 ARP)。
四、重谈 MTU (最大传输单元)
1. MTU 出现的原因(⭐⭐⭐)
在 MAC 帧格式中,我们提到有效载荷最大不能超过 1500 字节 ,这就是以太网的 MTU (Maximum Transmission Unit)。 为什么要有这个限制?
硬件限制:早期的网卡缓冲区较小,无法一次性处理过大的数据块。
公平原则:局域网是共享介质,如果一个人发了一个几十MB的超级大帧,其他人就得一直等他发完。限制帧大小,可以保证局域网内所有主机能公平地交替发言,降低延迟。
2. MTU 对 IP 协议的影响
当 IP 层想要发送一个大于 1500 字节的报文时,底层的 MAC 层会无情地拒绝:"我吞不下,你切碎了再给我。" 这就强行逼迫 IP 层进行分片(利用 16位标识、3位标志、13位片偏移)。而分片会增加路由器的开销,且一旦某一片丢失,整个 IP 报文都会作废,引发严重的性能问题。
3. MTU 对 UDP 协议的影响
UDP 是个直肠子,应用层给它多大的数据,它就直接加个 8 字节的报头丢给 IP 层。 如果 UDP 发送的数据过大,导致 IP 层分片,那么由于网络环境恶劣,分片丢失的概率极高。只要丢了一小块,目标主机的 IP 层重组失败就会全盘丢弃,导致 UDP 数据包彻底丢失。因此,使用 UDP 编程时,应用层最好控制每次发送的数据大小,避免引发 IP 分片。
4. MTU 对 TCP 协议的影响
TCP 则是极其聪明和优雅的。为了避免底层 IP 分片带来的灾难,TCP 在三次握手阶段,双方就会互相通报自己的 MSS (Maximum Segment Size, 最大报文段长度) 。 MSS = MTU - IP报头长度(20) - TCP报头长度(20)。在标准以太网中,MSS 通常是 1460 字节 。 TCP 会在传输层主动将数据切分成不超过 MSS 的小块,这样交到 IP 层后,总大小刚好不超过 MTU,完美规避了网络层的分片。
五、ARP 协议 (地址解析协议)
1. 为什么需要 ARP?
数据链路层需要知道"下一站"的 目的MAC地址 才能发送帧。但是,当我们在网络层查完路由表,只知道下一站路由器的 IP地址 。 问题来了:我拿着IP地址,怎么才能知道对方网卡的MAC地址呢? 这时候,ARP 协议就闪亮登场了。
2. ARP 协议的位置(⭐⭐⭐)

ARP 协议工作在局域网内,它负责将 IP地址 动态映射为 MAC地址。在网络架构中,它通常被视为介于数据链路层和网络层之间的"过渡协议"。
3. ARP 数据的格式 (核心字段)(⭐⭐⭐)

-
硬件类型 (2 字节):指明底层使用的是哪种网络硬件。对于我们最常用的以太网,这个字段的值固定为
1。 -
协议类型 (2 字节):指明要映射的是哪种高层协议地址。如果要映射 IPv4 地址,这个值就是
0x0800(和 MAC 帧头里的类型字段含义一致)。 -
硬件地址长度 (1 字节):对于以太网 MAC 地址,长度固定为
6(字节)。 -
协议地址长度 (1 字节) :对于 IPv4 地址,长度固定为
4(字节)。 -
op / 操作码 (2 字节):这是 ARP 报文的"灵魂开关",决定了这条报文是去问人的,还是回答人的:
-
值为
1:代表 ARP 请求 (Request) ------ "谁是这个 IP?你的 MAC 是多少?" -
值为
2:代表 ARP 应答 (Reply) ------ "我就是这个 IP,这是我的 MAC。" -
(注:如果是 RARP 协议,请求为 3,应答为 4)
-
-
发送端以太网地址 (6 字节):发送方自己的 MAC 地址。
-
发送端 IP 地址 (4 字节):发送方自己的 IP 地址。
-
目的以太网地址 (6 字节):接收方的 MAC 地址。
- 【重点细节】 :在发出 ARP 请求 时,因为此时还不知道对方的 MAC 地址,所以这个字段通常会被填满全
0(即00:00:00:00:00:00),起到占位符的作用。只有在收到对方的 ARP 应答时,对方才会把真实的 MAC 填在这里交给你。
- 【重点细节】 :在发出 ARP 请求 时,因为此时还不知道对方的 MAC 地址,所以这个字段通常会被填满全
-
目的 IP 地址 (4 字节):接收方的 IP 地址。即你想要寻找的目标主机的 IP。
4. ARP 协议的完整工作流程(⭐⭐⭐)
假设主机A (IP_A, MAC_A) 要给局域网内的主机B (IP_B, MAC_B) 发数据,但A不知道B的MAC地址。

报文发出去后,局域网内主机会进行以下三步判断:
全员查收:所有主机收到广播帧,解包交由 ARP 协议处理。
核对身份 :查看
OP=1(请求),并比对"目的 IP"(是否是在叫自己)。精准应答 :IP 不符的主机直接丢弃报文;只有真正的主机 B 发现 IP 匹配,才会悄悄封装一个新的 ARP 应答包(
OP=2),填上自己的 MAC 地址,单播发回给主机 A。(主机 B 发现是找自己的之后,在发应答包之前,还会顺手把主机 A 的
IPa和MACa先存到自己的 ARP 缓存表里,方便一会接着通信。)

接收应答:主机 A 顺利接收到主机 B 单播发回的 ARP 应答报文。
提取与缓存 :主机 A 从报文载荷中提取出期待已久的"发送端以太网地址"(即真实的
MACb),并立刻将IPb与MACb的映射关系存入本机的 ARP 缓存表中(方便后续直接通信,无需再次广播)。解析通关:至此,"IP 地址到 MAC 地址"的跨层寻址与解析任务宣告圆满完成。
封装与发送 :主机 A 终于可以把之前"憋了很久"的、真正要发送的 IP 数据报拿出来,在目标 MAC 地址栏填上
MACb,封装成完整的以太网 MAC 帧,正式顺着网线发送出去了。
5. RARP 协议简述
RARP (Reverse ARP, 逆地址解析协议) 的作用刚好与 ARP 相反:它是让设备通过自己的 MAC 地址去网络上询问自己的 IP 地址是什么。 这种协议通常用于早期没有硬盘的无盘工作站(它们启动时只知道自己网卡的MAC,需要从服务器获取IP)。在现代网络中,这种功能已经完全被更高级的 DHCP 协议 所取代,RARP 已经基本退出了历史舞台。
六、扩展学习
1.为什么不直接以广播的方式发送数据?
广播就像是村里的大喇叭,只适合用来"寻人启事"(如 ARP 请求)或者"紧急通知";而单播(MAC 寻址)才是私下里的"信件快递",它保证了网络的高效、安静与安全。
1.1 主机的 CPU 被无辜消耗殆尽
当数据在局域网内广播时,网段内的每一台主机的网卡(NIC)都必须无条件接收这个数据帧 。 接收下来后,网卡会向主机的 CPU 发送硬件中断,迫使 CPU 放下手里正在干的活(比如你在打游戏,他在写代码),去处理这个网络包。等 CPU 把包拆开一看,发现最终的目的 IP 不是自己,又只能把它丢弃。
后果:如果局域网里有几十台电脑,两人之间传一个 10GB 的文件,剩下所有人的电脑 CPU 都会被这些无用的广播包疯狂打断,导致全网电脑集体卡顿。有了 MAC 地址单播,无关主机的网卡在底层硬件级别就会把包丢弃,根本不会去打扰主机的 CPU。
1.2 带宽灾难:瞬间引发"广播风暴"
局域网的整体带宽是有限的(哪怕是现代的交换机网络)。
-
单播通信:交换机(Switch)内部有一张 MAC 地址表,它知道主机 B 在哪个接口,所以 A 发给 B 的数据,交换机只会精准地转发到 B 的接口,其他接口的带宽完全不受影响。
-
广播通信:如果全用广播,交换机会把每一份数据强行复制,向所有接口转发。如果有三四对主机同时在局域网里传大文件,整个局域网的交换机背板带宽会瞬间被塞满,导致正常的网络通信彻底瘫痪。这在网络工程中被称为"广播风暴"。
1.3 安全裸奔:毫无隐私可言
如果所有数据都是广播发送的,意味着局域网里的任何一个人,只要悄悄把自己的网卡设置为"混杂模式(Promiscuous Mode)"(即无论是不是发给我的包,我统统接收),再开个 Wireshark 抓包软件,就能轻松截获局域网内所有人的聊天记录、浏览网页的图片、甚至没加密的密码。 有了 MAC 单播结合交换机隔离,别人想随便偷听局域网里的通信门槛就高多了。
2. MAC帧和ARP的报头源和目的MAC地址的重复(⭐⭐⭐)
2.1 软件架构的"分层解耦"
网络分层的一个铁律:下层对上层是透明的,每一层只关心自己的报头。
MAC 帧头(外层) 是给底层网卡硬件 和交换机看的。网卡驱动收到数据后,一旦发现外层目标 MAC 匹配(或者是广播),就会把外层的 14 字节 MAC 帧头直接"剥离"扔掉,然后把中间干干净净的 ARP 载荷往上层(操作系统的 ARP 处理模块)交。
如果 ARP 载荷里没有保留发送端和目的端的 MAC 地址,那操作系统的 ARP 模块拿到这块数据时,就像收到了一封被撕掉信封的匿名信,完全不知道这数据是谁发来的,也就根本无法更新本机的 ARP 缓存表了。
2.2 语义上的根本不同
在前面我们推演的"ARP 请求"阶段,这两组 MAC 地址的值其实是完全不一样的!
外层目的 MAC :填的是
FF:FF:FF:FF:FF:FF。它的语义是"路由交付机制",告诉交换机把这个包发给局域网里的所有人。内层目的 MAC :填的是
00:00:00:00:00:00。它的语义是"待查询的变量",告诉接收方:"我不知道你的 MAC,请在这个全零的位置填上你的答案再发回给我。" 如果去掉了内层的 MAC 字段,那 ARP 请求就连"填空"的地方都没有了。
2.3 协议的通用
虽然我们现在几乎把 ARP 和以太网(Ethernet)画上了等号,但在设计之初,ARP 协议是一个极其通用的协议。 它不仅能服务于以太网,还能服务于令牌环网(Token Ring)、FDDI 等其他各种物理网络。外层的 MAC 帧头是以太网独有的"特产",而 ARP 作为更高一级的协议,必须拥有自己独立、完整的数据结构,这样才能以不变应万变,运行在任何底层硬件之上。
2.4 ARP 欺骗的根源(⭐⭐⭐)
正是因为这种内外层的分离机制,给黑客留下了可乘之机。 操作系统的 ARP 模块在更新缓存表时,只看内层 ARP 载荷里的"发送端 MAC"和"发送端 IP",根本不在乎外层真正的物理 MAC 是什么。
黑客可以伪造一个报文:外层写自己的真实 MAC 保证你能收到,但在内层 ARP 载荷里,谎称自己是网关(路由器的 IP),并附上黑客自己的 MAC 地址。你的电脑收到后,会乖乖地把这个假消息写进 ARP 缓存。从此以后,你发往外网的所有数据,都会被错误地发给黑客的电脑,这就是臭名昭著的 ARP 欺骗攻击。