以太网的最小帧长为什么是 64 字节:从 CSMA/CD 冲突窗口推导 64 Byte

9 阅读9分钟

以太网的最小帧长为什么是 64 字节:从 CSMA/CD 冲突窗口推导 64 Byte

以太网帧最短 64 字节。这个数字写在每一张网卡、每一个交换芯片、每一本网络书里,但很少有人追问它是怎么来的。

从公式来说,最小帧长要大于等于数据传输速率R与往返传播时延2τ的乘积,也就是 L ≥ 10 Mb/s × 51.2 μs = 512 bit = 64 字节。


一、历史背景

以太网最初的形态是一根总线。所有站点并联在同一根同轴电缆上,任何时刻只能有一个站点发送,其余站点只能监听。介质是共享的,发送权是抢来的。

抢占的方式叫做载波监听多路访问,也就是 CSMA:发送前先听,线路空闲就开口。问题在于"监听"和"发送"之间隔着一段传播时延。两个相距最远的站点可能同时监听到空闲窗口,同时开始传输数据,两路信号在电缆中间相遇,互相叠加成一段谁都读不出来的乱码。这就是冲突。

1976 年,Bob Metcalfe 和 David Boggs 在 Xerox PARC 的论文里给出了以太网的做法:不再靠事后超时重传来发现冲突,而是在发送的同时继续监听,发现自己发出的比特和线上收到的比特不一致,就立刻停止发送,发一段 32 比特的干扰信号(jam)把冲突放大,然后各自退避一段随机时间再重试。这套机制叫 CSMA/CD,冲突检测是其中的关键。

论文里的实验以太网参数是 1 公里、3 Mb/s、256 个站点。作者明确写道,这些数字"基于本地分布式计算环境的特性和我们对边际可行性的判断,当然不是以太网概念必不可少的硬性限制"。

随后在1980 年 DEC、Intel、Xerox 联合发布 10 Mb/s 的以太网规范,IEEE 802.3 在 1983 年把它变成正式标准。从 3 Mb/s 提到 10 Mb/s,从 1 公里扩到 2500 米,帧的最短长度也因此被固定为 64 字节。

为什么非要有这个下限?因为"边发边听"有一个隐藏的前提:发送方必须在发完之前听到冲突。这个前提一旦被打破,以太网会安静地丢帧,而且丢得毫无痕迹。


二、为什么是往返时延

我们需要考虑最坏的情况:这种场景发生在电缆两端。站点 A 位于一端,站点 B 位于另一端。A 先开口,信号向 B 传播;恰好在 A 的信号即将到达 B 的时候,B 也开始发送。两路信号在电缆上相遇,发生冲突。

如果 A 的帧在冲突信号返回之前就发送完毕,A 会关闭接收电路、释放缓冲区,向上层报告发送成功。而 B 那边收到的是一段被破坏的帧,按校验规则直接丢弃。上层以为数据已经发出,对端从未收到,两端的状态从此对不上。这类帧在以太网里有个名字,叫 runt(残帧),长度不足 64 字节的帧一律按错误丢弃。

为了确保 A 一定能监听到冲突,帧的发送时间必须不短于最坏情况下冲突信号的往返时间。设帧长为 L 比特,发送速率为 R,往返传播时延为 2τ,条件写成:

L ≥ R × 2τ

十兆以太网把 2τ 定为 51.2 微秒,代入就得到了十兆以太网下的最小帧长:

L ≥ 10 Mb/s × 51.2 μs
  = 512 bit
  = 64 字节

三、51.2 微秒是怎么来的

51.2 微秒对应一个具体的网络规模:2500 米。十兆以太网用的是粗同轴电缆,型号叫 10BASE5。单段电缆最长 500 米,因为信号会沿电缆衰减,收发器能可靠识别的距离只能做到500米;再远就得加中继器,把衰减的信号整形、放大后转发出去。

中继器也不能无限增加。每经过一个中继器,信号都要被重新整形,付出几微秒的延迟;经过的中继器越多,往返时延越大。IEEE 802.3 给出的组网规则后来被称为 5-4-3 规则:一个冲突域最多 5 段电缆、最多 4 个中继器,其中最多 3 段可以接站点(另外两段只能做中继器之间的链路)。5 段乘以 500 米,就得到了 2500 米。

接下来的问题是怎么把 2500 米换算成 51.2 微秒。已知电缆上的信号传播速度约为光速的 0.6 倍,即 1.8×10⁸ m/s 左右,2500 米单程约 13.9 微秒,往返就是 27.8 微秒,同时信号每经过一个中继器都要重新整形再转发,早期的中继器单个延迟在微秒量级,4 个累加起来就是十几微秒;两端的收发器、编码解码电路同样要占时间。512 是 2 的幂,方便硬件实现,所以最后选了 51.2 μs。


