计算机网络实验六-内部网关协议RIP

计算机网络实验六-内部网关协议RIP这里插入图片描述

RIP协议基于Bellham-Ford(距离向量)算法的路由选择协议,RIP协议是最大的优点是简单,它将“距离”定义为:从一路由器到非直接连接的网络的距离所经过的路由器数加1,路由器到直接交付的网络距离可定义为1或0都可。

RIP协议的“距离”也称跳数,每经过一个路由器,跳数就加1,RIP认为好的路由就是它经过的路由器的数目少。RIP允许一条路径最多只包含15个路由器,当跳数为16时即为不可达,因此RIP只适用于小型互联网。

RIP协议特点:
1.仅和相邻路由器交换信息
2.路由器交换的信息是当前本路由器所知道的所有信息,即当前自己的路由表
3.按照经过固定的时间间隔交换信息

一般情况下,RIP协议可以收敛,当所有的路由器都得到正确的路由选择信息,即不论交换多少次,所有路由器的路由表都不再变化,该自治系统收敛。

#include <iostream>
#define MAX 100
#define MAX_DIS 16
using namespace std;

// 路由表 
struct routertable{
	int prps_idx; // 目的网络 
	int dis; // 距离 
	int nextHop; // 下一跳路由器 
};

// 路由器 
struct router{
	int idx; // 序号
	routertable rt[MAX]; // 路由表 
	int len; // 目前的路由表长度 
};

// 邻近可达矩阵 
int s[6][6] = {{0,1,1,1},{1,0,0,1,0,1},{1,0,0,0,1},{1,1,0,0,0,1},{0,0,1,0,0,1},{0,1,0,1,1,0}};
// 图初始化数据 
int init[100][100] ={{1,1,0,2,1,0,3,1,0},{1,1,0,5,1,0},{3,1,0,4,1,0},{2,1,0,5,1,0},{4,1,0,6,1,0},{5,1,0,6,1,0}};
// 各路由器收敛速度 
int count[6];

// 交换函数,a收到b的路由表信息,更新a路由表 
int swap1(router* a, router* b, int& flag1) {
	int flag = 0;
	// 获取b路由表的长度 构造修改后的路由表cpb
	int blen = b->len;
	routertable* cpb = new routertable[blen];
	for(int i = 0; i < blen; i++) {
		cpb[i].prps_idx = b->rt[i].prps_idx;
		// 距离 + 1 
		cpb[i].dis = b->rt[i].dis + 1;
		// 下一跳全改成b路由表 
		cpb[i].nextHop = b->idx;
	} 
	// 获取a路由表长度,根据cpb更新a路由表 
	int alen = a->len;
	for(int i = 0; i < blen; i++) {
		int f = 1; 
		for(int j = 0; j < alen; j++){
			// 先判断是否存在该目的网络 不存在直接插入 
			if(a->rt[j].prps_idx == cpb[i].prps_idx) {
				f = 0;
				// 存在再判断下一跳是否相同 相同即更新 
				if(a->rt[j].nextHop == cpb[i].nextHop){
					if(a->rt[j].dis != cpb[i].dis) {
						flag1 = 1;
						flag = 1;
					}
					a->rt[j] = cpb[i];
				// 不同再判断距离,如果cpb小于a即更新
				} else if (cpb[i].dis < a->rt[j].dis) { 
					flag1 = 1;
					flag = 1; 
					a->rt[j] = cpb[i];
				}
			} 
		}
		if(f) { 
				flag1 = 1;
				flag = 1;
				a->rt[a->len++] = cpb[i]; 
			}
	} 
	return flag;
}

