光纤通道不是「用光纤的以太网」,它是另一套链路层,只服务一件事:搬磁盘数据。 它的速率数字看着别扭,是因为「线速」和「数据速率」中间隔着一层编码。
3.6.1 的 ATM 是「电话网想统一一切」,光纤通道是反过来的:只管存储一件事。 它和 3.6.10 的 iSCSI 是一对:同样的活,一个走专用网,一个走以太网。
一、名字误导人
先说清一个常见的误会:光纤通道可以跑铜线(机房里的短距离背板就是铜的), 以太网也可以跑光纤。所以「光纤」这两个字不构成区别,区别在协议本身。 它从设计之初就只干一件事:把 SCSI 命令和磁盘数据,从服务器搬到存储阵列。 所以它不需要会路由、不需要跑网页、不需要兼容谁的旧设备。 「只做一件事」是它能做到微秒级延迟的前提。 各代的数字排出来是这样:
| 代际 | 线速 Gbaud | 编码 | 数据 Gbps | 理论 MB/s |
|---|---|---|---|---|
| 1GFC | 1.062 | 8B/10B | 0.85 | 106 |
| 2GFC | 2.125 | 8B/10B | 1.70 | 212 |
| 4GFC | 4.250 | 8B/10B | 3.40 | 425 |
| 8GFC | 8.500 | 8B/10B | 6.80 | 850 |
| 16GFC | 14.025 | 64B/66B | 13.60 | 1700 |
| 32GFC | 28.050 | 64B/66B | 25.60 | 3200 |
第一列的名字和第四列的数字对不上:1GFC 的数据速率是 0.85 Gbps,不是 1 Gbps。 原因是每一代的名字取的是「线速的近似值」,而线速里含编码开销。
二、那 14.025 是怎么来的
8B/10B 的意思是「每 8 个比特的数据,要发 10 个比特的符号」: 多出来的两个用来做直流平衡和错误检测。 代价是 20% 的带宽,所以:
线速 = 数据速率 / 0.8
1.0625 Gbaud x 0.8 = 0.85 Gbps
# 换成 64B/66B 之后:
线速 = 数据速率 / (64/66)
14.025 Gbaud x 64/66 = 13.60 Gbps
从 16GFC 起换成了 64B/66B,开销从 20% 掉到 3%: 所以 16GFC 的线速是 14.025 Gbaud,而不是「16 除以 0.8 得 20」。 第一次看到「16G 的产品跑 14 Gbaud」会觉得厂商写错了——其实是编码换代,名字沿用了旧习惯。 这类「名字和数字对不上」的事在链路层特别多: 「千兆以太网」跑 1.25 Gbaud、「10G 以太网」跑 10.3125 Gbaud,全是同一个原因。
三、它靠什么活着
真正让它留在机房里的不是速率,是「它不丢包」:
| 项目 | 光纤通道 | 以太网 |
|---|---|---|
| 丢包 | 设计上不会 | 拥塞时会 |
| 流控 | 信用式(先问有没有缓冲) | 靠上层重传 |
| 典型延迟 | 微秒级 | 毫秒级(含重传) |
| 用途 | 只跑存储 | 什么都跑 |
第二行是全部差别的根:发送方在发之前先确认「对方还有缓冲区」,没有就等, 所以缓冲区永远不会溢出,帧也就永远不会被丢。 既然不丢,就不需要重传;不需要重传,上层协议就能写得极简。 第三行那个「微秒对毫秒」是从这儿来的: 重传的代价不是「再发一次」那点带宽,是「等一个往返」那段时间。 存储的读写是同步的,等一个往返就意味着业务卡住。 代价写在第四行:它只能在自己的小圈子里用,不通互联网、不跑普通 IP 业务。 所以它是一个「专用工具」——专用带来效率,也带来了「只能用在这一件事上」的天花板。
四、动手 Demo:光纤通道——存储网络专用的链路层
把六代的线速、编码、数据速率一起算出来,看「名字」和「数字」差在哪。 重点看最后两行:编码一换,线速立刻从 17 掉到 14。
fcs = [('1GFC', 1.0625, '8B/10B'), ('2GFC', 2.125, '8B/10B'),
('4GFC', 4.250, '8B/10B'), ('8GFC', 8.500, '8B/10B'),
('16GFC', 14.025, '64B/66B'), ('32GFC', 28.050, '64B/66B')]
for name, baud, enc in fcs:
ratio = 0.8 if enc == '8B/10B' else 64.0 / 66.0
data = baud * ratio
print('%-6s %8.3f %-9s %6.2f Gbps %6.0f MB/s'
% (name, baud, enc, data, data * 1000 / 8))
print('若 16GFC 还用 8B/10B,线速要 %.3f Gbaud' % (13.6 / 0.8))
实跑输出:
--------------------------------------------------------------------
光纤通道——存储网络专用的链路层
--------------------------------------------------------------------
**光纤通道(Fibre Channel)不是「用光纤的以太网」,它是另一套链路层。**
**它从一开始就只服务一件事:让服务器高速读写磁盘。**
代际 线速 Gbaud 编码 数据 Gbps 理论 MB/s
--------------------------------------------------------------
1GFC 1.062 8B/10B 0.85 106
2GFC 2.125 8B/10B 1.70 212
4GFC 4.250 8B/10B 3.40 425
8GFC 8.500 8B/10B 6.80 850
16GFC 14.025 64B/66B 13.60 1700
32GFC 28.050 64B/66B 25.60 3200
**第一行那个 1.0625 不是「1 加一点零头」,是「1.25 乘 0.85」**:
**8B/10B 编码每 8 位要发 10 位,所以线速要比数据速率高 25%。**
**注意最后两行换了编码**:**从 16GFC 开始用 64B/66B,开销从 20% 降到 3%**,
**所以 16GFC 的线速是 14.025 Gbaud,而不是 17 Gbaud。**
**「16G 光纤通道跑 14 Gbaud」这件事,第一次看会觉得厂商写错了**,**其实是编码换代了。**
**最后那列才是「拷一个 1 GB 文件要几秒」的依据**:
**8GFC 理论 850 MB/s,实测通常 800 左右;16GFC 理论 1.7 GB/s,实测约 1.6。**
**差的这一成是帧开销与协议往返,不是编码。**
**光纤通道为什么在数据中心活得好**:
**它把「丢包」这件事从设计里去掉**——
**链路层做信用流控(发之前先确认对方有缓冲区),所以它不丢包、不需要重传。**
**这让上层协议(SCSI)可以极简,延迟低到微秒级。**
**代价是「只能在小圈子里用」——它不通互联网,也不跑普通 IP 业务。**
最后那行 17.000 Gbaud 是个对照:如果 16GFC 沿用旧编码,厂商就得造 17 Gbaud 的收发器; 换成 64B/66B 之后只要 14.025 Gbaud,器件容易做、功耗也低。 所以编码换代不只是「省带宽」,是「让下一代器件做得出来」。 「理论 MB/s」那一列要除以 8 才是字节:13.60 Gbps 除以 8 是 1.7 GB/s,实测通常 1.6 左右。 差的那一成是帧头、CRC 和命令往返,不是编码。算存储性能时永远要打这个折扣。 信用流控有个副作用值得知道:距离越远,「在途的帧」越多,要预留的缓冲区就越大。 所以长距离的光纤通道要么降速、要么加缓冲—— 这也是为什么「异地双活」很少用裸光纤直连,而要走 DWDM 或 IP 网。
30 秒实验
- 算一下:32GFC 如果还用 8B/10B,线速要多少 Gbaud?
- 想一下:为什么存储网络特别怕「重传」,而网页不怕?
- 在机房找一台光纤通道交换机,看它的端口标的是 8G 还是 16G。
常见误区
- 以为「光纤通道必须用光纤」。 它也能跑铜线,名字里的 Fibre 是历史遗留,不是介质要求。
- 以为「16GFC 的数据速率是 16 Gbps」。 实际 13.6,因为 64B/66B 有 3% 开销。
- 以为「光纤通道比 iSCSI 强在带宽」。 强在「不丢包、不等重传」, 带宽反而是它最容易被追平的一项。
自测三问(点开对答案)
1. 光纤通道和以太网最本质的区别是什么? —— **链路层做信用流控,设计上不丢包**,所以上层不需要重传,延迟能压到微秒级。 2. 为什么 1GFC 的数据速率是 0.85 而不是 1 Gbps? —— **8B/10B 编码要发 10 个符号才装 8 个比特**,所以 1.0625 Gbaud 里只有 0.85 Gbps 是数据。 3. 16GFC 为什么是 14.025 Gbaud? —— **它用了 64B/66B,开销只有 3%**,14.025 乘 64/66 正好 13.6 Gbps。下一节看一个更早、更暴力的方案:HIPPI。
- ☐ (本节完,下一节 3.6.7 HIPPI)