Appearance
路由器与三层转发
2026 大纲 四(八)1 路由器的组成和功能、四(八)2 路由表与分组转发,同时是 四(一)2 路由与转发在设备层面的落地。路由与转发的概念分界在《网络层功能》。
一、冲突域与广播域:两个域,两个层次
前面讲路由与转发时,路由器一直是个抽象的"查表转发的盒子"。这一篇把盒子打开。而在拆机之前,先要把一件更基础的事说清楚:这台设备接进网络以后,究竟改变了什么。
答案是它切开了两种"域",而这两种域属于不同的层次。
冲突域是连在同一物理介质上、存在介质争用的所有节点,属物理层的事——两个站同时发,信号在介质上叠加,谁都收不对。广播域是能接收同一广播帧的所有节点,属数据链路层的事——一个帧的目的 MAC 写成全 F,谁能收到它。
冲突是信号叠加的事,广播是帧送给谁的事。 层次不同,所以能分割它们的设备也不同:
| 设备 | 层次 | 分割冲突域 | 分割广播域 | 为什么 |
|---|---|---|---|---|
| 中继器 / 集线器 | 第 1 层 | 不能 | 不能 | 只做信号放大并向所有端口转发,所有端口本质上共享一条总线 |
| 网桥 / 交换机 | 第 2 层 | 能 | 不能 | 按 MAC 定向转发,每个端口是独立冲突域;但广播帧仍向所有端口转发 |
| 路由器 | 第 3 层 | 能 | 能 | 工作在网络层,不转发广播帧,广播被挡在接口上 |
这张表可以推,不必死背,推法是问这台设备"处理到第几层":只处理到物理层(信号),它连帧都不认识,只能把信号原样送到所有端口,两个域都分不开;处理到数据链路层(帧),认得 MAC 能只往一个端口送,冲突域分开了,但广播帧的目的 MAC 就是"所有人",它照做不误;处理到网络层,广播帧根本不是它要转发的对象,两个域都分开了。
有一条边界要补:交换机"不分割广播域"是默认配置下的结论,启用 VLAN 后可以把不同 VLAN 隔成不同广播域。
怎么数:广播域好数,冲突域有个口径
广播域数 = 路由器(或其他三层设备)在用的接口数。 广播帧会被交换机泛洪、被集线器放大,传遍这个接口下的所有设备,但到路由器为止;没接线的接口下面没有节点,不算。
冲突域要先问一句"哪一段介质上真的可能碰撞",答案不像广播域那么整齐:
| 这一段 | 算不算一个冲突域 | 为什么 |
|---|---|---|
| 集线器 + 它下挂的全部主机 + 它到交换机的上联线 | 算 1 个(整片合计) | 共享介质,两台主机同时发就会撞 |
| 交换机端口直接挂一台主机的那条链路 | 算 1 个 | 教材口径:"每一个端口和连接到端口的主机构成了一个碰撞域" |
| 交换机↔交换机、交换机↔路由器的链路 | 通常不计 | 全双工点对点,两端各自独立收发,物理上不可能碰撞 |
第三行是判卷口径所在,也是这类题唯一的分歧点。 教材那句"
所以真正可靠的口诀是:数冲突域就是数"有几片共享介质"。集线器不切分冲突域,它只是把自己那一片撑大——上行链路也在这根总线的争用范围内,H1 下的主机和交换机送来的帧同样会碰撞,这是数冲突域唯一容易漏的地方。
拿一张自造的拓扑走一遍:路由器 R 有三个接口在用——接口 1 接交换机 S1,S1 上另接 3 台主机(HA、HB、HC)和集线器 H1,H1 上接 4 台主机;接口 2 直接接集线器 H2,H2 上接 3 台主机;接口 3 接交换机 S2,S2 上接 2 台主机。
广播域:R 有 3 个接口在用 ⇒ 3 个。
冲突域按"数共享介质"来数:S1 下的 HA、HB、HC 三条链路各一片(3 个);集线器 H1 连同上行链路和它的 4 台主机合成一片(1 个);集线器 H2 连同上行链路和它的 3 台主机合成一片(1 个);S2 下的 HX、HY 各一片(2 个)。合计 7 个。 R 到 S1、R 到 S2 这两条全双工点对点链路不计入。
二、路由器的组成
路由器内部严格按控制面 / 数据面分成两块:
控制平面是路由选择处理机——跑 RIP/OSPF/BGP、维护路由表,纯软件。数据平面是交换结构 + 一组输入端口 + 一组输出端口(这里的"端口"就是硬件接口)。
输入端口的分流动作,就是"控制面 / 数据面"在硬件上的物理体现:物理层收比特 → 数据链路层剥去帧的首部和尾部得到分组 → 到网络层分岔,路由协议分组(RIP/OSPF 等)送交路由选择处理机,数据分组按目的地址查转发表、经交换结构送到合适的输出端口。前一条走上控制面,后一条留在数据面。
输出端口的方向与输入端口相反:网络层处理模块里设一个缓存区(就是队列),交换结构送来的速率超过输出链路发送速率时,来不及发的分组暂存在这里;再由数据链路层加上首部和尾部,交物理层发到外部线路。
这里有两个工程细节值得单独记。
其一是影子副本。 路由器往往把复制的转发表放在每一个输入端口中,由路由选择处理机统一更新,这些副本称为"影子副本"。理由是分散化交换可以避免在路由器中的某一点上出现瓶颈——若所有输入端口共用一张表,那个访问点就成了全局瓶颈。
其二是线速要求。 OC-48 链路(
还有一个位置必须记准:分组丢失究竟发生在哪。 分组在输入端口(正在查表时后续分组到达)和输出端口(交换结构送来的速率超过输出链路发送速率)都会排队;队列的存储空间减到零,后面再进来的分组就只能被丢弃。分组丢失就发生在输入或输出队列溢出的时候——不是"网络层主动决定丢弃"这种拟人化的说法。
这一句正好接住拥塞控制那条链:队列溢出 → 丢包 → TCP 超时 → 减小 cwnd。路由器的输出队列就是拥塞信号真正诞生的地方;也正是在这里能看清"加大缓存不解决拥塞"——把队列加长只会让排队时延变长,输出链路的发送速率一点没变。
三、三种交换结构
交换结构是路由器的关键构件,作用是根据转发表把分组从输入端口转移到合适的输出端口。它本身就是一种网络,但完全包含在路由器之中,所以可看成"在路由器中的网络"。
| 方式 | 怎么走 | 瓶颈 | 阻塞否 |
|---|---|---|---|
| 通过存储器 | 分组复制进存储器,再从存储器复制到输出端口 | 存储器读写带宽——一个分组要经过两次存储器操作 | 是 |
| 通过总线 | 分组经共享总线直接送到输出端口,不需要路由选择处理机干预 | 总线速率——总线共享,同一时间只能有一个分组在传送 | 是(总线忙时在输入端口排队) |
| 通过纵横交换结构 | 只有"目标输出端口已被占用"这一种冲突 | 无阻塞 |
纵横结构里 A→Y 与 B→Z 用的是不同的总线,可以同时进行——演进的主线是"去共享":共享存储器带宽 → 共享一条总线 → 每对输入输出走各自的通路,每一步都是把一个全局共享的资源拆掉。这和影子副本是同一个思路的两次应用。
"无阻塞"这三个字有条件,别读成"永远不排队"。 条件是目标输出端口空闲;两个分组要去同一个输出端口时,仍然只能一个先走。它的准确含义是"不会因交换结构内部资源不足而阻塞"。
四、路由表 vs 转发表
| 对比项 | 路由表 | 转发表 |
|---|---|---|
| 怎么来的 | 路由选择算法计算得出 | 由路由表导出 |
| 内容 | 一般仅含从目的网络到下一跳(用 IP 地址表示)的映射 | 必须含完成转发所必需的信息:到输出端口与下一跳 MAC 地址的映射 |
| 优化目标 | 对网络拓扑变化的计算最优化 | 使查找过程最优化 |
| 实现 | 总是用软件实现 | 可用特殊的硬件来实现 |
| 所属平面 | 控制平面 | 数据平面 |
两者的优化目标是冲突的,所以用不同的数据结构实现会带来好处。但讨论路由选择原理时往往不去区分,可以笼统地都使用"路由表"这一名词——这不是错,是省略;题面一旦并列写出,就必须按上表分清。
动词也要分:转发是按转发表把 IP 数据报从合适端口送出去,仅涉及一个路由器;路由选择涉及很多路由器,路由表是它们协同工作的结果。
五、最长前缀匹配在路由器里的位置
它就在输入端口的网络层处理模块里,对着影子副本做的那次查表,必须在 Mpps 的速率下完成。匹配到多条记录时取网络前缀最长(掩码位数最多)的一条,全都不匹配则按默认路由 0.0.0.0/0 转发。
默认路由能兜底,靠的是它的目的地址与掩码都是 0.0.0.0:任何 IP 与 0.0.0.0 相与都得 0.0.0.0,所以它永远命中;但掩码位数为 0,所以永远最后才轮到它。两句话合起来才是"兜底"的准确含义。完整的匹配步骤与逐位计算在网络层功能与 IP 编址与子网划分。
这次查表究竟怎么做到 Mpps:逐前缀循环为什么不行、二叉线索怎么救场(想弄清查表算法这一层时展开)
线路速率
最朴素的查法是对所有可能的前缀长度循环:先假设前缀 32 位,用 32 位掩码与目的地址相与、逐行比对整张表;不中就换 31 位再扫一遍……它的问题不是"慢一点",而是次数固定得吓人——最坏情况(表里根本没有这条路由)要老老实实做满 32 轮,每轮还要扫描全表。200 ns 里做不完。
注意这个困难是 CIDR 带来的。 分类编址时代网络号长度由地址的头几位直接决定,一看就知道该拿几位去比,根本不存在最长前缀匹配这个问题;CIDR 把前缀长度变成了未知数,才逼出"怎样又快又准地找出最长的那个匹配"。
通行做法是把转发表存进一种层次的数据结构自上而下查,最常用的是二叉线索(binary trie)。构造规则只有一句:IP 地址中从左到右的比特值,决定从根节点逐层向下延伸的路径——第一位是 0 走左下、是 1 走右下,依此类推,于是树中每一条根到叶的路径就代表转发表里存放的一个地址。
为压扁树深,实际存的不是完整 32 位,而是各地址的唯一前缀——在表内所有地址中能把它和其余区分开的那段最短前缀;查找时只要能和唯一前缀匹配就行。拿四条自造前缀 00、010、011、1 建树:
查 011010…:0 往左、1 往右、1 再往右,三步就落到叶节点 011——代价从"表长 × 32"降到"树深 ≤ 32",而且与表里有多少条路由无关。中途走不下去就说明这个地址不在树中,直接判定不匹配。
❗ 找到叶节点还没完。 二叉线索匹配的是唯一前缀,不是网络前缀,所以每个叶节点还必须存着对应的网络前缀与子网掩码;搜到叶节点后仍要把目的地址与该叶节点的子网掩码做一次按位 AND,与网络前缀相符才转发,不符就丢弃。树负责"快",AND 负责"准",两步缺一不可——把"树查完就等于匹配成功"当结论,是对这个结构最容易犯的误解。
再快一点:压缩。 若若干条路径开头若干位完全相同(比如都以 1011 开头),就可以跳过这几层、直接从第 5 位开始比。代价是建表时多算一些,但每次查表都省时间——这和影子副本、纵横交换结构是同一种取舍:用一次性的构建开销,换每分组都要付的转发开销。
本节小结
- 两种域的分割能力可以从"这台设备处理到第几层"推出来:集线器只到物理层,两个都分不了;交换机到数据链路层,认 MAC 所以分冲突域、广播帧照转所以分不了广播域;路由器到网络层,两个都能分(VLAN 会改写交换机那一行)。数域时广播域数 = 路由器在用接口数,冲突域数 = 有几片共享介质——集线器整片算一个,交换机↔交换机、交换机↔路由器的全双工链路通常不计。
- 路由器 = 控制平面的路由选择处理机 + 数据平面的"交换结构 + 输入端口 + 输出端口"。输入端口按物理层、数据链路层、网络层依次处理并分流(协议分组上交处理机、数据分组查表转发),每个输入端口存一份转发表的影子副本以避免单点瓶颈。三种交换结构的演进主线是把全局共享的资源一层层拆掉,纵横结构的"无阻塞"以目标输出端口空闲为条件。
- 排队与查表是两个硬约束:输入、输出端口都会排队,队列溢出就是分组丢失的物理位置,也是拥塞信号诞生的地方;而 Mpps 的速率决定了转发表要硬件化、要用二叉线索这类层次结构查找,且查到叶节点后仍须做一次按位 AND 校验。路由表与转发表因优化目标冲突而分作两张,讨论原理时可笼统混称。
考点速记
路由器本身在真题里被考过的形式只有一种:给一组设备,问哪些能挡住某种流量。
哪些设备能抑制广播风暴(cn-2010-38)。四个候选是中继器、集线器、网桥、路由器,答 D,只有路由器。判据就是第一节那张表的最后一列:中继器和集线器只处理到物理层,广播帧对它们只是一串要放大的信号;网桥处理到数据链路层,认得 MAC,但广播帧的目的 MAC 就是"发给所有人",网桥照转不误;只有路由器处理到网络层,广播帧根本不在它的转发对象之列。
这道题的陷阱在网桥那一项——很多人记得"网桥能分割冲突域"就顺手把它一起选上了。分冲突域和挡广播是两件事,网桥只做前一件。
本篇的其余内容——路由器的两个平面、影子副本、三种交换结构、二叉线索查表——在真题里不单独成题。它们的作用是让前面那些结论有处可依:知道分组在输入/输出队列溢出时才丢失,"路由器丢包不是 bug"就不再是一句需要背的话;知道转发表存在影子副本,也就明白为什么路由表和转发表要分成两张。
本篇练习区里还会出现另外两道题,它们的机制讲在别处:cn-2014-43 考的是 OSPF 的链路状态信息与路由聚合,在 OSPF 展开;cn-2022-36 考的是从拓扑反推主机的掩码与默认网关,在 IP 编址与子网划分 展开。
易错:网桥能分割冲突域,但挡不住广播。 广播帧的目的 MAC 是全 F,二层设备照转。
易错:数冲突域就是数"有几片共享介质"。 交换机↔交换机、交换机↔路由器之间是全双工点对点链路,两端可以同时发,通常不计入冲突域。
易错:集线器的上行链路也在它那根总线的争用范围内,不能单独再算一个冲突域。
易错:广播域数 = 路由器在用的接口数,没接线的接口不算。
易错:交换机"不分割广播域"是默认配置下的结论,启用 VLAN 后可以隔开。
易错:分组丢失发生在输入或输出队列溢出时,不是网络层"主动决定丢弃"。
易错:纵横交换结构的"无阻塞"以目标输出端口空闲为条件,两个分组去同一个输出端口时仍要排队。
教材出处
- 谢希仁《计算机网络》(第 8 版)4.6.5 路由器的构成,印刷版 p175–p178:
- 两个平面与分组转发部分的三段式在 p176——"分组转发部分……由三部分组成:交换结构、一组输入端口和一组输出端口(请注意:这里的端口就是硬件接口)";同页给出交换结构的定义——"交换结构(switching fabric)又称为交换组织……交换结构本身就是一种网络,但这种网络完全包含在路由器之中,因此交换结构可看成是'在路由器中的网络'"。
- 转发与路由选择的区别在 p176——"'转发'就是路由器根据转发表把收到的 IP 数据报从路由器合适的端口转发出去。'转发'仅仅涉及一个路由器。但'路由选择'则涉及很多路由器,路由表则是许多路由器协同工作的结果";转发表与路由表的区别同页——"路由表一般仅包含从目的网络到下一跳(用 IP 地址表示)的映射,而转发表是从路由表得出的。转发表必须包含完成转发功能所必需的信息……路由表总是用软件实现的,但转发表则可用特殊的硬件来实现";并说明"在讨论路由选择的原理时,往往不去区分转发表和路由表的区别,而可以笼统地都使用路由表这一名词"。
- 输入端口的三层处理与分流在 p176——"物理层进行比特的接收。数据链路层则按照链路层协议接收传送分组的帧。在把帧的首部和尾部剥去后,分组就被送入网络层的处理模块。若接收到的分组是路由器之间交换路由信息的分组(如 RIP 或 OSPF 分组等),则把这种分组送交路由器的路由选择部分中的路由选择处理机。若接收到的是数据分组,则按照分组首部中的目的地址查找转发表"。
- 影子副本与线速的估算在 p176——"为了使交换功能分散化,往往把复制的转发表放在每一个输入端口中……这些副本常称为'影子副本'(shadow copy)。分散化交换可以避免在路由器中的某一点上出现瓶颈";"设线路是 OC-48 链路,即 2.5 Gbit/s。若分组长度为 256 字节,那么线速就应当达到每秒能够处理 100 万以上的分组。现在常用 Mpps(百万分组每秒)为单位……在路由器的设计中,怎样提高查找转发表的速率是一个十分重要的研究课题"。
- 输入/输出端口排队与丢包位置在 p177——"分组在路由器的输入端口和输出端口都可能会在队列中排队等候处理。若分组处理的速率赶不上分组进入队列的速率,则队列的存储空间最终必定减少到零,这就使后面再进入队列的分组由于没有存储空间而只能被丢弃。以前我们提到过的分组丢失就是发生在路由器中的输入或输出队列产生溢出的时候";输出端口的缓存区说明同页——"当交换结构传送过来的分组的速率超过输出链路的发送速率时,来不及发送的分组就必须暂时存放在这个队列中"。
- 三种交换结构在 p177–p178——"交换结构是路由器的关键构件";总线方式"数据报从输入端口通过共享总线直接传送到合适的输出端口,而不需要路由选择处理机的干预。但是,由于总线是共享的,因此在同一时间只能有一个分组在总线上传送";纵横方式"它有 2N 条总线,可以使 N 个输入端口和 N 个输出端口相连接,这取决于相应的交叉节点是使水平总线和垂直总线接通还是断开","和前两种交换机制不同,这种纵横交换结构是一种无阻塞的交换结构,其特点是分组可以转发到任何一个输出端口,只要这个输出端口没有被别的分组占用"。
- 谢希仁《计算机网络》(第 8 版)3.4.1 使用集线器的以太网与3.4.2 以太网交换机:碰撞域的定义与"每一个端口和连接到端口的主机构成了一个碰撞域"的口径出自交换机一节。⚠️ 这句话的前提是端口下面挂着主机;交换机之间、交换机与路由器之间的全双工点对点链路两端可以同时发送,物理上不构成碰撞域,真题按后一种口径判分——cn-2020-35 就是这么判的,它的练习区与完整辨析都在交换机工作原理第七部分。
- 谢希仁《计算机网络》(第 8 版)4.3.3 使用二叉线索查找转发表,印刷版 p144–p145:
- 速率要求与朴素算法的代价在 p144——"例如,连接路由器的线路的速率为 10 Gbit/s,而分组的平均长度为 2000 bit,那么路由器就应当平均每秒钟能够处理 500 万个分组(常记为 5 Mpps)。或者说,路由器处理一个分组的平均时间只有 200 ns";"这种最简单的算法的明显缺点就是查找的次数太多。最坏的情况是转发表中没有这个路由。在这种情况下,算法仍要进行 32 次";同页并指出"在过去使用分类地址时,不存在最长前缀匹配的问题"。
- 二叉线索的构造规则与唯一前缀在 p144–p145——"通常是把无分类编址的转发表存放在一种层次的数据结构中,然后自上而下地按层次进行查找。这里最常用的就是二叉线索(binary trie)";"IP 地址中从左到右的比特值决定了从根节点逐层向下层延伸的路径,而二叉线索中的各个路径就代表转发表中存放的各个地址";"所谓唯一前缀就是在表中所有的 IP 地址中,该前缀是唯一的……在进行查找时,只要能够和唯一前缀相匹配就行了"。
- 查到叶节点后仍须做 AND 校验这一步在 p145——"要将二叉线索用于转发表中,还必须使二叉线索中的每一个叶节点包含所对应的网络前缀和子网掩码。当搜索到一个叶节点时,就必须将寻找匹配的目的地址和该叶节点的子网掩码进行按位 AND 运算,看结果是否与对应的网络前缀相匹配。若匹配,就按下一跳的接口转发该分组。否则,就丢弃该分组";"总之,二叉线索只是提供了一种可以快速在转发表中找到匹配的叶节点的机制"。压缩技术同页——"只要一个地址的前 4 位是 1011,就可以跳过前面 4 位(即压缩了 4 个层次)而直接从第 5 位开始比较"。
相关知识
网络层功能:路由、转发与异构网络互联|以太网交换机的自学习|路由算法:距离向量 vs 链路状态|IP 编址与子网划分|VLAN