← 网络基础学习第 34 / 55 章基础35 分钟

模块五 · 链路层和局域网

以太网帧

「帧」是数据在链路层的容器。这一章把以太网帧拆到字段级别,讲清每个字段是干什么的,以及一个初学者最容易卡住的问题 —— 为什么以太网帧有个最小长度。

本章要解决的问题:「帧」是数据在链路层的容器。这一章把以太网帧拆到字段级别,讲清每个字段是干什么的,以及一个初学者最容易卡住的问题 —— 为什么以太网帧有个最小长度。

本章的证据来源:历史实测记录(各网卡的链路层信息、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。

今天说"以太网",指的是两件事:

  1. 一套帧格式 —— 数据在链路层长什么样
  2. 一套介质访问规则 —— 多台设备共用一条线路时,谁先说话、怎么发现冲突

注意:以太网不等于网线。 有线以太网跑在双绞线或光纤上;Wi-Fi 的帧格式是另一套标准(IEEE 802.11),但思想和以太网同源。本章讲的是有线以太网的帧格式 —— 它是理解链路层最好的入口。

帧的字段:逐字节拆开

一个以太网帧长这样(数字是字节数):

字段长度作用
前导码7一串交替的 0 和 1,让接收方同步时钟
SFD(帧起始定界符)1固定值 10101011,标记"帧要开始了"
目的 MAC 地址6这一帧发给谁
源 MAC 地址6这一帧是谁发的
类型 / 长度2里面装的是什么协议的数据
数据及填充46 ~ 1500基本无标签帧载荷区;上层数据不足时填充
填充按需已包括在上面的载荷区中,不再额外相加
FCS(帧校验序列)4CRC 校验值,用来发现传输错误

几个值得单独记住的点:

① 前导码和 SFD 不是"数据"。 它们的作用是让接收方的时钟和发送方对齐。因为链路上没有独立的时钟线,接收方只能靠这段规律的电平变化来校准"一个比特是多长"。

② 类型字段决定了"交给谁"。 收到帧之后,网卡看这个字段来决定把里面的东西交给哪个协议:

类型值含义
0x0800IPv4
0x0806ARP
0x86DDIPv6

③ FCS 只能发现错误,不能纠正。 接收方算出 CRC 和 FCS 对不上,就直接丢弃整个帧 —— 不做任何修复,也不通知发送方。这里描述基本以太网MAC的错误丢弃行为。 不能推成全部链路层都不重传:Wi-Fi有链路确认和重试;TCP另提供端到端恢复。

为什么最小的帧是 64 字节

这是以太网设计里最反直觉的一个规定:任何以太网帧不能短于 64 字节。

算一下:14(头)+ 46(最小数据)+ 4(FCS)= 64。所以数据部分不足 46 字节时,必须用"填充"凑够。

为什么要这样规定? 这要回到以太网最初的工作方式。

早期的以太网是共享介质:一堆设备接在同一根同轴电缆上,同一时刻只能有一台说话。两台同时说就产生冲突。规则叫 CSMA/CD(载波监听多路访问/冲突检测):

发送前先听:线路忙不忙?
  忙  → 等
  空闲 → 发,同时继续听,确认有没有人和我撞车

问题来了:如果帧太短,会怎样?

发送方发完一个很短的帧就停下来了。假设这个帧在传输途中撞了车(另一台设备也在发),冲突信号要花时间才能传回发送方。如果帧已经发完了,发送方就检测不到这次冲突,会误以为发送成功。

所以最小帧长必须保证:发送方在发完最后一比特之前,冲突信号能传回来。 这个时间和线路的最远距离有关,算出来的结果就是 64 字节。

实测:本机各网卡的链路层信息

示例powershell
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 题 · 先自己答,再展开对照

  1. 以太网帧的类型字段有什么用?举两个常见的类型值。
    告诉接收方"里面的数据属于哪个上层协议",从而决定交给谁处理。常见的值:0x0800 表示 IPv4、0x0806 表示 ARP、0x86DD 表示 IPv6。
  2. 一个帧的数据部分是 20 字节,实际在线上是多少字节?多出来的是什么?
    64 字节。 数据只有 20 字节,不足最小数据长度 46 字节,所以要填充 26 字节。加上帧头 14 和帧尾 4:14 + 46 + 4 = 64。多出来的 26 字节是"填充",没有任何实际信息,接收方会按上层协议的长度字段把它们忽略掉。
  3. 为什么以太网要规定最小帧长?现代网络还需要它吗?
    为了在共享介质上可靠地检测冲突。 帧太短的话,发送方在发完之后才收到冲突信号,就会误判成功。最小长度保证发送方在发完之前能收到冲突通知。现代全双工交换网络里已经不存在冲突,CSMA/CD 实际不用了,但 64 字节作为兼容约定被保留至今。
  4. 网卡收到一个 FCS 校验失败的帧,它会怎么做?
    基本以太网MAC会丢弃FCS校验失败的帧;这不代表所有链路层都没有重试,例如Wi-Fi有自己的确认与重传。
  5. 为什么 FlClash 这块网卡没有 MAC 地址?
    因为它是 TUN 虚拟网卡,工作在 IP 层,不处理以太网帧。 没有二层协议,就不需要 MAC 地址。这正好说明了分层的意义 —— 一层可以只实现自己这层的能力,不必实现下面所有的层。
  6. 数据从你的电脑到服务器要经过 3 台路由器,源 IP 地址会被改几次?
    仅有普通IP转发而无NAT时不改源IP;经过源NAT时会改写。以太网链路之间由路由器重新封装MAC头,不是每经过一台交换机就改MAC。

参考资料与适用范围

修订核对日期:2026-10-13。规则按所列协议与实现范围理解;文中的原始命令输出是历史观察,不表示本次重新实测。跨版本、代理/隧道及不同捕获位置需要另行核对。

正文源自 m5-01-以太网帧.md · 共 10 节 · 6 道自测题