本文是计算机网络专题的阶段 2。阶段 1 把五层搭了出来, 其中第 2 层只交代到「成帧、校验、用 MAC 地址区分设备」就转向了下一层。 本篇把这一层拆开:帧长什么样、地址从哪来、交换机凭什么转发, 以及上一篇末尾留下的那个问题——链路层已经校验过,传输层为什么还要再算一次。
场景是一间办公室:几十台机器接在两三台交换机上,同属 192.168.1.0/24。 一台机器要把数据发给另一台,IP 地址是已知的,但网卡真正要写进帧头的是一个 48 位的硬件地址。 这段距离之内不存在路由,没有下一跳可选,所有设备都在同一个广播域里。 链路层要解决的全部问题就在这里:如何在一群彼此可直接听见的设备之间,把一帧数据准确交给其中一台。
从冲突讲起:今天的规则是当年留下的
现代交换式以太网里已经不会发生冲突。但最小帧长度 64 字节、帧间必须留出的静默、 标准文本里仍然保留的冲突检测机制,全部是共享介质时代的产物。 不了解那段规则,后面很多数字会显得像是凭空规定的。
最初的以太网是一根粗同轴电缆,所有机器搭在同一根线上。 一台机器发出的信号沿电缆向两端传播,其余机器都能听到。规则很朴素:发送前先侦听, 线上有信号就等待。麻烦在于信号传播需要时间——远端的机器侦听时,别人的信号可能还在路上。
冲突发生后,双方要做三件事:立即停发、发出一段干扰序列让线上所有站点都知道这一帧作废、 然后各自随机等待一段时间再重试。等待窗口随失败次数指数增长, 这既避免了两方同时重试,也让线路越拥挤时各方退让越多。
这套机制有个隐含要求:发送方必须在帧发完之前就察觉到冲突。 如果帧太短,发送早已结束,冲突信号才传回来,发送方就会误以为成功。 10 Mbps 的以太网把最大网段往返时间定在 51.2 微秒,对应 512 位,也就是 64 字节。 于是帧长下限被定为 64 字节,不足的部分补零。这个数字沿用至今, 即使今天的千兆链路上早已没有冲突可言。
交换机的出现终结了这一切。它把每个端口变成一条独立链路:A 发给 B 的帧只出现在两条链路上, C 与 D 的线路依然空闲。再加上全双工——收发各占一对线——发送前不必侦听,冲突从根本上不再可能。 集线器与交换机在布线上看起来一样,在电气上是两种完全不同的东西。
以太网帧:一段比特流怎么被切成块
比特能通过线缆之后,接收方面对的是一条不间断的流。帧的作用是给它加上边界、地址和校验。
几个字段值得单独说明。
前导码与帧起始定界符不属于帧,抓包工具里看不到它们。 它们的作用是让接收方的时钟锁定发送方的节奏——两台设备的晶振不可能完全一致, 不先对齐,后面的比特就会被采错位置。
类型/长度字段是同一个位置上的两种含义。数值大于等于 0x0600 时表示载荷属于哪种协议,
0x0800 是 IPv4,0x0806 是 ARP,0x86DD 是 IPv6;小于等于 0x05DC 时表示载荷长度。
这是 DIX 与 IEEE 802.3 两套定义共存的结果:前者用它标类型,后者用它标长度,
最终靠数值区间把两种用法分开,谁都不必让步。
帧校验序列是一个 CRC-32 值,覆盖从目的地址到载荷的全部内容。 接收方重算一遍,对不上就丢弃整帧:不修复、不重传、也不通知任何人。 这是链路层最典型的姿态——只负责发现问题,不负责解决问题。
帧间隙是两帧之间强制留出的空白,长度为 96 位时。 它不随速率改变位数,只随速率缩短时间:1 Gbps 下只有 96 纳秒。
四十多年里,以太网的速率从 10 Mbps 涨到 800 Gbps,物理层换了一轮又一轮, 而上面这个结构几乎没有改动。一块 1980 年代的网卡如果能接上今天的线缆, 它对帧头六个字节含义的理解仍然是正确的。
MAC 地址:48 位里写了什么
帧头里那两个 6 字节的字段,是这一层用来区分设备的全部依据。
前 24 位是组织唯一标识符(Organizationally Unique Identifier,OUI), 由 IEEE 分配给网卡厂商;后 24 位由厂商自行编号。因此从一个地址可以查出网卡的制造商, 但查不出它在哪里——MAC 地址标识的是身份,不是位置。这正是它无法用于跨网络寻址的原因, 也是上一篇中网络层必须出现的理由。
第一个字节的最低两位携带额外含义:
- 最低位 I/G:为 0 表示这一帧发给一块网卡,为 1 表示发给一组网卡。全 1 的广播地址
ff:ff:ff:ff:ff:ff是组播的极端情形,广播域内每块网卡都必须接收。 - 次低位 U/L:为 0 表示地址来自 IEEE 分配的厂商编号段,为 1 表示由本地生成。手机接入陌生 Wi-Fi 时使用的随机地址就属于后者,这样做是为了避免被固定标识符长期跟踪。
网卡对不属于自己的单播帧的丢弃发生在硬件层面,不惊动 CPU。 这条看似次要的规则,决定了一台机器接在繁忙的交换机上时不会被无关流量压垮。
ARP:知道 IP,帧头却要填 MAC
上层交下来的是一个 IP 包,帧头需要的却是 MAC 地址。中间缺的这一步由地址解析协议 (Address Resolution Protocol,ARP,RFC 826)补上:在本网段内广播提问,由知道答案的设备单播作答。
真正容易出错的不是流程本身,而是问谁。
发送方先用子网掩码做一次比对:目标与自己是否处在同一段网络。
- 在同一段:解析目标主机的地址。帧头的目的 MAC 与 IP 头的目的地址指向同一台机器。
- 不在同一段:查路由表得到下一跳,解析的是网关的地址。帧头写网关,IP 头仍写远端服务器。
第二种情况里,两个字段指向两台不同的机器,各自回答不同的问题: IP 头回答「整程去哪」,帧头回答「这一跳交给谁」。 一台设备的 ARP 表里通常只有网关和少数几个同网段邻居,与它访问过多少网站无关。
解析结果会缓存数分钟,期间发往同一地址的包不再产生广播。Linux 上用 ip neigh show 查看,
STALE 表示条目已过期但暂时保留,下次使用前会先验证。
两个衍生用法值得记住。免费 ARP(gratuitous ARP)指发送方 IP 与目标 IP 相同的报文, 用途是宣告地址变更、检测地址冲突,以及在主备切换后让邻居立刻更新缓存—— 虚拟 IP 从一台服务器漂移到另一台时,靠的就是它。
ARP 欺骗则是同一机制的反面。协议本身没有任何身份验证:任何设备都可以宣称自己持有网关的 IP, 先到的应答就会被写入缓存,流量随即绕行攻击者。防护手段全在协议之外—— 接入认证、交换机上的动态 ARP 检查、端口安全策略。 需要说明的是,这类攻击要求攻击者已经接入同一段网络, 而且即使流量被引走,上层的 TLS 仍然保证内容既读不出也改不了。
IPv6 不再使用 ARP,改由邻居发现协议(Neighbor Discovery Protocol,NDP)承担同样职责。 它基于 ICMPv6,用组播代替广播,只有相关设备会被惊动。
交换机:地址表是怎么长出来的
交换机没有配置文件告诉它哪台设备接在哪个口。这张表完全靠自己看出来。
规则只有三条:
- 学源地址:收到一帧,把「源 MAC → 入口端口」记进表里。
- 查目的地址:命中就只从对应端口发出,命中的端口如果就是入口则直接丢弃(两台设备接在同一个集线器下时会出现这种情况)。
- 未命中就泛洪:从除入口外的所有端口发出去。广播帧无条件泛洪。
第三条常被忽略:交换机只从源地址学习。 一台从不主动发送的设备不会出现在表里,别人每次找它都要惊动全网。 表项在数分钟无流量后老化删除,这既是为了回收容量,也是为了让设备换端口后网络能自行纠正。
表的容量有限,通常在数千到数十万条之间。灌满它并不困难—— 伪造大量不同的源地址就能做到,此后新地址无法写入, 本该定向转发的流量退化为泛洪,攻击者所在的端口就能收到全部副本。 端口安全策略限制单端口可学习的地址数量,正是针对这种做法。
到这里需要明确一个边界:交换机不分割广播域。 一个广播帧会到达这台交换机上的每一个端口,以及与它相连的其他交换机上的每一个端口。 广播域的范围是路由器与 VLAN 划出来的,不是交换机。这个事实直接引出下面两节。
环路:以太网帧头里没有 TTL
为了可靠,机房里通常会在交换机之间接两条线。如果不做额外配置,这两条线会构成一个环。
问题的根源是一个对比:IP 头里有生存时间字段(Time To Live,TTL), 每经过一台路由器减一,减到零就被丢弃,绕圈的包因此会自行死亡。 以太网帧头里没有任何对应字段。一个广播帧进入环路后,没有任何机制会让它消失。
后果分三层:链路带宽被绕圈的副本占满;每台交换机每绕一圈都向自己的所有接入端口再复制一份, 主机的网卡与 CPU 随之被淹没;同一个源地址一会儿从这个端口进来、一会儿从那个端口进来, 地址表被反复改写,正常流量的转发也开始出错。整个过程通常在几秒内完成, 现象是整段网络同时失去响应,且拔掉任何一台主机都没有用。
生成树协议(Spanning Tree Protocol,STP,IEEE 802.1D)的解法是: 既然物理拓扑有环,就在逻辑上留下一棵没有环的树。交换机之间互发网桥协议数据单元 (Bridge Protocol Data Unit,BPDU),比较桥 ID 选出根桥, 各自计算通往根桥开销最小的路径,把多余的端口置为阻塞状态——不转发数据帧,但继续接收协议帧。
关键在于阻塞不是断开。主用链路一旦失效,被阻塞的端口会重新进入转发状态,冗余依然有效。 代价是收敛时间:最初的版本要三十秒以上,快速生成树(RSTP,IEEE 802.1w)把它压到数秒。 这两份规范后来都被并入 IEEE 802.1Q。
实践中还有一个更直接的提醒:接入端口上开启边缘端口与 BPDU 防护, 可以避免终端用户把两个网口用一根线接在一起时拖垮整段网络。
VLAN:在一台交换机里划出多个广播域
广播域太大会带来三个问题:广播流量随设备数量增长、所有设备彼此可达因而难以隔离、 一次配置错误影响范围过宽。切小它需要按物理位置重新布线——除非在交换机内部完成划分。
虚拟局域网(Virtual LAN,VLAN)的做法是给每个端口标上一个编号, 只有编号相同的端口之间才转发帧。一台交换机由此变成多台互不相通的逻辑交换机。
跨越交换机时需要解决一个问题:两台交换机之间只有一条线,对端如何知道一帧属于哪个 VLAN。 IEEE 802.1Q 的答案是在源地址之后插入 4 字节标签,其中 12 位是 VLAN 编号,可用范围 1 到 4094。
于是端口分成两类:
- 接入端口(access)只属于一个 VLAN,帧不带标签。主机对自己处在哪个 VLAN 里一无所知。
- 干道端口(trunk)同时承载多个 VLAN 的流量,帧必须带标签;出口若是接入端口,标签在发出前被剥除。
两个 VLAN 之间不存在第二层通路。要互通就必须经过三层设备: 帧先交给路由器或三层交换机,由它按 IP 转发,再以另一个 VLAN 的身份送出。 这正是用 VLAN 做隔离的意义——隔离是默认状态,互通需要显式配置。
一个常见的排查顺序:同一 VLAN 内的两台机器仍然不通时,先确认端口的 VLAN 归属, 再确认两者的 IP 地址与掩码是否落在同一网段。VLAN 只决定帧能否到达,不决定能否通信。
Wi-Fi:同一层的另一种实现
无线网络与以太网处在同一层,对上层提供的接口完全相同:交下来一个 IP 包,送到同一网段的某台设备。 差别全部被封在这一层内部。
最根本的一条是:无线设备收发共用同一副天线,发送时听不到别人,因此无法检测冲突。 应对方式只能从检测改为避免——发送前随机退避,发送后等待对方确认, 没有收到确认就重传。这也解释了一个常见现象:无线网络的吞吐随接入设备增多下降得很快, 因为介质始终是共享的,退避与确认的开销随之上升。
另一个差异是帧头里的地址数量。以太网帧头只有两个地址,802.11 帧头最多有四个, 因为经由接入点中转时,需要同时标明发送方、接收方与接入点。
链路层已经校验过,传输层为什么还要再算一次
这是上一篇结尾留下的问题。答案由两部分组成。
第一部分是范围。FCS 只保护一段链路。帧每经过一台交换机或路由器都会被拆开, 转发出去时重新计算一个新的 FCS。这意味着校验保护的是「电缆上的这一段旅程」, 而设备内部——内存、总线、软件缓冲区——完全不在保护范围内。 更麻烦的是,如果数据在设备内部已经出错,重新计算出的 FCS 会把错误的数据重新盖章认证, 下一段链路的接收方看到的是一个「校验正确」的错误帧。
第二部分是实测。Stone 与 Partridge 在 2000 年检查了真实网络上的大量流量, 发现每一千多到三万多个包中就有一个携带了链路层校验没能拦住的错误, 来源包括路由器软件缺陷、内存故障与中间设备的错误改写。 链路层的校验是有效的,但它不是端到端的保证。
这正是上一篇提到的端到端论证在具体场景中的体现: 需要端点确认才算完成的功能,必须由端点自己做一遍; 放在网络内部的同类机制只能算性能优化,不能替代它。 链路层的 CRC 让大部分错误在第一时间被丢弃,避免它们浪费后续跳数的带宽—— 这是优化。而「交付的数据与发出的数据一致」这个保证,只能由两端的传输层给出。
以太网为什么能活四十年
值得注意的是被替换掉的东西:同轴电缆、集线器、CSMA/CD、半双工—— 这些当年被认为是以太网核心特征的部分,如今全部消失了。留下来的只有帧格式与 48 位地址。
原因与上一篇里 IP 能成为沙漏收窄点的原因相同:承诺少。 以太网帧只承诺「尽力把这一帧交给同一段链路上的某块网卡,附带一个校验值」。 不承诺送达、不承诺有序、不承诺不重复。承诺越少,能实现它的物理介质就越多, 上层愿意在它之上运行的协议也越多。双绞线、光纤、无线、直连电缆各自换了一轮, 上层什么都不用改。
排障顺序
链路层的问题有固定的检查顺序,每一步排除一批可能:
- 物理与双工:接口是否 up、协商速率与双工模式是否一致。双工不匹配的典型表现是能通但极慢,且计数器上有大量错误帧。
- 邻居解析:
ip neigh show看目标或网关的条目是否存在、是否为REACHABLE。缺失或反复变化都指向本段网络的问题。 - 地址表:在交换机上查目标 MAC 出现在哪个端口,与预期不符说明布线或 VLAN 有误。
- 广播域边界:确认两端的 VLAN 归属与 IP 网段是否一致。
- 环路迹象:所有设备同时变慢、交换机端口指示灯齐闪、日志里出现地址表抖动的记录。
顺序本身就是本文的顺序:介质、帧、地址、转发、广播域。
常见问题
下一站
本篇的所有机制都止步于一个广播域。一旦要跨出去,MAC 地址就失去了意义, 需要一套按位置分配的地址和一张能在全球范围内选路的表。
阶段 3 进入网络层:IP 地址如何划分、子网掩码到底在做什么、 路由表的最长前缀匹配怎样在几十万条路由中选出一条, 以及地址转换如何让一个公网地址支撑起整个家庭网络。
参考资料
- IEEE 802.3 · Ethernet Working Group
- IEEE 802.1Q · Bridges and Bridged Networks
- RFC 826 · An Ethernet Address Resolution Protocol
- RFC 894 · A Standard for the Transmission of IP Datagrams over Ethernet Networks
- RFC 4861 · Neighbor Discovery for IP version 6
- RFC 5227 · IPv4 Address Conflict Detection
- IEEE Registration Authority · MAC Address Block Assignments
- Stone, Partridge · When the CRC and TCP Checksum Disagree
- Metcalfe, Boggs · Ethernet: Distributed Packet Switching for Local Computer Networks
内容更新至 2026 年 9 月。