RIP四大计时器

RIP计时器(以下均以华为ensp中信息为参考)

希望有需要的小伙伴可以参考参考,如有误解、请指正!

一、实验原理

1.更新计时器(Update Timer

Update time(更新时间):指运行RIP协议的路由器向其连接口广播自己的路由信息的时间间隔(用于更新RIP路由表信息),控制RIP路由器发送更新消息的时间间隔,缺省时间为30秒,(实际上为25.5-30S间的随机数时间,这样是为了错峰发送更新,以防止所有路由器同时发送路由更新造成流量阻塞),启用了RIP的接口会发送自己的除了被水平分割抑制的路由选择表的完整副本给所有相邻的路由器。

2.无效计时器(Invalid timer

Age time(老化时间):指路由表中每条路由信息的存活时间,如果未在指定的时间内收到此路由条目的更新信息,那此路由条目就被判定为无效路由(路由不可达),缺省时间为180S

3.刷新计时器(Flush timer

Garbage-collect time(垃圾收集时间):指示RIP路由器在路由信息失效后彻底清除(删除)该路由信息之前的等待时间间隔,默认为120秒

注:刷新计时器比无效计时器时间短,这样配置的目的是为了更快地检测并刷新失效路由,以便及时更新路由表的路由信息,相当于直接跳过无效计时器,更快地更新路由表。

4.抑制计时器(Holddown Timer)——思科私有

路由器若在同一个接口上收到某条路由条目的度量值(跳数)比原来收到的度量值大,那么将启动一个抑制计时器,在抑制计时器的时间内该目的标记为不可达,直到计时器超时,路由器才可以接收有关此路由的更新信息。抑制计时器主要在RIP协议中用来防止路由环路,该计时器的原理是引用一个怀疑量,不管是真的还是假的路由消息,路由器先认为是假消息来避免路由环路。如果在抑制计时器超时后还接受该路由信息,那么这时路由器认为该消息是真的。

二、实验拓扑

三、实验详解

1.基础配置:

R1:

R2:

2.验证配置:

PS:由于此拓扑图两路由器为直连状态(priority = 0),RIP(priority = 100),R2学习到R1的路由信息是通过直连链路学习到的,所以此时查看RIP路由表是没有任何信息的。

3.查看RIP计时器信息:

4.修改计时器时间:

5.查看验证:

此时可以看到三个计时器已成功修改完毕,三克油!

  • 4
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
以下是一个简单的C++语言实现的RIP协议仿真器示例: ```c++ #include <iostream> #include <vector> #include <map> #include <queue> #include <climits> using namespace std; #define MAX_NODES 10 #define INFINITY INT_MAX typedef struct { int dest; int distance; } RoutingTableEntry; class Router { private: int id; map<int, int> neighbors; // neighbor id -> cost vector<RoutingTableEntry> routing_table; public: Router(int id) { this->id = id; for (int i = 0; i < MAX_NODES; i++) { routing_table.push_back({i, INFINITY}); } routing_table[id].distance = 0; } void add_neighbor(int neighbor_id, int cost) { neighbors[neighbor_id] = cost; routing_table[neighbor_id].distance = cost; } void send_routing_table(map<int, Router*>& routers) { for (auto& neighbor : neighbors) { int neighbor_id = neighbor.first; int cost = neighbor.second; vector<RoutingTableEntry> neighbor_routing_table = routers[neighbor_id]->get_routing_table(); for (auto& entry : neighbor_routing_table) { int dest = entry.dest; int distance = entry.distance + cost; if (routing_table[dest].distance > distance) { routing_table[dest].distance = distance; } } } } vector<RoutingTableEntry> get_routing_table() { return routing_table; } void print_routing_table() { cout << "Routing table for router " << id << ":" << endl; cout << "Destination\tDistance" << endl; for (auto& entry : routing_table) { if (entry.dest == id) { continue; } cout << entry.dest << "\t\t" << entry.distance << endl; } } }; void simulate(map<int, Router*>& routers) { int num_iterations = 0; while (true) { num_iterations++; for (auto& router : routers) { router.second->send_routing_table(routers); } bool converged = true; for (auto& router : routers) { vector<RoutingTableEntry> old_routing_table = router.second->get_routing_table(); router.second->send_routing_table(routers); vector<RoutingTableEntry> new_routing_table = router.second->get_routing_table(); if (old_routing_table != new_routing_table) { converged = false; } } if (converged) { break; } } cout << "Converged in " << num_iterations << " iterations." << endl; } int main() { map<int, Router*> routers; for (int i = 0; i < MAX_NODES; i++) { routers[i] = new Router(i); } int num_edges; cout << "Enter the number of edges: "; cin >> num_edges; for (int i = 0; i < num_edges; i++) { int u, v, w; cout << "Enter edge #" << i + 1 << " (u v w): "; cin >> u >> v >> w; routers[u]->add_neighbor(v, w); routers[v]->add_neighbor(u, w); } simulate(routers); for (auto& router : routers) { router.second->print_routing_table(); } return 0; } ``` 在该代码中,我们使用了一个 `Router` 类来表示每个节点,并使用邻接表来表示图。路由表使用了一个 `vector` 来存储每个目的地的距离。在仿真器中,我们通过 `map` 来存储每个节点,并使用 `simulate` 函数来模拟 RIP 协议的工作过程。在每个迭代中,我们首先让每个节点将自己的路由表发送给邻居节点,然后检查是否已经收敛。最后,我们打印出每个节点的路由表。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值