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 查找           标签等转发信息

当数据包到达时:

  1. 将目的 IP 输入 TCAM。
  2. TCAM 并行完成最长前缀匹配,返回匹配项的索引。
  3. 根据该索引访问 SRAM,读取对应的下一跳、出接口、MAC 地址等转发信息。
  4. 将数据包发送到相应端口。

这种设计充分利用了两类存储器的优势: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),因此成为高速路由器和交换机转发表查找的核心硬件。