TCAM(三态内容寻址存储器):路由器线速转发的核心硬件
这是一个非常好的问题。
实际上,TCAM(Ternary Content Addressable Memory,三态内容寻址存储器) 可以说是现代高性能路由器、交换机能够实现线速(Line Rate)转发的核心硬件之一。
很多人第一次看到 TCAM 时都会疑惑:
为什么普通内存(DRAM、SRAM)不能做路由查找? 为什么一定要一种特殊的存储器?
其实答案就在于查找方式完全不同。
一、普通内存是"按地址找数据"
先回顾一下普通内存。
例如:
地址(Address) 数据(Data)
-----------------------------
0x1000 -------> Apple
0x1001 -------> Banana
0x1002 -------> Orange
CPU访问过程:
CPU:
我要地址 0x1001
↓
SRAM/DRAM
返回:
Banana
也就是说:
输入的是地址,输出的是数据。
所以它叫
Address Memory(地址存储器)
查找复杂度:
O(1)
因为地址就是索引。
二、但是路由器不是按地址找,而是按内容找
例如一个 IPv4 包来了:
目的IP:
192.168.10.25
路由器要做的是:
整个路由表:
192.168.0.0/16
192.168.10.0/24
192.168.10.0/25
0.0.0.0/0
它要回答:
哪一条 Prefix 能匹配它?
注意:
这里没有:
Entry #123
而是
我要找:
有没有一项内容
==
192.168.10.xx
所以这是:
按内容查找(Content Lookup)
普通内存不会做这种事情。
三、如果用 DRAM 查找,会发生什么?
假设有:
100 万条路由
来了一个 IP:
10.1.2.3
CPU只能:
for each Route
{
比较 Prefix
}
变成:
Route1
比较
↓
Route2
比较
↓
Route3
比较
↓
......
↓
Route1000000
复杂度:
O(N)
这当然不能接受。
因为:
100Gbps
甚至
400Gbps
意味着:
每秒几十亿个包
根本没有时间遍历。
四、于是出现 CAM(Content Addressable Memory)
CAM 就是:
输入数据,而不是输入地址。
例如:
CAM里面:
Entry0:
Apple
Entry1:
Banana
Entry2:
Orange
输入:
Banana
CAM:
不用CPU找
自己比较
↓
命中Entry1
输出:
Entry1
也就是说:
输入:
内容(Content)
↓
输出:
地址(Address)
所以叫:
Content Addressable Memory
与普通 RAM 正好相反。
RAM vs CAM
RAM
地址
↓
Memory
↓
数据
而 CAM:
内容
↓
Memory
↓
地址
这是最大的区别。
五、CAM 为什么快?
因为:
普通内存:
一次只能比较一个位置
而 CAM:
所有 Entry
同时比较
例如:
有:
Entry0
Entry1
Entry2
...
Entry1000000
输入:
Banana
CAM内部:
Entry0 ← 比较
Entry1 ← 比较
Entry2 ← 比较
......
Entry1000000 ← 比较
全部:
同一时钟
完成。
所以:
时间
≈
O(1)
注意:
这是硬件并行。
不是算法优化。
六、为什么还要 TCAM?
因为 CAM 有一个问题:
只能:
完全相等
例如:
Banana
才能命中。
但是:
路由不是这样。
例如:
192.168.0.0/16
真正意思:
前16位一样即可
后16位忽略
例如:
192.168.10.1
匹配。
192.168.200.100
也匹配。
因为:
后16位不用管。
普通 CAM 做不到。
七、TCAM 的"T"是什么?
T = Ternary(三值)。
普通 CAM:
每个位只有:
0
1
TCAM:
每个位有:
0
1
X
这个:
X
就是:
Don't Care
意思:
这一位
无所谓。
例如:
存:
1101XX00
这里:
X
=
0 或 1
都可以。
例如:
11010000
✓
11010100
✓
11011000
×
因为:
第五位已经不符合。
八、TCAM 正好适合 Prefix
例如:
Prefix:
192.168.0.0/16
二进制:
11000000
10101000
XXXXXXXX
XXXXXXXX
注意:
后16位:
全部:
X
所以:
任何:
192.168.x.x
都会匹配。
这就是:
Prefix Match。
九、Longest Prefix Match(最长前缀匹配)怎么办?
真正困难的是:
192.168.0.0/16
192.168.10.0/24
192.168.10.128/25
一个 IP:
192.168.10.130
会同时命中:
/16
✓
/24
✓
/25
✓
但是:
真正应该选:
/25
因为最长。
TCAM 的做法非常巧妙。
例如:
把优先级排好:
Index0
192.168.10.128/25
Index1
192.168.10.0/24
Index2
192.168.0.0/16
Index3
Default
TCAM:
所有一起匹配
结果:
命中:
0
1
2
硬件:
Priority Encoder(优先级编码器)
直接输出:
Index0
于是:
天然就是:
Longest Prefix Match
因为最长 Prefix 放最前面。
十、TCAM 内部结构(逻辑示意)
下面是一幅简化的逻辑图,帮助理解 TCAM 的工作流程:
+-------------------------------+
| Lookup Key(目的 IP) |
| 192.168.10.130 |
+---------------+---------------+
|
与所有 TCAM 行并行比较
|
---------------------------------------------------------
| | | |
v v v v
+----------------+ +----------------+ +----------------+ +----------------+
|192.168.10.128/25| |192.168.10.0/24 | |192.168.0.0/16 | |0.0.0.0/0 |
|Mask:111...111 | |Mask:111...000 | |Mask:111...000 | |Mask:000...000 |
| ✓ 命中 | | ✓ 命中 | | ✓ 命中 | | ✓ 命中 |
+----------------+ +----------------+ +----------------+ +----------------+
\ | | /
\______________|_________________|___________________/
|
Match Lines(命中信号)
|
v
+-------------------------------+
| Priority Encoder(优先级编码器)|
| 选择最高优先级(最长前缀) |
+---------------+---------------+
|
v
输出对应的下一跳、出接口等信息
整个过程只需一次并行比较和一次优先级选择,因此能够在极短时间内完成一次查找。
十一、TCAM 为什么这么贵?
TCAM 的高性能来自于硬件并行,但代价也非常明显。
1. 存储密度低
普通 SRAM 的每个存储位只需要保存 0/1。
而 TCAM 的每个存储位不仅要保存 0、1、X(三态),还需要配套比较电路,因此每个单元面积远大于 SRAM。
结果就是:
同样 1MB
SRAM 芯片很小
TCAM 芯片可能大很多
2. 功耗高
查找一次:
SRAM:
只激活一行
而 TCAM:
每一行
每一位
全部参与比较
例如:
100 万 Entry
一次 Lookup
100 万行全部工作
因此:
功耗远高于 SRAM
3. 容量有限
因此:
TCAM:
几 MB
几十 MB
已经算很多。
不会做到:
几十 GB
4. 更新速度较慢
TCAM 擅长:
Lookup
不擅长:
Insert
Delete
Move
尤其:
为了保持:
Longest Prefix
优先级。
有时需要重新整理。
十二、现代路由器如何使用 TCAM?
现代高性能路由器通常不会把所有数据都放入 TCAM,而是采用多级存储:
控制平面(CPU)
│
学习、计算路由(RIB)
│
▼
Forwarding Table(FIB)
│
┌──────────────┴──────────────┐
│ │
▼ ▼
TCAM(前缀匹配) SRAM(下一跳信息)
保存前缀和掩码 保存接口、MAC、
并负责 LPM 查找 标签等转发信息
当数据包到达时:
- 将目的 IP 输入 TCAM。
- TCAM 并行完成最长前缀匹配,返回匹配项的索引。
- 根据该索引访问 SRAM,读取对应的下一跳、出接口、MAC 地址等转发信息。
- 将数据包发送到相应端口。
这种设计充分利用了两类存储器的优势:TCAM 提供极快的匹配能力,SRAM 提供高密度、低功耗的存储能力。
十三、总结
可以把几种存储器的角色概括如下:
| 存储器 | 查找方式 | 查找复杂度(逻辑) | 是否支持掩码匹配 | 典型用途 |
|---|---|---|---|---|
| DRAM | 地址 → 数据 | O(1) 地址访问 | ❌ | 主内存、大容量存储 |
| SRAM | 地址 → 数据 | O(1) 地址访问 | ❌ | CPU Cache、交换芯片缓存 |
| CAM | 内容 → 地址 | 并行匹配(近似 O(1)) | ❌(仅精确匹配) | MAC 地址表等精确查找 |
| TCAM | 内容 → 地址 | 并行匹配(近似 O(1)) | ✅(支持 0/1/X 三态) |
IP 路由最长前缀匹配(LPM)、ACL、防火墙规则等 |
一句话理解:
- RAM(SRAM、DRAM):知道"地址",去取"数据"。
- CAM:知道"数据",反查"存放位置"。
- TCAM:在 CAM 的基础上支持
0/1/X三态匹配,能够天然完成网络设备最关键的最长前缀匹配(LPM),因此成为高速路由器和交换机转发表查找的核心硬件。