
路由器中需要有交换电路/交换单元,而且这恰恰是路由器与"跑转发软件的通用计算机"的本质区别之一。分几层说清楚。
一、路由器为什么必须有交换单元
经典路由器体系结构由四部分组成:
输入端口 ──┐ ┌── 输出端口
输入端口 ──┤ 交换结构 ├── 输出端口
输入端口 ──┤ (Switching Fabric)├── 输出端口
└───┬────────┬──────┘
路由处理器(控制平面:跑 OSPF/BGP、生成转发表)
查表(决定"从哪个口出去")只完成了转发的一半工作;另一半是把分组物理地从输入线卡搬运到输出线卡------完成这个搬运的硬件就是交换单元/交换结构。没有它,N 个端口之间就无法互连,路由器就退化成一堆孤立的接口卡。
二、交换结构的三种经典形态
| 形态 | 复用方式 | 聚合带宽瓶颈 |
|---|---|---|
| 共享内存式 | 时分(所有端口轮流读写同一内存) | 内存带宽 |
| 共享总线式 | 时分(所有端口轮流占用同一总线) | 总线带宽 + 仲裁 |
| 交叉矩阵/多级互连网络 | 空分(多对端口同时各走各的物理通路) | 单条通路的速率 |
前两种本质上都是时分交换:任意时刻只有一对端口在通信,其余排队。共享资源的速度必须超过所有端口速率之和(还要再留加速比),否则就是瓶颈。
三、为什么电信级/核心路由器必须用空分交换
核心原因一句话:单一共享资源的速度是有物理上限的,而空分交换的容量随端口数水平扩展。
算笔账:一块 16 端口 × 100G 的线卡阵列,聚合吞吐 1.6 Tbps。若用共享总线/内存,总线至少要跑到 1.6 Tbps 以上(实际还需 1.5--2 倍加速比来对抗突发),单根总线/单颗内存根本做不到。而空分方案------比如 N×N Crossbar------给每对输入/输出提供独立的物理通路,理想情况下 N 对端口可以同时各传各的,每条通路只需跑 100G,聚合容量靠"通路数量"堆出来,而不是靠"单点速度"硬顶。
实际工程形态:
- Crossbar(交叉矩阵) :最直接的空分结构,N×N 个交叉点,交换芯片内部基本都是它(前面聊的 Expresso 里的
aiguilleur就是一个极简 3×3 交叉矩阵------one-hot 选择 + OR-mux); - 多级互连网络(Banyan、Batcher-Banyan):Crossbar 的交叉点是 O(N²),端口多了造不起,用多级小开关换成本;
- Clos 三级网络 + 分布式 fabric 芯片:电信级核心路由器(思科 CRS、Juniper TX 等)的标准做法------把交换结构拆成独立的 fabric 芯片/机框,线卡之间经多级 Clos 互连,可平滑扩到几百 Tbps。
四、空分带来的伴生问题
(这也是"交换单元"成为一门学问的原因)
空分只是提供了并行通路,真正难的是调度:
- 输出冲突:两个输入口同时要往同一个输出发包,物理通路只能给一个用;
- HOL 阻塞:简单输入排队会让队头堵死整队,吞吐跌到约 58.6%;
- 工程解法:VOQ(虚拟输出队列)+ 集中式调度算法(iSLIP 及其变体)+ fabric 加速比 + 分组切片成定长 cell 再重组------电信级交换/路由芯片内部几乎都是这套组合。
五、边界情况:什么路由器可以不要空分交换
- 家用/SOHO 路由器:端口少、速率低,交换单元用共享总线甚至 CPU 软件拷贝就够了(早期 Cisco 路由器就是 CPU+共享内存)。家里那个"路由+4口交换"产品里的交换芯片做的是 L2 转发,与路由器内部 fabric 是两回事;
- 纯软件路由(x86+DPDK/VPP):交换单元就是内存和 PCIe/NUMA 互连,本质是共享介质,靠通用硬件的带宽红利硬扛,到几百 G 就到头了。
结论:只要路由器要做多端口分组搬运,交换单元就在------区别只在用时分还是空分实现。端口速率低时用时分凑合;一旦进入电信级聚合带宽(Tbps 级),空分交换(Crossbar/Clos 多级 fabric)就是唯一可行的物理路径------因为它把容量问题从"单点要多快"转化为"并行通路有多少条",而后者是可以堆出来的。