使用广播信道的数据链路层(2)

撞上了怎么办

作者 Tea-Sun · 2026年10月16日 · 约 3 分钟

一、检测到碰撞,发送站做三件事#

  1. 立即停止发送数据——别再往已经废掉的信道上灌数据了。
  2. 继续发送若干比特的人为干扰信号(jamming signal)——强化碰撞,让所有用户都知道现在已经发生了碰撞。
  3. 随机退避一段时间后,再重新发送。

二、为什么"停下来"不够,还要专门发一串干扰信号#

这一步最容易被忽略,也最容易考。

  • 光停下来,别的站未必察觉:信号在总线上有传播时延,远端站点可能还没"看见"碰撞就已经在准备发送了。
  • 所以撞上的站要主动再发一小段干扰比特,把碰撞这件事放大、拉长,让总线上每一个站都明确感知到"刚才信道上是撞过的"。
  • 目的不是传数据,是通知:这叫强化碰撞。

三、截断二进制指数退避算法#

退避多久?不能拍脑袋,教材给了一套算法:

  1. 基本退避时间取为争用期 2τ。
  2. 令 k = Min[重传次数, 10]。
  3. 从整数集合 {0, 1, …, 2ᵏ − 1} 中随机取出一个数 r,重传推迟的时间就是 r 倍的基本退避时间。
  4. 重传达 16 次仍不成功,就丢弃该帧,并向高层报告。

举个例子:第一次重传,k=1,r 只能取 0 或 1 → 等 0 或 1 倍基本退避时间; 第三次重传,k=3,r 取 {0,…,7} → 等的范围就宽了。


四、为什么必须随机#

假如几个撞了的站都只是"等信道空闲就立刻重发":

  • 它们会同时发现信道空闲、同时开始重发 → 必然又撞,然后再撞、再撞……
  • 随机退避把大家的等待时间错开,才有可能让其中某一个先发成功。

而且撞得越多,k 越大,可选的等待范围越大,错开得越彻底——这正是"截断二进制指数"的含义:范围随重传次数指数增长,但增长到 10 次就封顶。


五、两个"上限"各管什么#

上限 数值 作用
k 的上限 10 重传超过 10 次后,随机范围不再扩大(最大 2¹⁰=1024 个可选值,最长等 1023 倍基本退避时间),避免等待时间无限拉长
重传次数上限 16 次 超过就放弃这一帧,向高层报告——说明网络太拥挤,再重传只会更堵

六、本集易错点#

  1. 撞了不是立刻重发:先停、再发干扰信号、然后随机退避。三步顺序不能乱。
  2. 干扰信号的作用是通知全网"撞了",不是重传数据。
  3. 基本退避时间是争用期 2τ,不是 τ(2τ 是往返时延)。
  4. k 的上限是 10,重传上限是 16 次(不是 10 次,也不是 16 和 10 反过来说)。
  5. 退避时间是 r 倍基本退避时间,r 是随机的,不是一个固定值。

#

七、关键表述依据#

# 表述 依据
1 检测到碰撞立即停止发送 谢希仁 3.3.2 CSMA/CD 协议
2 停止后再发若干比特人为干扰信号(强化碰撞),让所有用户都知道发生了碰撞 同上
3 然后随机退避一段时间再重发 同上
4 截断二进制指数退避算法:基本退避时间=争用期 2τ 同上
5 k=Min[重传次数, 10] 同上
6 r 从 {0, 1, …, 2ᵏ−1} 中随机取,重传推迟 r 倍基本退避时间 同上
7 重传 16 次仍不成功即丢弃该帧并向高层报告 同上
8 撞得越多 k 越大、可选范围越大,错开得越彻底 由算法推出的理解性说明