本文认知流

路由选择的基本原理:数据如何找到最优路径?
在上一部分,我们解决了网络层的第一个核心问题------统一全网寻址。
- IP地址让全球每台设备有了一个逻辑上唯一的"门牌号"。
- ARP协议负责在IP地址和MAC地址之间做翻译。
但有了地址还不够。从源主机到目的主机,中间可能隔着几十个路由器,每个路由器有多个出口。数据报到底该走哪条路?
这就是网络层的第二个核心任务:路由选择。
🤔模型:数据如何从A到B?
在深入技术细节之前,先建立一张直觉模型。
想一下你要从北京寄一个快递到上海的一个小区。整个过程分为三段:
- 第一段(出发):你下楼,把包裹交给小区门口的菜鸟驿站。你不需要知道包裹接下来怎么走,你只需要知道"交给驿站就行"。
- 第二段(中转) :驿站把包裹送到北京分拣中心,分拣中心查表决定发往上海分拣中心。上海分拣中心再查表,决定发往哪个区的配送站。每一个中转节点只负责把包裹送到离目的地更近的下一站。
- 第三段(到达):最后一个配送站的快递员,直接骑车把包裹送到收件人手上。
数据从A到B的旅程,和这个快递模型几乎一模一样:
| 快递模型 | 网络模型 |
|---|---|
| 寄件人 | 源主机 |
| 收件人地址 | 目的IP地址 |
| 小区菜鸟驿站 | 默认网关(源主机的出口路由器) |
| 分拣中心 | 中间路由器 |
| 查表决定下一个分拣中心 | 路由器查转发表,决定下一跳 |
| 最后一个配送站 | 目标网络的路由器 |
| 快递员直接送货上门 | 最后一跳直接用MAC地址通信 |
| 包裹始终不变 | IP数据报始终不变(源IP和目的IP不变) |
💡关键点:
- 整个过程中,包裹上的收件人地址(IP地址)从头到尾不变。
- 每一段运输的卡车车牌号(MAC地址)在变,但包裹本身不变。
- 每个分拣中心只做一件事------根据收件人地址,决定下一站往哪送。
- 这就是路由选择的本质。
分组转发 vs 路由选择
在讲具体的路由技术之前,必须区分两个容易被混淆的概念。
| 对比方面 | 路由选择 | 分组转发 |
|---|---|---|
| 是什么 | 确定数据报从源到目的经过的路径 | 路由器收到数据报,查表,从某个接口转发出去 |
| 作用范围 | 全局------全网路由器协同计算 | 局部------单个路由器的一次操作 |
| 时间 | 秒到分钟级 | 纳秒到微秒级 |
| 实现方式 | 软件(路由协议计算) | 硬件(转发表查找) |
| 比喻 | 出发前用导航软件规划整条路线 | 在每个路口,看路牌决定往哪拐 |
两者是 规划 和 执行 的关系:
-
没有路由选择,转发表就是空的,分组转发无从进行。
-
没有分组转发,路由选择算出来的路径永远不会被用到。
💡栗子:你开车从北京到上海。出发前,你打开高德地图规划路线------这是路由选择。在每一个高速路口,你看路牌决定往哪个方向拐------这是分组转发。整条路线是高德算出来的,但你开车的时候不需要每次都重新规划,你只需要在分岔路口看路牌就行。
直连路由 vs 非直连路由
理解了基本概念之后,我们从最简单的场景开始。
场景一:目标就在同一个网络里------直连路由。
- 你的电脑(192.168.1.10/24)想给隔壁同事的电脑(192.168.1.20/24)发文件。
- 两台电脑连在同一个交换机上,属于同一个网络。
- 你的电脑用子网掩码一算:目标IP和自己属于同一个网络。
- 这种情况下,不需要路由器介入。
- 你的电脑直接通过ARP获取对方的MAC地址,封装成帧,从交换机转发过去。
- 这就是直连路由------目标网络就是自己所在的网络,路由器上对应的接口直接连在这个网络上。
场景二:目标在另一个网络------非直连路由。
- 你的电脑(192.168.1.10/24)想访问百度服务器(假设IP是110.242.68.66)。
- 用子网掩码一算,目标IP和自己不在同一个网络。
- 你的电脑没办法直接找到百度。
- 这时候,你只能把数据报交给"默认网关"------也就是你家里的路由器。
- 路由器收到后,查表,看看自己知不知道怎么去百度。
- 如果知道,就转发。
- 如果不知道,就把数据报交给自己的默认网关(运营商的上级路由器)。
- 就这样一跳一跳,直到到达目标网络。
- 这就是非直连路由------目标网络不在路由器直连的范围内,需要通过其他路由器中转。
动态路由协议 --- 让路由器自动学习
静态路由 vs 动态路由