int main() {
	router* root = new router[6];
	// 初始化各个路由器的路由表 
	for(int i = 0; i < 6; i++){
		int j = 0;
		root[i].len = 0; 
		while(init[i][j] != 0) {
			int len = root[i].len;
			root[i].idx = i + 1;
			root[i].rt[len].prps_idx = init[i][j];
			root[i].rt[len].dis = init[i][j+1];
			root[i].rt[len].nextHop = init[i][j+2];
			root[i].len += 1;
			j += 3;
		}
	}
	// 输出各路由器初始路由表 
	for(int i = 0; i < 6; i++){
		cout << "路由器R" << i+1 << "的初始路由表:" << endl;
		cout << "目的网络" << "  " << "距离" << '\t' << "下一跳" << endl;
		int j = 0;
		while(j < root[i].len) {
			cout << root[i].rt[j].prps_idx << '\t'<<"  " << root[i].rt[j].dis << '\t' << root[i].rt[j].nextHop << endl;
			j++;
		}
	}
	// 每次让邻近路由器交换路由信息 
	// 终止条件为一个周期内没有路由表更新 一个周期为遍历一次s矩阵 
	int flag = 1;
	while(flag) {
		flag = 0;
		for(int i =0;i<6;i++){
			for(int j =0;j<6;j++){
				int flag1 = 0;
				if(s[i][j]) {
					flag = swap1(&root[i],&root[j], flag1);
					if (flag1) count[i]++;
				}
			}
		}
	}
	for(int i =0;i<6;i++){
		cout << "路由器R" << i+1 << "的最终路由表:" << endl;
		cout << "目的网络" << "  " << "距离" << '\t' << "下一跳" << endl;
		int j = 0;
		while(j < root[i].len) {
			cout << root[i].rt[j].prps_idx << '\t'<<"  " << root[i].rt[j].dis << '\t' << root[i].rt[j].nextHop << endl;
			j++;
		}
	}
	for(int i =0;i<6;i++){
		cout << "路由器R" << i+1 << "的收敛速度:";
		cout << count[i] << endl;
	}
	return 0;
} 
  • 19
    点赞
  • 55
    收藏
    觉得还不错? 一键收藏
  • 16
    评论
很抱歉,我并不是一个可以编写计算机网络实验代码的AI,但是我可以为您提供一些参考资料。下面是一个简单的C++实现RIP协议的例子,仅供参考: ```c++ #include<iostream> #include<conio.h> using namespace std; //定义结构体 struct node { int cost; int next_hop; }table[10][10]; int main() { int n; cout<<"请输入网络中路由器的数量:"; cin>>n; //初始化结构体数组 for(int i=0;i<n;i++) for(int j=0;j<n;j++) { table[i][j].cost=INT_MAX; table[i][j].next_hop=-1; } //手动输入路由器之间的距离 for(int i=0;i<n;i++) { for(int j=0;j<n;j++) { if(i==j) table[i][j].cost=0; else { int cost; cout<<"请输入"<<i+1<<"号路由器到"<<j+1<<"号路由器的距离:"; cin>>cost; table[i][j].cost=cost; table[i][j].next_hop=j; } } } //输出初始路由表 cout<<"\n初始路由表如下:\n"; for(int i=0;i<n;i++) { cout<<"路由器"<<i+1<<"的路由表如下:\n"; cout<<"目的节点\t距离\t下一跳\n"; for(int j=0;j<n;j++) { if(table[i][j].cost!=INT_MAX) cout<<j+1<<"\t\t"<<table[i][j].cost<<"\t\t"<<table[i][j].next_hop+1<<endl; } cout<<endl; } //开始更新路由表 bool flag=true; do { flag=true; for(int i=0;i<n;i++) { for(int j=0;j<n;j++) { for(int k=0;k<n;k++) { if(table[i][j].cost>table[i][k].cost+table[k][j].cost) { table[i][j].cost=table[i][k].cost+table[k][j].cost; table[i][j].next_hop=table[i][k].next_hop; flag=false; } } } } }while(!flag); //输出最终路由表 cout<<"\n最终路由表如下:\n"; for(int i=0;i<n;i++) { cout<<"路由器"<<i+1<<"的路由表如下:\n"; cout<<"目的节点\t距离\t下一跳\n"; for(int j=0;j<n;j++) { if(table[i][j].cost!=INT_MAX) cout<<j+1<<"\t\t"<<table[i][j].cost<<"\t\t"<<table[i][j].next_hop+1<<endl; } cout<<endl; } getch(); return 0; } ``` 这段代码实现了一个简单的RIP协议,通过手动输入路由器之间的距离,并通过更新路由表的方式来计算最短路径。请注意,这只是一个简单的参考,实际RIP协议的实现可能更加复杂。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值