计算机网络1-距离矢量路由算法模拟

距离矢量路由算法实验

一、实验要求

 计算机网络1-距离矢量路由算法模拟_第1张图片

 

网络拓扑图

 

实验过程描述

1、将上面的网络拓扑图保存待用

例如,可用二维数组保存,数组下标或索引可隐含表示网络节点。数组元素保存网络拓扑图边上的权值

2、为每个网络节点初始化并保存一张路由表

例如,可以用单链表表示一个网络节点的路由表,单链表的每个结点存储一个表项信息;表项信息是一个三元组(目的节点,下一跳,开销),可用结构体表示。结构体包括四个字段:目的节点,下一跳,开销,指向下一个结点的指针。以网络节点A为例,它的初始路由表仅包含两个表项,如下所示:

 

可将所有网络节点的路由表头指针保存在一个一维数组中,数组下标或索引可隐含表示网络节点。

3、给每个网络节点一次执行距离矢量路由更新的机会,可用一个循环达到此效果

例如,当A执行距离矢量路由更新时,它需要它的邻居B和G的路由表,这里可忽略B和G发送路由表的操作,直接使用即可。

A更新前的路由表不能丢弃,原因有二:一、需要与更新后的路由表比较,看是否有变化;二、在A的邻居节点执行距离矢量路由更新时,它使用的是A的旧表,尽管此方式并非实际所用,但我们要求采用此种方式模拟所有节点同时进行路由更新的效果。

距离矢量路由更新的过程见书。

需要记录这一次路由更新过程中,每个节点的路由表是否发生变化。可用一个布尔变量来标记,初始化这个布尔变量为“假”,若出现一个网络节点的路由表发生变化的情况就置为“真”。

4、若布尔变量为“真”,则累加一次更新记录,并重复开始步骤3;若为“假”,则所有节点的路由表稳定了,可以输出一个节点从初始到稳定的所有路由表数据以及更新次数。

 

二、实验分析与设计

1.用c语言来实现(结构化程序设计)

根据上述实验内容来做。一点一点实现即可。

2.实验中的注意点和难点。

    (1)注意内存回收,不要造成内存泄漏。即每一个malloc都要与一个free对应,申请的内存用完后要记得释放。

    (2)全局变量的使用要注意,因为程序中哪儿都可以修改全局变量的值。

    (3)要注意模块化,主函数要短小精悍,将每个功能都用一个函数实现。

三、实验源代码

 

/*距离矢量路由算法实验模拟 
输入:网络拓扑图,表示网络中结点之间的联系 
输出:一个节点(结点A)从初始到稳定的所有路由表数据以及更新次数。 
*/
#include
using namespace std;
#define N 8


struct Node
{
	int destination;
	int nextJump;
	int cost;
	struct Node* nextNode;
};
typedef Node* NodePtr;

int graph[N][N];			//保存网络拓扑图 
NodePtr routeHeaders[N]; 	//旧路由表  保存路由表头指针 
NodePtr newRouteHeaders[N];	//新的路由表
int gxcount = 0;			//更新次数 
bool isChange=false;		//更新一次后,路由表是否改变 

void InitGraph();			//初始化网络拓扑图 
void InitRouteTable();		//初始化路由表 
void ShowRouteTable(NodePtr head);		//打印某个结点的路由表 
NodePtr CopyRouteTable(NodePtr head);	//复制某个结点的路由表,返回头指针 
void DeleteRouteHeaders(NodePtr head);	//删除以head为头结点的路由表,该实验主要用来删除旧表 
void Update();				//进行更新,由旧表得到新表 



int main()
{
	InitGraph();
	InitRouteTable();
	
	while(1)
	{
		isChange = false;
		Update();
		ShowRouteTable(routeHeaders[0]);
		gxcount++;
		if(!isChange)	break;
		
	} 
	cout<<"更新次数为:"<
    cout<<"说明更新"<<(gxcount-1)<<"次后已经稳定"<0)
			{
				NodePtr newNode = (NodePtr)malloc(sizeof(Node)) ;
				newNode->destination = j;
				newNode->nextJump = j;
				newNode->cost = graph[i][j];
				newNode->nextNode = routeHeaders[i];
				routeHeaders[i] = newNode;
			}	
		}	
		
	}
} 

