📚 第三章 数据链路
📄 一句话概括

HIPPI 的思路是「不用编码、不用协商,直接拉一堆线并行传」。 它做到了 800 Mbps,但被 25 米这个物理死穴锁死。

📝 本节和前面几节的关系

3.6.6 的光纤通道是「串行 + 编码」的路子,HIPPI 是反方向:并行、不编码。 这两条路的对比,就是过去三十年接口演进的全部内容。

一、算一下就三个数

HIPPI 的规格简单到可以用一句话说完:

项目 规格 说明
位宽 32 位、50 对双绞线 一次传 4 字节
时钟 25 MHz 每拍 40 纳秒
速率 800 Mbps 即 100 MB/s
距离 25 米 铜线的上限
扩展 双工用两组线 1600 Mbps 全双工

第二行和第三行乘起来就是 800 Mbps:32 位乘 25 MHz,正好 800 兆比特每秒。 没有 8B/10B、没有扰码、没有链路训练——因为它是并行接口,每根线上跑的就是原始数据位。 所以它的速率完全由「当时铜线能稳定跑多快」决定: 1990 年前后,25 MHz 是个稳的时钟;再快,接收端就采不准了。 「50 对线」这个数字也值得注意:32 对传数据,剩下的是控制、时钟、校验和地线。 一根线缆五十对、接头一百个针脚——这就是它贵的根本原因。

二、25 米是物理死穴

并行传输有个绕不过去的麻烦,叫「偏斜」: 每一对线的长度不可能完全一样,信号到达的时间就有先后。 线越长,这个时间差越大;差到超过一个时钟周期,接收端就分不清哪一位是哪一位了。 算个量:电信号在铜线里大约每米 5 纳秒。 25 米的线,如果两对之间差 1 米,就是 5 纳秒的偏斜; 而 25 MHz 的一拍是 40 纳秒——还忍得住。 要是时钟提到 100 MHz,一拍只有 10 纳秒,这点偏斜就直接把数据采错。 所以「并行接口距离短」不是工艺问题,是物理限制: 它不能用「把线做好一点」解决,只能「把线做短一点」。 串行链路没有这个问题:只有一根线,没有「谁先谁后」; 而且它可以编码(8B/10B、64B/66B)把时钟信息嵌进数据里,不依赖单独的时钟线。 代价是要多跑一些比特,收益是距离可以拉到几十公里。

三、并行转串行这条主线

把几个接口排在一起,就能看出这条主线:

接口 位宽 时钟 MHz 距离
HIPPI 32 25 25 米
PCI 并行总线 32 33 板上
串行链路 1 1250 几十公里

第三行用 1 位、1.25 GHz,比第一行的 32 位 25 MHz 还快: 32 乘 25 是 800,1 乘 1250 是 1250。 「线多了不一定快」这句话,在这张表里看得最清楚。 同样的转向在别的地方全发生过:硬盘从 IDE 的 40 根排线改成 SATA 的两对差分线; 显示从 VGA 的 15 针改成 HDMI 的四对差分线; 总线从 PCI 改成 PCIe。 每一次都是「砍掉线数、提高单线速率、加编码」。 所以 HIPPI 不是「失败的怪东西」,它是一个时代的合理答案: 在那个「串行还跑不快」的年代,堆线是唯一能提高带宽的办法。 它退场的原因和它当初成功的原因,是同一件事。

四、动手 Demo:HIPPI——用五十对铜线换 800 Mbps

把它和并行 PCI、串行链路放在一起算,看「位宽乘时钟」这件事的极限在哪。 注意最后一张表:1 位比 32 位还快,这就是串行反超的地方。

width, clock = 32, 25e6
rate = width * clock
print('HIPPI: %d 位 x %.0f MHz = %.0f Mbps = %.0f MB/s'
      % (width, clock / 1e6, rate / 1e6, rate / 8 / 1e6))
print('一拍 %.0f 纳秒' % (1e9 / clock))

for name, bits, mhz in (('HIPPI', 32, 25), ('PCI 并行总线', 32, 33),
                        ('串行链路', 1, 1250)):
    print('%-14s %2d 位 %6d MHz -> %7.0f Mbps'
          % (name, bits, mhz, bits * mhz))

