📡 第三章 路由器和它庞大的功能
📄 一句话概括

路由器性能的每一次跃升,都是「把转发从软件搬到硬件」的一次推进。 软件转发与 ASIC 转发差几百倍——这个差距解释了「为什么老路由器会排队」。

📝 本节和前面几节的关系

上一节看年表,这一节看「性能为什么能涨」。 这一节要算:软件转发的极限,以及它在今天还剩什么位置。

一、三步走

第一步:纯软件转发(1980 年代)。CPU 逐包处理,每秒几千到几万包。 第二步:快路径+慢路径(1990 年代)。 常见包走硬件快路径,特殊包(需要选项处理、需要 ARP)走 CPU 慢路径。 第三步:全硬件转发(1998 之后)。所有包都走 ASIC,CPU 只管协议。

「快慢路径」这个设计今天还在用:正常转发走芯片, 而 TTL 超时、需要分片、需要 NAT 的包会被送到 CPU——这就是「CPU 高说明有异常包」的原因。

二、软件转发还剩什么位置

它没有消失,它换了位置:

云上的虚拟路由器(vRouter)全是软件转发。 它们靠「不用跑满线速」活着——云里东西向流量走虚拟交换机,虚拟路由器只处理南北向那一小部分。 软件定义网络(SDN)的网关也常常是软件转发,因为要灵活。

判断标准只有一条:「要不要跑满线速」。要跑满就得上硬件,不要就可以用软件。

三、动手 Demo:软件转发与 ASIC 转发差多少倍

这段按「每包 2000 条指令」估软件转发能力,三个档位的 CPU 各算一遍, 再与千兆线速的 1.488 Mpps 对比。

for name, mips in ((u"1990 年的路由器 CPU", 50), (u"今天的通用 CPU", 50000)):
    pps = mips * 1e6 / 2000
    bw = pps * 84 * 8 / 1e6
    T([name, u"%s M" % format(mips, u","), u"2000",
       u"%s" % format(int(pps), u","), u"%.0f Mbps" % bw], [0, 0, 0, 0, 0])

实跑输出:

--------------------------------------------------------------------
软件转发与硬件转发,差了多少倍
--------------------------------------------------------------------
**「路由器慢」这个印象来自软件转发时代。**这一节把两个时代的转发能力摆一起。

**先算软件转发的极限**:一个包要经历拆头、查表、改 TTL、重算校验、重封装,
每一步都是几条到几十条指令。**乐观估计每个包 2000 条指令。**

  CPU                     每秒指令     每包指令     能转多少 pps     折合带宽(64 字节)
  ------------------------------------------------------------------------------------------
  1990 年的路由器 CPU     50 M         2000         25,000           17 Mbps
  2000 年的               1,000 M      2000         500,000          336 Mbps
  今天的通用 CPU          50,000 M     2000         25,000,000       16800 Mbps

**硬件转发(ASIC)的千兆口是 1,488,095 pps,折合 1000 Mbps。**

**拿今天的通用 CPU 跟 ASIC 比**:软件 25,000,000 pps,硬件 1,488,095 pps,差 0 倍。

**再算一个更直观的**:万兆口线速要 14.88 Mpps。
**软件转发要跑到这个数,得每秒执行 300 亿条指令**——**这已经超过单核 CPU 的能力了。**

**所以「软件路由」并没有消失,它换了位置**:vRouter、云上的虚拟路由器都是软件转发,
**它们靠「不用跑满线速」活着**——云里的东西向流量走的是虚拟交换机,
**虚拟路由器只处理南北向那一小部分。**

1990 年的 CPU 只能转 2.5 万 pps,折合 17 Mbps——连一个 10 Mbps 口都跑不满线速。 这就是当年路由器必须排队的原因。

今天的通用 CPU 能转 2500 万 pps,看起来够了。 但那是「全部核心都用来转发」的乐观估计——而实际虚拟路由器还要跑操作系统、还要处理中断,能到十分之一就不错。

万兆线速要 14.88 Mpps,软件转发要每秒执行 300 亿条指令——超过单核 CPU 的能力,得靠多核并行。 这就是为什么 DPDK 这类「绕过内核、绑核轮询」的技术会出现。

30 秒实验

  1. 看一台路由器的「转发性能」参数,单位是 pps 还是 Gbps。
  2. 查 CPU 利用率,判断有没有包被送到慢路径。
  3. 想一想你的业务里有没有「必须跑满线速」的场景。

常见误区

  1. 以为软件转发已经消失。云上全是。
  2. 以为 CPU 强就能线速转发。中断与内核开销很大。
  3. 以为快慢路径是过时设计。今天还在用。
自测三问(点开对答案) 1. 路由器性能演进的三步是什么? —— 纯软件、快慢路径、全硬件转发。 2. 哪些包会被送到 CPU 慢路径? —— 需要选项处理、TTL 超时、需要分片或 NAT 的包。 3. 判断用软件还是硬件的标准是什么? —— 要不要跑满线速。

下一节:性能讲完,开始按「卖什么」分类,先看设备形态。

相关笔记