非直连路由需要路由器知道"往哪走"。--> so 路由器的"地图"从哪来?
第一种方案:管理员手动配置------静态路由。

- 网络管理员登录路由器,手写命令:
- "去往网络192.168.2.0/24,下一跳是10.0.0.2"、
- "去往网络192.168.3.0/24,下一跳是10.0.0.3"。
- 管理员把网络中所有非直连网络的路径都配好。
- 对于小网络,静态路由完全够用------三台路由器,五个网络,手动配置十分钟就搞定。
但当网络扩展到几百台路由器、几千个网络时,管理员手动维护路由表变成了极其痛苦的事。
更坏的是,静态路由无法自动适应网络拓扑的变化------某条链路断了,数据报走到故障点才发现走不通,管理员必须手动登录每台受影响的路由器更新配置。
在此期间,所有经过这条链路的数据报全部丢失。
🎯 静态路由的根本矛盾:管理员手动配置的静态路径 vs 网络拓扑的动态变化。
网络需要一种更智能的方案:让路由器自己交换信息,自动学习全网拓扑。 这就是动态路由的引出发点。
第二种方案:让路由器自动学习------动态路由。
动态路由的核心思想很简单 :
路由器之间通过路由协议互相告知自己知道的信息,每台路由器根据收集到的信息独立计算最优路径,当网络拓扑发生变化时自动更新计算。
💡比喻:
1.静态路由 = 你拿着一本几年前出版的纸质地图开车,路改了、桥断了,地图上不会更新,你走到跟前才发现走不通。
2.动态路由 = 你开着实时联网的导航软件,每个司机都在实时上报路况,导航根据最新信息动态调整路线。哪条路堵了,导航自动给你换一条。
为什么需要动态路由?
上面的比喻已经回答了这个问题,但在工程层面值得说得更具体。
动态路由解决的是静态路由的三个致命缺陷:
第一,配置复杂度。 一个中型企业网络可能有上百台路由器、上千个网络。管理员不可能逐台手动配置每一条路由。动态路由只需要在每台路由器上启动路由协议,路由器自己会学习。
第二,故障恢复能力。 链路断了、设备故障了、新网络接入了------这些变化在静态路由下需要人工干预。动态路由可以在几秒到几分钟内自动发现变化并重新计算路径。
第三,环路避免。 静态路由如果配置错误,很容易形成路由环路------数据报在两个路由器之间来回转发,直到TTL耗尽。动态路由协议内置了环路避免机制。
自治系统AS:分层次管理互联网

理解了为什么需要动态路由之后,下一个问题是:全球互联网有几百万台路由器,它们都运行同一个路由协议、都在同一个"池子"里交换信息吗?
- 当然不可能。
- 所有路由器都在一个池子里交换路由信息,网络的任何一点变化都会触发全网范围的重计算。
- 路由表会大到无法存储和查找,不同组织(电信、联通、移动、谷歌、亚马逊)之间的路由策略需要彼此协商,但它们的管理员不可能坐下来一起开会。
💡互联网的解决方案是分层管理------引入自治系统。
- 自治系统(AS)是一组 在单一管理控制下的路由器集合。
- 属于同一个AS的路由器运行相同的内部路由策略,每个AS有一个唯一的编号(ASN)。
引入AS之后,路由协议被分成了两类:
- 内部网关协议(IGP):在同一个AS内部运行的路由协议,比如RIP和OSPF。它们只关心自己这个AS内部的网络拓扑,只在本AS内部交换路由信息。
- 外部网关协议(EGP):在不同AS之间交换路由信息,代表是BGP。它负责告诉其他AS"我这个AS有哪些网络可达"。
这种分层设计的妙处:
- 一个AS内部发生拓扑变化(某条链路断了),只会影响这个AS内的路由计算,不会波及全球。
- 不同AS之间通过BGP交换"汇总"后的路由信息,而不是每一个内部网络的详细信息。这和IP地址的CIDR路由聚合是同一个设计哲学------用层级结构控制复杂度。
内部网关协议:RIP → OSPF
内部网关协议的目标是让同一个AS内部的所有路由器都能准确知道"去往这个AS内部的任意一个网络,应该怎么走"。
第一代:RIP(路由信息协议)

RIP的设计非常简洁,核心规则只有一条:
- 每隔30秒,每台路由器把自己的整张路由表广播给所有邻居。
- 邻居收到后,用 距离向量 算法更新自己的路由表 --- 一条路由的 距离 就是到达目标网络需要的跳数。
- 如果一个目标网络在邻居的路由表里距邻居2跳,那么距我就是3跳。
RIP的工作过程:

RIP简单到可以在几百行代码里实现。

