模块五 · 链路层和局域网
以太网帧
「帧」是数据在链路层的容器。这一章把以太网帧拆到字段级别,讲清每个字段是干什么的,以及一个初学者最容易卡住的问题 —— 为什么以太网帧有个最小长度。
本章要解决的问题:「帧」是数据在链路层的容器。这一章把以太网帧拆到字段级别,讲清每个字段是干什么的,以及一个初学者最容易卡住的问题 —— 为什么以太网帧有个最小长度。
本章的证据来源:历史实测记录(各网卡的链路层信息、MTU、ARP 表)。帧格式与最小长度出自 IEEE 802.3;帧内承载 IP 的约定出自 RFC 894。
先从一个例子理解概念
电脑用网线发送一份数据,接收端需要分清“这一份从哪开始、发给谁、有没有传错”。帧就是为这几个问题组织出来的格式。
一种有线网络规则:以太网
以太网(Ethernet)规定常见有线链路怎样组织和传送数据;IEEE 802.3是相关标准名。网线或光纤是介质,规则与介质不是同一个东西。
一份本地传输的容器:帧
帧是一份链路层传输单元,装有控制字段与载荷。可把它类比成本段线路的配送袋,源/目的MAC用于这一段的接口寻址。
检查有没有传错:FCS与CRC
FCS(帧校验序列)是帧里的检错值,以太网使用CRC(循环冗余校验)算法计算。接收端重新计算后比较,发现不一致就丢弃;检错值不是加密或身份验证。
两边能同时说话:全双工
双方同时发也同时收叫全双工;只能轮流发叫半双工。现代交换式有线链路通常全双工;不能由Wi-Fi速率高就推断它也是这种方式。
下面再用这些概念看原理、命令和结果。规范与官方资料列在本章末尾,类比只帮助理解,不代替协议规则。
以太网是什么
以太网(Ethernet)最早是 1970 年代施乐帕克研究中心(Xerox PARC)的实验项目,后来被 IEEE 采纳为标准,编号 IEEE 802.3。
今天说"以太网",指的是两件事:
- 一套帧格式 —— 数据在链路层长什么样
- 一套介质访问规则 —— 多台设备共用一条线路时,谁先说话、怎么发现冲突
注意:以太网不等于网线。 有线以太网跑在双绞线或光纤上;Wi-Fi 的帧格式是另一套标准(IEEE 802.11),但思想和以太网同源。本章讲的是有线以太网的帧格式 —— 它是理解链路层最好的入口。
帧的字段:逐字节拆开
一个以太网帧长这样(数字是字节数):
| 字段 | 长度 | 作用 |
|---|---|---|
| 前导码 | 7 | 一串交替的 0 和 1,让接收方同步时钟 |
| SFD(帧起始定界符) | 1 | 固定值 10101011,标记"帧要开始了" |
| 目的 MAC 地址 | 6 | 这一帧发给谁 |
| 源 MAC 地址 | 6 | 这一帧是谁发的 |
| 类型 / 长度 | 2 | 里面装的是什么协议的数据 |
| 数据及填充 | 46 ~ 1500 | 基本无标签帧载荷区;上层数据不足时填充 |
| 填充 | 按需 | 已包括在上面的载荷区中,不再额外相加 |
| FCS(帧校验序列) | 4 | CRC 校验值,用来发现传输错误 |
几个值得单独记住的点:
① 前导码和 SFD 不是"数据"。 它们的作用是让接收方的时钟和发送方对齐。因为链路上没有独立的时钟线,接收方只能靠这段规律的电平变化来校准"一个比特是多长"。
② 类型字段决定了"交给谁"。 收到帧之后,网卡看这个字段来决定把里面的东西交给哪个协议:
| 类型值 | 含义 |
|---|---|
0x0800 | IPv4 |
0x0806 | ARP |
0x86DD | IPv6 |
③ FCS 只能发现错误,不能纠正。 接收方算出 CRC 和 FCS 对不上,就直接丢弃整个帧 —— 不做任何修复,也不通知发送方。这里描述基本以太网MAC的错误丢弃行为。 不能推成全部链路层都不重传:Wi-Fi有链路确认和重试;TCP另提供端到端恢复。
为什么最小的帧是 64 字节
这是以太网设计里最反直觉的一个规定:任何以太网帧不能短于 64 字节。
算一下:14(头)+ 46(最小数据)+ 4(FCS)= 64。所以数据部分不足 46 字节时,必须用"填充"凑够。
为什么要这样规定? 这要回到以太网最初的工作方式。
早期的以太网是共享介质:一堆设备接在同一根同轴电缆上,同一时刻只能有一台说话。两台同时说就产生冲突。规则叫 CSMA/CD(载波监听多路访问/冲突检测):
发送前先听:线路忙不忙?
忙 → 等
空闲 → 发,同时继续听,确认有没有人和我撞车问题来了:如果帧太短,会怎样?
发送方发完一个很短的帧就停下来了。假设这个帧在传输途中撞了车(另一台设备也在发),冲突信号要花时间才能传回发送方。如果帧已经发完了,发送方就检测不到这次冲突,会误以为发送成功。
所以最小帧长必须保证:发送方在发完最后一比特之前,冲突信号能传回来。 这个时间和线路的最远距离有关,算出来的结果就是 64 字节。
实测:本机各网卡的链路层信息
Get-NetAdapter | Where-Object Status -eq 'Up' | Select-Object Name, MacAddress, LinkSpeed, InterfaceDescription实测输出:
Name : WLAN
MacAddress : 44-38-E8-0A-55-23
LinkSpeed : 2.2 Gbps
InterfaceDescription : Intel(R) Wi-Fi 6E AX211 160MHz
Name : vEthernet (WSL (Hyper-V firewall))
MacAddress : 00-15-5D-FB-2D-8A
LinkSpeed : 10 Gbps
InterfaceDescription : Hyper-V Virtual Ethernet Adapter
Name : FlClash
MacAddress :
LinkSpeed : 100 Gbps
InterfaceDescription : Meta Tunnel这里有一个非常值得注意的现象:FlClash 的 MAC 地址是空的。
为什么?因为 FlClash 是一块 TUN 虚拟网卡(代理软件创建的),它工作在 IP 层,根本不处理以太网帧。没有二层,自然没有 MAC 地址。
再看 LinkSpeed 这一列:真实 Wi-Fi 是 2.2 Gbps,Hyper-V 虚拟网卡是 10 Gbps。这些虚拟接口速率可能只是报告值,不是测得的内存吞吐或实际转发上限。
帧的作用域:每经过一跳就被换掉
《全景与基础》模块提到过"帧只在同一段链路内有效"。现在用字段来说清楚为什么。
假设你的电脑要访问一台跨越互联网的服务器:
你的电脑 ──[链路1]── 家用路由器 ──[链路2]── 运营商路由器 ──[链路3]── 服务器| 链路 1 上的帧 | 链路 2 上的帧 | 链路 3 上的帧 | |
|---|---|---|---|
| 源 MAC | 你的网卡 | 路由器接口 A | 运营商路由器接口 |
| 目的 MAC | 家用路由器 | 运营商路由器 | 服务器网卡 |
| 源 IP(无NAT时) | 你的 IP | 你的 IP | 你的 IP |
| 目的 IP | 服务器 IP | 服务器 IP | 服务器 IP |
这个表假定各段均以以太网承载且不存在NAT。 路由器重新封装下一链路的帧;普通IP转发保留源/目的IP,NAT可能改写地址。经过二层交换机本身不会逐跳更换源/目的MAC。
原因很直接:MAC 地址只在当前这段链路上有意义 —— 路由器把帧收下来,脱掉旧的帧头,重新封装一个新的帧头(源 MAC 换成自己,目的 MAC 换成下一跳),再发出去。
常见误解
误解一:"MAC 地址是全球唯一且不可修改的"
唯一性靠厂商自觉遵守 OUI 分配规则,实际上软件可以改(网卡驱动里通常有个"网络地址"属性)。而且部分系统支持MAC随机化,实际启用方式与换址周期取决于系统、硬件和网络设置,不能说每次连接必定更换。
误解二:"以太网就是网线"
以太网是一套帧格式和访问规则,不是介质。光纤上跑的也可以是以太网帧。
误解三:"帧越大传得越快"
帧越大,包头占比越低(效率高),但一旦出错就要重传整帧(代价高),而且会长时间占用线路。1500 字节是两者之间的工程折中。这也是《全景与基础》模块讲过的 MTU 的由来。
误解四:"网线很可靠,不会丢数据"
链路层发现 FCS 校验错误就直接丢帧,不重传、不通知。丢帧是正常现象,保证最终送达是 TCP 的责任。
本章小结
| 结论 | 类型 |
|---|---|
| 以太网是 IEEE 802.3,指帧格式 + 介质访问规则,不等于网线 | 标准 |
| 帧头 14 字节(目的 MAC + 源 MAC + 类型),帧尾 4 字节 FCS | 标准 |
| 类型字段区分承载的是 IPv4 / ARP / IPv6 | 标准 |
| 最小帧长 64 字节,源于早期 CSMA/CD 的冲突检测需要 | 标准 |
| 现代全双工网络已不用 CSMA/CD,但最小帧长被保留 | 标准 |
| 基本以太网MAC丢弃FCS错误帧;其他链路协议可有本地重试,TCP负责端到端恢复 | 协议范围 |
| 实测:WLAN MAC 为 44-38-E8-0A-55-23,速率 2.2 Gbps | 实测 |
| 实测:FlClash 的 MAC 为空,因为它工作在 IP 层没有二层 | 实测 |
| IP转发重新封装下一链路;源/目的IP保持的说法需排除NAT | 协议范围 |
自测题
6 题 · 先自己答,再展开对照
以太网帧的类型字段有什么用?举两个常见的类型值。
告诉接收方"里面的数据属于哪个上层协议",从而决定交给谁处理。常见的值:0x0800表示 IPv4、0x0806表示 ARP、0x86DD表示 IPv6。一个帧的数据部分是 20 字节,实际在线上是多少字节?多出来的是什么?
64 字节。 数据只有 20 字节,不足最小数据长度 46 字节,所以要填充 26 字节。加上帧头 14 和帧尾 4:14 + 46 + 4 = 64。多出来的 26 字节是"填充",没有任何实际信息,接收方会按上层协议的长度字段把它们忽略掉。为什么以太网要规定最小帧长?现代网络还需要它吗?
为了在共享介质上可靠地检测冲突。 帧太短的话,发送方在发完之后才收到冲突信号,就会误判成功。最小长度保证发送方在发完之前能收到冲突通知。现代全双工交换网络里已经不存在冲突,CSMA/CD 实际不用了,但 64 字节作为兼容约定被保留至今。网卡收到一个 FCS 校验失败的帧,它会怎么做?
基本以太网MAC会丢弃FCS校验失败的帧;这不代表所有链路层都没有重试,例如Wi-Fi有自己的确认与重传。为什么
FlClash这块网卡没有 MAC 地址?因为它是 TUN 虚拟网卡,工作在 IP 层,不处理以太网帧。 没有二层协议,就不需要 MAC 地址。这正好说明了分层的意义 —— 一层可以只实现自己这层的能力,不必实现下面所有的层。数据从你的电脑到服务器要经过 3 台路由器,源 IP 地址会被改几次?
仅有普通IP转发而无NAT时不改源IP;经过源NAT时会改写。以太网链路之间由路由器重新封装MAC头,不是每经过一台交换机就改MAC。
参考资料与适用范围
- IEEE 802.3as官方教学说明,第14–18页:基本及Q标签帧格式与长度
- Intel I210数据手册:1000BASE-T的PAM-5与双向传输
- RFC 3022 §2:传统NAT与NAPT
- Microsoft:Wi-Fi随机硬件地址的支持与设置
修订核对日期:2026-10-13。规则按所列协议与实现范围理解;文中的原始命令输出是历史观察,不表示本次重新实测。跨版本、代理/隧道及不同捕获位置需要另行核对。