四、拓展:百兆以太网及千兆以太网

由最小帧长的计算公式变形可以得到:

2τ ≤ L / R

将帧长 L 固定在 512 比特。R 提高,允许的往返时延 2τ 就成比例缩小;而 2τ 与距离成正比,所以冲突域直径与速率成反比。

速率时隙半双工冲突域直径应对方式
10 Mb/s512 bit = 51.2 μs2500 米5-4-3 规则
100 Mb/s512 bit = 5.12 μs约 205 米限制中继器级数
1000 Mb/s512 bit = 0.512 μs几十米载波扩展到 4096 bit
10 Gb/s 及以上不再定义不适用只支持全双工

百兆以太网的冲突域缩到 205 米,是因为 5.12 微秒里还要扣掉中继器和收发器的固定延迟,留给电缆的时间只剩 2 微秒出头,按每秒 20 万公里折算正好是两百米上下。

千兆以太网无法再直接通过缩小冲突域解决该问题。所以802.3z 给出的第一个办法是载波扩展:把时隙强行拉到 4096 比特(512 字节),帧不够长就用扩展符号占满,保证发送方在冲突窗口内始终在线。第二个办法是帧突发:允许一个站点连续发送多个帧、总长不超过 8192 字节,只对最后一帧做扩展,避免每个小帧都补齐到 512 字节造成的巨大浪费。


五、拓展:光纤与全双工时代

今天的以太网和 1983 年的以太网,已经是两种东西。

交换机为每个端口提供独立的冲突域,双绞线和光纤又天然支持收发分离:发送线对和接收线对各走各的,一个站点发送时不会和自己的接收撞上。全双工链路两端可以同时收发,冲突在物理上不可能发生,CSMA/CD 整套机制——载波监听、冲突检测、干扰信号、二进制指数退避——全部失效,也全部不再需要。标准随后取消了 10 Gb/s 及更高速率的半双工选项,冲突检测在这些速率上从规范里彻底消失。

那么 64 字节这个下限还有必要吗?答案是:作为"冲突检测窗口"的理由已经消失,但作为帧格式的规则它必须保留。

第一个原因是兼容。以太网的价值有一大半在"能互通":一块 1990 年的网卡和一台 2024 年的交换机插在同一根线上,仍然要能交换帧。帧的最小长度是格式的一部分,改掉它,所有已经装出去的硬件、驱动、测试仪、抓包软件都要跟着改。为一个已经不成问题的约束去动整个生态,没有收益。

第二个原因是残帧识别仍然有用。不足 64 字节的帧按 runt 丢弃,这条规则仍然生效:它把物理层噪声、驱动 bug、半双工链路上的迟到冲突(late collision)、错误的 DMA 长度统统挡在协议栈外面。全双工网络里不会再有真正的冲突,但"过短的帧一定是坏帧"这个判断依然成立,而且实现成本几乎为零。

第三个原因是带宽代价可以忽略。64 字节里有 18 字节是固定开销(12 字节 MAC 地址、2 字节类型/长度、4 字节 FCS),数据字段最少 46 字节,不足就填充。一个 40 字节的 TCP 确认报文被填充到 46 字节,只多传 6 字节;在万兆、十万兆链路上,这点填充占用的带宽不到千分之一。真正值得关心的是帧太短会让每秒需要处理的帧数飙升,64 字节的帧在 100 Gb/s 链路上每秒要处理近 2 亿个,所以现代网卡把大量小帧合并处理(中断合并、批量收发)。

总结一下:64字节的最小帧长是十兆以太网时代,为了让最远端的冲突信号能在帧发完之前赶回来,用 10 Mb/s 乘以 51.2 微秒算出来的;51.2 微秒对应五段 500 米电缆加四个中继器的 2500 米网络;速率每提高一个数量级,同样的帧长就只允许更小的冲突域,直到全双工把这个问题整个取消。今天这个数字仍然写在标准里,约束的对象却已经从"电缆长度"变成了"帧格式的兼容性"。


本文整理自我阅读 IEEE 802.3 与以太网早期文献时的笔记,重点放在 64、2500、51.2 这三个数字的来历与相互关系上。

参考:

  • IEEE 802.3《IEEE Standard for Ethernet》(CSMA/CD 访问方法与物理层规范)
  • Metcalfe, R. M., Boggs, D. R. Ethernet: Distributed Packet Switching for Local Computer Networks. Communications of the ACM, 19(7): 395–404, 1976.(DOI: 10.1145/360248.360253)