print('偏斜 5 ns/米,25 MHz 一拍 %.0f ns' % (1e9 / clock))

实跑输出:

--------------------------------------------------------------------
HIPPI——用五十对铜线换 800 Mbps
--------------------------------------------------------------------
**HIPPI 是八十年代末的超级计算机互连,思路非常「暴力」:**
**不用编码、不用协商,直接拉一堆线并行传。**
**它把「简单」这件事做到了极致。**

  项目         规格                                 说明
  ---------------------------------------------------------------------
  **位宽**     **32 位(4 字节)/50 对双绞线**     **一次传 4 字节**
  时钟         25 MHz                               **每 40 纳秒一拍**
  **速率**     **800 Mbps(100 MB/s)**            25M × 32 位
  距离         **25 米**                            **铜线的极限**
  扩展         **双工用两组线**                     1600 Mbps 全双工

**第二行那个 25 MHz 和第三行的 32 位乘起来正好 800 Mbps**:
**这个速率不是「算出来的上限」,是「当时能稳定跑的时钟」。**
**所以 HIPPI 的速率完全由「铜线能传多快」决定,跟协议无关。**
**第四行那个 25 米是它的死因**:
**并行传输有个物理限制——每一对线的传播延迟必须几乎一致(叫「偏斜」)。**
**线越长,偏斜越大,接收端就采不准。**
**所以并行接口的距离上限通常是几十米,串行接口可以做到几十公里。**
**这解释了一条贯穿全书的技术路线**:
  接口                           位宽     时钟 MHz     距离
  ------------------------------------------------------------------
  HIPPI                          32       25           25 米
  PCI 并行总线                   32       33           板上
  **串行链路(以太网/FC)**     1        1250         **几十公里**

**第三行用 1 位、1.25 GHz,跑得比第一行的 32 位 25 MHz 还快**:
**因为「串行」没有偏斜问题,线可以拉得很长,时钟可以提得很高。**
**这就是「并行转串行」这件事在过去二十年反复发生的原因**——
**硬盘(IDE→SATA)、显示(VGA→HDMI)、总线(PCI→PCIe),全是同一条路。**

那个「一拍 40 纳秒」不是凑出来的:25 MHz 的周期就是 40 纳秒。 并行接口的时序余量全靠这一拍—— 偏斜必须小到「信号在拍中间稳定」,所以它同时限制了距离和时钟。 「100 MB/s 在 1990 年是什么水平」值得交代一句: 当时最快的硬盘持续读写大约 5 MB/s,SCSI 总线 20 MB/s。 100 MB/s 是「内存到内存」的速度——HIPPI 存在的意义就是让两台巨型机之间的内存能直接互灌。 为什么最后是「差分串行」而不是「单端串行」:差分用两根线传一个信号,靠电压差判断 0 和 1, 共模干扰会被抵消掉。 所以它抗干扰强、能跑高速、能跑远——今天的高速链路,无一例外都是差分。

30 秒实验

  1. 算一下:如果 HIPPI 的时钟提到 50 MHz,25 米还够用吗?
  2. 想一下:为什么并行接口不能用「加一根时钟线」来解决偏斜?
  3. 数一下你电脑里还有几根「并行」的线,剩下的都换成什么了?

常见误区

  1. 以为「线多就一定快」。 32 位 25 MHz 是 800 Mbps, 1 位 1.25 GHz 是 1250 Mbps——线少反而更快。
  2. 以为「25 米是厂商的限制」。 是偏斜的物理限制,把线做长一点、做好一点都救不了。
  3. 以为「HIPPI 的设计是错的」。 在串行还跑不快的年代,它是最优解, 它只是在串行追上来之后失去了意义。
自测三问(点开对答案) 1. HIPPI 的 800 Mbps 是怎么算出来的? —— **32 位乘 25 MHz**,因为并行接口每根线上跑的是原始数据位,没有编码开销。 2. 它为什么只能跑 25 米? —— **并行传输有偏斜**:各对线长度不同,信号到达时间有先后,线越长差得越多, 超过一个时钟周期就采错。 3. 串行链路凭什么反超? —— **没有偏斜问题,而且可以把时钟嵌进数据里**,所以时钟能提到 GHz 级、距离能拉到几十公里。

下一节看 1394:一个「能保证带宽」的消费级接口。

相关笔记