📄 一句话概括
路由选择(routing)与转发(forwarding)是两件事,差四个数量级。 选路由 CPU 在拓扑变化时算,转发由芯片对每个包做——混起来就想不清了。
📝 本节和前面几节的关系
上一节讲「为什么需要路由器」,这一节讲它内部的两件事。 这两个词中文都叫「路由」,所以特别容易混。
一、两件事的分工
路由选择:算出「去某个网段走哪条路」。拓扑变化时才做,秒级到分钟级。 转发:把每一个包按表送出去。每个包都做,每秒几百万到几亿次。
前者由 CPU 跑协议,后者由专用芯片查表。 这就是「控制面与数据面分离」——第二章 02.09.01 讲过同一件事。
二、一个常见的误解
「路由器每收到一个包都要算一次最优路径」——不对。
路径是提前算好放进表的,每个包只做一次查表。 如果真每包都算,一个千兆口就能把 CPU 打死(每秒 148.8 万次最优路径计算)。
这也是为什么「路由表」与「转发表」要分开:路由表是「算出来的结果」,转发表是「给芯片看的、 压平过的版本」。
三、动手 Demo:选路与转发的频率差几个数量级
这段先列出两者的分工对照, 再按「拓扑稳定时每秒 10 次路由变化」与「千兆线速每秒 148.8 万个包」算频率比。
route_events = 10
fwd = 1488095
P(u" 路由选择:每秒 %d 次。" % route_events)
P(u" 转发:千兆口线速每秒 %s 个包。" % format(fwd, u","))
P(u" 相差 %s 倍。" % format(int(fwd / route_events), u","))
实跑输出:
--------------------------------------------------------------------
路由选择与转发,是两件不同的事
--------------------------------------------------------------------
**这两个词在中文里都叫「路由」,但英文是分开的**:routing(选路)与 forwarding(转发)。
**混起来会想不清路由器在忙什么。**
项目 路由选择 routing 转发 forwarding
----------------------------------------------------------------
干什么 算出「去某网段走哪条」 把每一个包按表送出去
什么时候 拓扑变化时、周期性 每个包都要
谁来做 CPU 跑协议 转发芯片查表
频率 秒级到分钟级 每秒几百万到几亿次
结果放哪 路由表 转发表(FIB)
**差了多少个数量级?算一下**:
路由选择:拓扑稳定时几分钟才变一次,算它每秒 10 次。
转发:千兆口线速每秒 1,488,095 个包。
相差 148,809 倍。
**所以两者必须分开做**:选路交给 CPU(慢但灵活),转发交给专用芯片(快但只能照表办事)。
**这就是「控制面与数据面分离」的由来**——第二章 02.09.01 讲过同一件事。
**一个常见的误解**:「路由器每收到一个包都要算一次最优路径」。
**不对。**路径是提前算好放进表的,**每个包只做一次查表**。
如果真每包都算,一个千兆口就把 CPU 打死了。
14.9 万倍的差距,这就是为什么必须用两套硬件。 用 CPU 做转发,一个千兆口就能顶住;用芯片做选路,做不了灵活的策略。
「结果放哪」那一行也要看清:路由表在内存里、条目带属性、 便于软件增删;转发表在 TCAM 里、压成前缀加动作、 只能硬件查。两者不一致时,转发会出错——所以改完路由要确认下发成功。
最后一个实践:show ip route 看的是路由表,不等于转发表。
某些设备上出现「路由表里有、但流量不通」,就是下发到转发表这一步失败了。
30 秒实验
- 在设备上分别看「路由表」与「转发表」,对比条数。
- 看一台设备的 CPU 利用率,判断是控制面还是数据面忙。
- 改一条路由,看它多久生效、有没有日志。
常见误区
- 以为每包都算最优路径。只查表,不算。
- 以为路由表就是转发表。一个是软件表,一个是硬件表。
- 以为选路越快越好。稳定比快更重要。
自测三问(点开对答案)
1. 路由选择与转发分别由什么实现? —— 选路由 CPU 跑协议,转发由专用芯片查表。 2. 为什么每个包不重新算路径? —— 频率差四个数量级,CPU 根本算不过来。 3. 路由表与转发表的关系? —— 路由表是软件表,转发表是压平后给硬件查的版本。下一节:算完了,看转发这一步具体做了什么。
- ☐ (本节完,下一节 03.01.03 转发)