void ShowRouteTable(NodePtr head)
{
	NodePtr tmp=head;
	cout<<"目的网络"<<"\t"<<"距离"<<"\t"<<"下一跳"<destination+65)<<"\t\t"<cost<<"\t"<nextJump+65)<nextNode;
	}
}

NodePtr CopyRouteTable(NodePtr head)
{
	NodePtr newTable=NULL,tmp=head;
	while(tmp)
	{
		NodePtr t1 = (NodePtr)malloc(sizeof(Node));
		t1->destination = tmp->destination;
		t1->nextJump = tmp->nextJump;
		t1->cost = tmp->cost;
		
		t1->nextNode = newTable;
		newTable = t1;
		
		tmp = tmp->nextNode;
	}
	
	return newTable;
} 

//更新路由表 
void Update()
{
	 
	for(int i=0; i0)
			{
				//如果i与j相邻,则获取j的路由表并修改相应信息 
				NodePtr t = routeHeaders[j];
				NodePtr head = NULL;
				while(t) 
				{
					NodePtr np = (NodePtr)malloc(sizeof(Node));
					np->destination = t->destination;
					np->nextJump = j;			//下一跳为j 
					np->cost = t->cost+graph[i][j];		//代价要加一 
					np->nextNode = head;
					head = np;
					
					t = t->nextNode; 
				} 
				
				//根据获得的路由表去更新路由信息
				 
				NodePtr t2 = head;				//t2指向获取的路由表 
				while(t2)
				{
					NodePtr t1 = newTable;	//t1指向i的新路由表的表头 
					
					int destination  = t2->destination;
					while(t1 && (t1->destination!=destination) )	t1=t1->nextNode;
					if(t1==NULL)	
					{	
						//如果旧表中没有该目的网络destination,则把该项目添加到新路由表中
						if(t2->destination != i)	//并且目的网络不能是自己 
						{
							isChange=true;
							NodePtr n1 = (NodePtr)malloc(sizeof(Node));
							n1->destination = t2->destination;
							n1->nextJump = t2->nextJump;
							n1->cost = t2->cost;
						 
							n1->nextNode = newTable;
							newTable = n1;
						}
						
					}else{
						//旧表中有该目的网络destination
						if(t1->nextJump == j) //且下一跳地址是j,则把收到的项目更新到新路由表中 
						{
							if(	t1->cost !=  t2->cost)isChange=true;
							t1->cost =  t2->cost;
						} else{
							//若收到的项目中的距离小于原来的cost,则更新 
							if(t2->cost < t1->cost)
							{
								isChange=true;
								t1->cost = t2->cost;
								t1->nextJump = t2->nextJump;
							}	
							//否则什么也不做 
						}
					} 
					
					t2 = t2->nextNode;
				}				
			 	
			}
		}
		 
		newRouteHeaders[i] = newTable;	
	}
	
	
	for(int i=0; inextNode;
		while(t1)
		{
			free(t1);
			t1=t2;
			if(t2)	t2=t2->nextNode;
		}
		
}

 

 

 

 

 

四、实验运行结果

 

五、总结与体会

1.因为这学期来,实际写代码的时间比较少,都已经生疏了。所以这次实验自己做的并不顺利,中间停停写写好几次才做出来,甚至其中有过几次要放弃。所幸自己最后还是坚持下来并且做出来了。

2.自己在做的过程中,发现自己的基本码代码能力还是不够强,所以以后还是要多多练习。希望自己以后再看这些代码的时候,会认为这些代码很low,会将代码进行更多的改进。

3.通过此次实验,对距离矢量路由算法有了比较清楚的认识。所以说实践是学习知识的最好途径,以后要多动手做实验,以便于更好的理解理论。

 

你可能感兴趣的:(计算机网络)