题目:
某网络中的路由器运行OSPF路由协议,题42表是路由器R1维护的主要链路状态信息(LSI),题42图是根据题42表及R1的接口名构造出来的网络拓扑。
请回答下列问题。
1)本题中的网络可抽象为数据结构中的哪种逻辑结构?
2)针对题42表中的内容,设计合理的链式存储结构,以保存题42表中的链路状态信
息(LSI)。要求给出链式存储结构的数据类型定义,并画出对应题42表的链式存储
结构示意图(示意图中可仅以ID标识结点)
3)按照迪杰斯特拉(Diikstra)算法的策
略,依次给出R1到达题42图中子网
192.1.x.x的最短路径及费用。
答案:
问题 1:网络抽象为数据结构中的哪种逻辑结构?
- 答:无向图(Undirected Graph)。
- 理由:题目中的网络可以抽象为一个无向图,其中:
- 顶点(Vertex):每个路由器(如 R1, R2, R3, R4)代表一个顶点。
- 边(Edge):路由器之间的链路代表图中的边,边的权重是链路的代价(Metric)。
无向图适合描述这种具有对称连接的网络拓扑结构。
问题 2:设计链式存储结构来保存链路状态信息(LSI)
根据题目42表中的链路状态信息(LSI),我们可以设计一个链式存储结构来保存这些信息。具体的数据结构及对应的示意图如下:
2.1 数据类型定义
基于图中的信息,定义合理的数据结构如下:
// 链路信息节点结构体 typedef struct { unsigned int ID; // 路由器ID unsigned int IP; // 路由器IP } LinkNode; // 网络信息节点结构体 typedef struct { unsigned int Prefix; // 网络前缀 unsigned int Mask; // 子网掩码 } NetNode; // 弧节点结构体 typedef struct ArcNode { int Flag; // 标志位:1表示Link信息,2表示Net信息 union { LinkNode Lnode; // 链路信息 NetNode Nnode; // 网络信息 } LinkORNet; unsigned int Metric; // 链路的代价 struct ArcNode *next; // 指向下一个弧节点的指针 } ArcNode; // 表头节点结构体 typedef struct HNode { unsigned int RouterID; // 路由器ID ArcNode *LN_link; // 指向弧节点的指针 struct HNode *next; // 指向下一个表头节点的指针 } HNode;
- LinkNode 和 NetNode 分别用于存储链路和网络信息。
- ArcNode 用于描述路由器的链路或网络状态,包含一个标志位
Flag
来区分存储的是链路信息还是网络信息。- HNode 表头节点表示一个路由器,包含
RouterID
以及指向链表中第一个弧节点的指针LN_link
。2.2 链式存储结构示意图
根据链式存储结构定义,可以绘制一个简化示意图来展示链路状态信息的存储。图示如下:
HNode (R1) -> ArcNode (Link1, Metric: 3) -> ArcNode (Link2, Metric: 4) -> NULL -> ArcNode (Net1, Prefix: 192.1.1.0, Metric: 1) -> NULL HNode (R2) -> ...
每个路由器
HNode
都通过链表指向相应的ArcNode
,每个弧节点包含链路或网络信息,以及链路的代价(Metric)。
问题 3:使用 Dijkstra 算法计算最短路径及费用
知识点:
1. 网络协议与网络拓扑
OSPF(Open Shortest Path First)协议:
- 题目中提到的网络运行 OSPF 协议,这是一种常见的内部网关协议(IGP),用于根据网络中的链路状态信息计算最短路径。
- OSPF 协议的核心机制是链路状态广告(LSA),其中路由器向网络中的其他节点广播其链路信息,从而形成完整的网络拓扑图。
网络拓扑结构:
- 本题给出的网络图描述了路由器之间的连接关系。网络拓扑可以用**无向图(Undirected Graph)**来表示,图中的节点代表路由器,边代表链路,边的权重则是链路的代价(Metric)。
2. 数据结构
图结构:
- 在本题中,网络被抽象为一个无向图,其中路由器是图的顶点,链路是边,边的权重表示路径的代价。
- 图结构适合描述复杂的网络拓扑和节点间的连接关系。
链式存储结构:
- 题目要求设计一种链式存储结构以存储链路状态信息。为了实现这种链式存储,通常使用链表或者邻接表来表示图的数据结构。
- 在设计中引入了表头节点和弧节点,分别用于存储路由器信息和链路状态信息(如链路ID、IP、代价等)。
- 结构体的使用:链式存储结构中通过 C 语言的结构体来定义路由器和链路信息,这有助于以动态方式保存网络拓扑和链路状态。
3. Dijkstra 算法
- Dijkstra 算法:
- Dijkstra 算法是一种用于计算加权图中单源最短路径的算法,广泛应用于路由协议(如 OSPF)中,帮助找到从源路由器到其他路由器的最短路径。
- 该算法的步骤包括初始化源节点距离为0,其他节点距离为无穷大,随后逐步选择未访问节点中距离最短的节点来更新邻居节点的最短路径。
- 本题要求根据 Dijkstra 算法计算从 R1 到其他网络的最短路径和代价,这体现了算法在路由协议中的实际应用。
4. 链路状态信息(Link State Information)
- 链路状态信息:
- 每个路由器维护的链路状态信息(LSI)包含到其他节点的链路信息(如链路代价、目标路由器的 IP 地址等),这些信息用于构建整个网络的拓扑图。
- LSI 的存储可以使用链式存储结构,其中每个节点存储其直接连接的链路信息,并通过指针将这些信息链接起来,以便于动态添加和删除链路。
5. 图的邻接表表示
- 邻接表(Adjacency List):
- 链式存储结构类似于图的邻接表,用于存储每个节点的邻接节点。
- 在本题的设计中,每个路由器(顶点)作为一个表头节点,通过链表链接到其直接相连的链路或网络信息节点(弧节点),这种结构可以有效地存储网络的拓扑信息。
6. 网络路径选择与最短路径计算
- 路径选择:
- 本题中的目标是找出从源路由器 R1 到各个子网(192.1.x.x)的最短路径。路径选择的核心是比较不同路径的代价并选择代价最小的路径。
- 最短路径树(Shortest Path Tree, SPT):使用 Dijkstra 算法计算得到的结果是一棵从源节点出发的最短路径树,展示了从源节点到其他节点的最优路径。
7. 综合应用题的考察点
- 综合应用题:
- 本题不仅涉及到网络路由协议和图论的基本概念,还考察了数据结构设计、链式存储、图的表示、以及最短路径算法的实现,是一个综合性的知识点应用。
- 学生需要具备扎实的基础知识,包括图的存储和操作、Dijkstra 算法的实现步骤、链式数据结构的设计等。