网络如何找到下一跳?

从最初的邻居信息,到一次完整的数据传输。

路由算法Dijkstra · 链路状态

选择轮次

第 0 轮 · 开始状态

网络拓扑

5 台路由器 · 6 台终端等待学习
路由更新数据包故障链路点击路由器或链路,查看详情

路由表 · R1–R5

同一轮次,同时对比

初始只知道本机,直连设备尚未发现。

点击任意表中的目的地,可查看从该路由器出发的路径。

下一步:发现直连设备

先探测相邻路由器和本地终端,再开始交换链路通告。

让路由过程看得见

一张拓扑,三个问题:路由从哪里来,故障怎样传播,数据如何到达。

  1. 路由建立

    初始时每台路由器只知道本机,直连路由器和终端也尚未发现。点击轮次按钮可直接查看第 0、1、2、3 轮及收敛状态;第 0 轮仅知道本机,第 1 轮发现直连,后续轮次逐步建立远端路由。也可使用「下一轮」或「自动演示」。绿色小点代表控制报文;下方并排显示 R1–R5 的路由表,观察各表高亮的新记录。「自动演示」在收敛后暂停。

  2. 故障与重收敛

    进入本环节时已是收敛后的第 0 轮。关闭 R2 或点击「R1–R2 延迟增大」,第 1 轮检测变化并清除失效路径;随后按 Dijkstra 顺序逐步确认替代路径,再传播给更远的设备,逐步重新稳定。获知 R2 离线后,到 R2 的代价持续为 ∞,不能绕行连接到已离线设备。可随时回到“故障前”比较,点击「重新演示」恢复健康网络;收敛后 H1–H6 都仍然可以访问。按钮可再次点击恢复。延迟变化通过代价 1 → 8 表示,旅程中直接累加图中数字作为模拟耗时。点击任意链路可断开、恢复或调整代价;点击每张路由表表头的电源按钮可模拟对应设备故障或恢复。

  3. 数据包转发

    建议选择 H1 → H6。取消「自动转发」后逐跳观察;途中可以制造故障。数据包始终按照当前设备的路由表转发,无路由、链路中断或 TTL 耗尽都会丢包。旅程旁的总耗时直接相加当前路径上的链路数字,终端接入不另计。再次发送可以比较故障前后的路径和耗时。

Dijkstra 怎样建立路由表?

每台路由器先产生带序号的本地链路通告(LSA),通过邻居逐轮传播。收到的通告组成该设备自己的网络地图,再以自己为起点运行 Dijkstra:反复选出尚未确定的节点中距离最小的一个,更新它相邻节点的候选距离。计算过程单独展开为可回看的步骤,按距离从小到大确认需要更新的路径并写入路由表;同一网关下的终端随网关路径一起更新。“待计算”和“…”表示这条路径尚待确认,不等于故障不可达。

链路代价为正数,符合 Dijkstra 的非负权要求。发生故障时先更新本地通告,再传播给其他设备;每台设备根据自己收到的信息重新计算,不会在故障发生瞬间就知道全网变化。

教学模型的边界

这是链路状态与 Dijkstra 的教学模型,不是完整 OSPF 实现。轮次包含拓扑传播轮次和单独展开的 Dijkstra 计算步骤,两者分别标注,不对应真实协议定时器。02 的第 1 轮检测变化,后续逐步确认需要更新的路径,并向远端传播;不可达使用无穷大表示。第一轮的直连探测是教学抽象,不对应完整 ARP 或 Hello 握手。LSA 采用完整数据库逐轮交换,省略完整邻居握手、区域、可靠泛洪确认、LSA 老化以及协议报文编码。

五台路由器的表同时并排显示在拓扑下方,目的地仅显示 H、R 编号,不显示 IP。为便于教学,路由表只按终端 H 和路由器 R 分组显示,R 行表示到对应路由器的距离,H 行表示经终端网关到达该终端的路径。终端到网关的局域网开销不计入图中链路代价;本机代价记为 0。同一局域网内的终端直接交付,TTL 不变;图中省略了交换机,网关故障不等于 LAN 故障。图中连线与代价是为演示冗余路径补全的示例,并非对附件拓扑的精确复原。

快捷键:→ 下一轮,← 回退,空格 播放 / 暂停;数据包在单独的发送控件中逐跳操作。工具栏重建按钮保留当前拓扑并清空学到的路由;「重置实验」恢复全部默认设置。

协议参考:RFC 2328 · OSPF Version 2。