但它的局限也很致命:
- 最大跳数只有15跳,超过15跳的网络被认为不可达;
- 每隔30秒广播整张路由表,带宽开销大;
- 网络拓扑变化时,更新从一个路由器传到另一个路由器,收敛可能需要几分钟。
- 在这几分钟内,部分路由器的路由表是过时的,可能产生路由环路。
RIP的痛点引出了第二代协议。
第二代:OSPF(开放最短路径优先)
OSPF用完全不同的思路解决了RIP的问题。
它的核心规则是:每台路由器向全网广播自己知道的所有邻居信息,然后每台路由器独立用Dijkstra算法计算最短路径树。
- RIP是"传信使告诉你去某个城市有多少站路",每台路由器只从邻居那里听说转发。
- OSPF是"每个城市都知道整个国家的完整路网图,然后自己独立规划最优路线"。
工作过程:

OSPF相比RIP有这些关键改进:
- 没有15跳限制,支持大型网络;
- 每台路由器掌握全网拓扑,路径计算更准确;
- 引入"区域"概念,把大型AS划分成多个区域,区域内部详细交换路由信息,区域之间只交换汇总信息,进一步减少路由表大小和计算开销;
- 收敛速度更快,拓扑变化后能在几秒内完成重计算。

第三代:IS-IS
- IS-IS和OSPF一样是链路状态协议,核心算法几乎相同。
- 主要区别在于OSPF是IETF为IP网络设计的,IS-IS最初是OSI协议栈的一部分,后来被扩展支持IP。
- IS-IS在运营商网络中更常见,OSPF在企业网络中更常见。
- 作为学习者,理解OSPF就掌握了链路状态协议的核心思想,没有必要深究IS-IS的细节。
外部网关协议:BGP
OSPF解决了AS内部的路由问题,🤔但不同AS之间的路由信息怎么交换?
这就是BGP要做的事。BGP是互联网的"骨干路由协议",运行在AS之间的边界路由器上。
- BGP和OSPF有本质的不同。
- OSPF只需要考虑纯技术因素------路径的带宽、延迟、跳数。
- 但BGP交换的是不同运营商之间的路由信息,每条路径背后都有商业利益。
- 中国电信和中国联通之间的路径选择,不只取决于跳数,还取决于两家公司之间的结算协议。
- 一个AS可能拒绝转发来自某个特定AS的流量,即使技术上是可行的;也可能优先选择费用更低的路径,即使它不是跳数最短的。
BGP的路由决策也因此比OSPF复杂得多。它不只看单一的度量值,而是综合多种属性做决策,包括路径经过的AS列表、本地优先级、MED值、路径来源等。管理员可以配置路由策略来影响决策------"优先走这条路径,除非它断了"、"不要接受来自某个AS的路由通告"。
🤔为什么BGP如此重要? 因为整个互联网的互联互通就靠BGP。
1.每当一个AS发生路由变化,BGP会把更新传播给它的邻居AS,邻居再传播给邻居的邻居。
2.如果BGP出了问题,某个AS的全部网络就可能在全球互联网上"消失"------别的AS不知道该往哪走才能到达你。
路由器的基本工作原理
前面讲的是路由器之间怎么交换信息,最后我们来看路由器内部是怎么实现这些功能的。

控制平面:路由器如何学习路由
控制平面运行的是路由协议(RIP、OSPF、BGP等),负责构建路由表。它的工作节奏是"慢"的------秒到分钟级别,因为路由变化不会每微秒都发生。
控制平面做了三件事:和邻居交换路由信息,根据收集的信息计算最优路径,把最优路径填入路由表。它像一个地图制作团队,不断更新地图。
数据平面:路由器如何转发数据包
数据平面处理的是实际到来的数据报,负责查表转发。它的工作节奏必须是"快"的------纳秒到微秒级别,因为每秒钟可能有数百万个数据报需要处理。
当数据平面收到一个数据报,它只做三件事:检查目的IP地址,在转发表中查找匹配的条目(用最长前缀匹配),从匹配条目指定的接口发出去。它像一个路口的交警,只看目的地,然后快速放行,并不关心整条路线的规划问题。
控制平面构建地图,数据平面按图指引。这种分工让路由器既能适应网络变化(控制平面的动态更新),又能保证转发速度(数据平面的硬件高效处理)。这就是路由器设计的核心智慧。
📌 小结:这一部分我们梳理了路由技术从简单到复杂的完整演进链。路由器和人类找路没什么两样------要么看地图(静态路由),要么问路(动态路由)。互联网太大了,所有路由器一起问路不现实,所以分了自治系统(AS)------内部用OSPF快速摸清家底,外部用BGP在不同运营商之间协商路径。最终,每台路由器内部都有两条流水线:控制平面负责学习路由,数据平面负责快速转发。
感谢你的阅读,祝你有开心的一天!