距离向量算法更新路由表3
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
四.程序编写
#include <stdio.h>
#include <stdlib.h>
#define ROUTNUM 7/*定义七个路由器*/
typedef struct/*定义结构*/
{
int dis;/*定义一个整型变量*/
int from;
}RoutNode;
RoutNode data[ROUTNUM][ROUTNUM]; /*路由表*/
if (c==',') /*读完一个数字*/
{
num[i] = '\0';
data[m][n].dis = atoi(num);
data[m][n].from = -1;
i = 0;
break;
}
else if ((c>='0' && c<='9') || c=='-') /*如果读到数字或符号*/
3.能够用距离向量算法建立一个路由表并根据相邻路由器发来的数据进行更新。
5.所实现的路由器模拟Internet上的IP路由器,它能确定网络的最短路由,并在其上传输分组
二.原理概述
距离向量路由算法被距离向量协议作为一个算法,它告诉在网络中每个节点的最远和最近距离。在距离表中的这个信息是根据临近接点信息的改变而时时更新的。表中数据的量和在网络中的所有的接点是等同的。每个数据包括传送数据包到每个在网上的目的地的路径和距离/或时间在那个路径上来传输。
4.返回。
三.设计方案
路由表的建立和更新
假设建立七个路由器,其中三个A,B和C。路由器A的两个网络接口E0和S0
分别连接在10.1.0.0和10.2.0.0网段上;路由器B的两个网络接口S0和S1
分别连接在10.2.0.0和10.3.0.0网段上;路由器C的两个网络接口S0和E0
分别连接在10.3.0.0和10.4.0.0网段上;
若原来路由表中没有目的网络N,则把该项目添加到路由表中。
否则若吓一跳地址是X,把收到的项目替还原路由表中的项目
否则若收到的项目中的距离d小于路由表中的距离,则进行更新。
否则什么也不做。
3.若三分钟还没有收到相邻路由器的更新路由表,则把此相邻路由器记为不可达的路由器,即把距离置为16.(本实验将其定义为6)
如上面各路由表的前两行所示,通过路由表的网络接口到与之直接相连的网
络的网络连接,其向量距离设置为0。这即是最初的路由表。
当路由器B和A以及B和C之间相互交换路由信息后,它们会更新各自的路由表。
比如,路由器B根据网络端口S1收到路由器C的路由信息(10.3.0.0,S0,0)和(10.4.0.0,E0,0)后,在自己的路由表中增加一条(10.4.0.0,S1,1)路由信息。该信息表示:通过路由器B的网络接口S1可以访问到10.4.0.0网段,其向量距离为1,该向量距离是在路由器C的基础上加1获得的。
{
if (data[recv][i].dis < 0) /*如果recv到i号节点无路径*/
{
data[recv][i].dis = data[send][i].dis + data[recv][send].dis;
data[recv][i].from = send;
}
else if (data[recv][i].dis > data[send][i].dis + data[recv][send].dis) /*如果现有路径比新路径远*/
{
data[recv][i].dis = data[send][i].dis + data[recv][send].dis;
data[recv][i].from = send;
}
}
}
}
void Exchange()
{
int i,j;
for (i=0; i<ROUTNUM; i++)
{ for (j=0; j<ROUTNUM; j++)
这个表中的列代表直接和它相连的“邻居”路由器相连,行代表在网络中的所有目的地。在距离向量路由算法中,相邻路由器之间周期性(一般为3分钟)地相互交换各自的路由表。当网络拓扑结构发生变化时,路由器之间也将及时地相互通知有关变更信息。
它是一种动态路由选择算法。每个路由器都定期与其相邻的所有路由器交换路由表,据此更新它们自己的路由表。
if (data[start][end].dis < 0)
{
printf("No routine find!\n");
return;
}
printf("%c->", cur+65);
while (data[cur][end].from >= 0)
{
total += data[cur][data[cur][end].from].dis;
通信07级2班
论文题目
距离向量算法更新路由表
指导教师评语及意见:
指导教师评阅成绩:指导教师签字
年 月 日
return;
}
else
InitData(pfile);
fclose(pfile);
printf("\nInitial State:\n");
OutputRoutData();
for (i=0; i<ROUTNUM; i++)
{
Exchange();/*小于大的距离,路由更新*/
}
printf("\nState Exchanged:\n");
计算机网络实习报告
论 文 题 目距离向量算法更新路由表
学生专业班级通信07级2班
学生姓名(学号)
指 导 教 师
完 成 时 间2010年05月22日
实 习(设计)地点信Leabharlann Baidu楼139(112)机房
2010年05月22日
距离向量算法更新路由表
一.实验目的
1.认识并掌握路由器结构组成及路由建立与更新的原理
2.理解、掌握和利用距离向量算法的应用。
首先,对我以前做题做事非常马虎的毛病有了很大的改进,通过在这5天编程的过程中的锻炼,我现在做题比以前仔细多了,会小心翼翼地去看每一个地方,会仔细地检查程序的每一个字母、标点。
其次,在5天编程的过程当中弥补了我许多知识上的缺陷,弄清楚了我不懂的地方和似是而非的地方,使我及时补上了欠缺。
再次,通过5天综合实训编程使我的知识形成了一个完整的框架结构,而不再是零散的知识个体,使我在使用时更加的方便。
同样道理,路由器B还会产生一条(10.1.0.0,S0,1)路由,这条路由是通过网络端口S0从路由器A获得的。如此反复,直到最终收敛,形成图中所示的路由表。
概括地说,距离向量算法要求每一个路由器把它的整个路由表发送给与它直接连接的其它路由器。路由表中的每一条记录都包括目标逻辑地址、相应的网络接口和该条路由的向量距离。当一个路由器从它的相邻处收到更新信息时,它会将更新信息与本身的路由表相比较。如果该路由器比较出一条新路由或是找到一条比当前路由更好的路由时,它会对路由表进行更新:将从该路由器到邻居之间的向量距离与更新信息中的向量距离相加作为新路由的向量距离。
{
printf("%d ", i);
for (j=0; j<ROUTNUM; j++)
{
if (data[i][j].dis < 0) /*如果无路径*/
printf("- ");
else
printf("%-5d", data[i][j].dis);
if (data[i][j].from < 0) /*如果未经过其它节点*/
所有路由器只与其相邻路由器交换信息,在发来为RIP报文情况下更新其路由表的具体步骤为:
1.对地址为X的相邻路由器发来的RIP报文,先修改报文中的所有项目,把“下跳”字段中地址均改为X,把所有“距离”字段的值加1.每一个项目都有三项数据,即:到目的网络N,距离是d,下一条路由器是X
2.对修改后的RIP报文中每个项目,进行以下步骤:
OutputRoutData();
printf("input the start node(%d-%d) : ", 0, ROUTNUM-1);
scanf("%d", &start);
printf("input the end node(%d-%d) : ", 0, ROUTNUM-1);
scanf("%d", &end);
printf("- ");
else
printf("%c ", data[i][j].from+65);
}
printf("\n");
}
}
void Communication(int recv, int send)
{int i;
for (i=0; i<ROUTNUM; i++)
{
if (data[send][i].dis > 0) /*如果send节点到i号节点有路线*/
void InitData(FILE* pfile); /*从数据文件读取数据,初始化路由表*/
void OutputRoutData(); /*输出所有的路由表*/
void Communication(int recv, int send); /*send点向recv点发送自己的路由表*/
void Exchange(); /*所有节点进行一次数据交换,更新路由表*/
void main()/*main函数,程序入口*/
{
int start,end;
int i;
FILE *pfile;
pfile = fopen("data.txt", "r");/*打开数据文件data*/
if (pfile == NULL)/*文件data为空,显示错误*/
{
printf("data file failed to open, press any key to quit.\n");
{
num[i++] = c;
}
}
}
}
}
void OutputRoutData()
{
int i,j;
printf(" ");
for(i=0; i<ROUTNUM; i++)/*读取路由距离*/
{
printf("< %d >", i);
}
printf("\n");
for (i=0; i<ROUTNUM; i++)
{
char num[10];
int i=0;
char c;
int m,n;
fseek(pfile, 0, 0);
for (m=0; !feof(pfile)&&m<7; m++)
{
for (n=0; !feof(pfile)&&n<7; n++)
{
while (!feof(pfile))
{
c = fgetc(pfile);
第四,在5天的实习结束后,我对做完的习题检查比再是一切的走马观花,而是仔细核对、认真检查。
第五,通过5天的实习改变了我做题时心烦气燥的习惯,现在做题可以平和静气的完成。
第六,通过5天的实习我的自制能力更强了,基本完全可以控制自己,避免外界的干扰,安心地完成自己的工作。
实 习成绩评定表
学生姓名
专业班级
printf("%c->",data[cur][end].from+65);
cur = data[cur][end].from;
}
total += data[cur][end].dis;
printf("%c\ntotal distance=%d", end+65, total);
return;
}
}
void InitData(FILE* pfile)
if (start==end || start<0 || start>6 || end<0 || end>6)
{
printf("\nwrong input, press any key to quit.\n");/*设定距离大于6为错误*/
return;
}
else
{
int cur = start;
int total = 0;
{if (data[i][j].dis > 0) /*如果两个节点之间有路径*/
{Communication(j,i); /*将i号节点的路由表发送给j号节点*/
}
}
}
}
五.运行结果
六.实习心得和体会
历时7天的《C语言程序设计》已经结束了,在这5天编程的过程中感触颇多,实训编程的同时暴露出了许多我自身存在的问题,同时也对自身有了很大的提高。
#include <stdio.h>
#include <stdlib.h>
#define ROUTNUM 7/*定义七个路由器*/
typedef struct/*定义结构*/
{
int dis;/*定义一个整型变量*/
int from;
}RoutNode;
RoutNode data[ROUTNUM][ROUTNUM]; /*路由表*/
if (c==',') /*读完一个数字*/
{
num[i] = '\0';
data[m][n].dis = atoi(num);
data[m][n].from = -1;
i = 0;
break;
}
else if ((c>='0' && c<='9') || c=='-') /*如果读到数字或符号*/
3.能够用距离向量算法建立一个路由表并根据相邻路由器发来的数据进行更新。
5.所实现的路由器模拟Internet上的IP路由器,它能确定网络的最短路由,并在其上传输分组
二.原理概述
距离向量路由算法被距离向量协议作为一个算法,它告诉在网络中每个节点的最远和最近距离。在距离表中的这个信息是根据临近接点信息的改变而时时更新的。表中数据的量和在网络中的所有的接点是等同的。每个数据包括传送数据包到每个在网上的目的地的路径和距离/或时间在那个路径上来传输。
4.返回。
三.设计方案
路由表的建立和更新
假设建立七个路由器,其中三个A,B和C。路由器A的两个网络接口E0和S0
分别连接在10.1.0.0和10.2.0.0网段上;路由器B的两个网络接口S0和S1
分别连接在10.2.0.0和10.3.0.0网段上;路由器C的两个网络接口S0和E0
分别连接在10.3.0.0和10.4.0.0网段上;
若原来路由表中没有目的网络N,则把该项目添加到路由表中。
否则若吓一跳地址是X,把收到的项目替还原路由表中的项目
否则若收到的项目中的距离d小于路由表中的距离,则进行更新。
否则什么也不做。
3.若三分钟还没有收到相邻路由器的更新路由表,则把此相邻路由器记为不可达的路由器,即把距离置为16.(本实验将其定义为6)
如上面各路由表的前两行所示,通过路由表的网络接口到与之直接相连的网
络的网络连接,其向量距离设置为0。这即是最初的路由表。
当路由器B和A以及B和C之间相互交换路由信息后,它们会更新各自的路由表。
比如,路由器B根据网络端口S1收到路由器C的路由信息(10.3.0.0,S0,0)和(10.4.0.0,E0,0)后,在自己的路由表中增加一条(10.4.0.0,S1,1)路由信息。该信息表示:通过路由器B的网络接口S1可以访问到10.4.0.0网段,其向量距离为1,该向量距离是在路由器C的基础上加1获得的。
{
if (data[recv][i].dis < 0) /*如果recv到i号节点无路径*/
{
data[recv][i].dis = data[send][i].dis + data[recv][send].dis;
data[recv][i].from = send;
}
else if (data[recv][i].dis > data[send][i].dis + data[recv][send].dis) /*如果现有路径比新路径远*/
{
data[recv][i].dis = data[send][i].dis + data[recv][send].dis;
data[recv][i].from = send;
}
}
}
}
void Exchange()
{
int i,j;
for (i=0; i<ROUTNUM; i++)
{ for (j=0; j<ROUTNUM; j++)
这个表中的列代表直接和它相连的“邻居”路由器相连,行代表在网络中的所有目的地。在距离向量路由算法中,相邻路由器之间周期性(一般为3分钟)地相互交换各自的路由表。当网络拓扑结构发生变化时,路由器之间也将及时地相互通知有关变更信息。
它是一种动态路由选择算法。每个路由器都定期与其相邻的所有路由器交换路由表,据此更新它们自己的路由表。
if (data[start][end].dis < 0)
{
printf("No routine find!\n");
return;
}
printf("%c->", cur+65);
while (data[cur][end].from >= 0)
{
total += data[cur][data[cur][end].from].dis;
通信07级2班
论文题目
距离向量算法更新路由表
指导教师评语及意见:
指导教师评阅成绩:指导教师签字
年 月 日
return;
}
else
InitData(pfile);
fclose(pfile);
printf("\nInitial State:\n");
OutputRoutData();
for (i=0; i<ROUTNUM; i++)
{
Exchange();/*小于大的距离,路由更新*/
}
printf("\nState Exchanged:\n");
计算机网络实习报告
论 文 题 目距离向量算法更新路由表
学生专业班级通信07级2班
学生姓名(学号)
指 导 教 师
完 成 时 间2010年05月22日
实 习(设计)地点信Leabharlann Baidu楼139(112)机房
2010年05月22日
距离向量算法更新路由表
一.实验目的
1.认识并掌握路由器结构组成及路由建立与更新的原理
2.理解、掌握和利用距离向量算法的应用。
首先,对我以前做题做事非常马虎的毛病有了很大的改进,通过在这5天编程的过程中的锻炼,我现在做题比以前仔细多了,会小心翼翼地去看每一个地方,会仔细地检查程序的每一个字母、标点。
其次,在5天编程的过程当中弥补了我许多知识上的缺陷,弄清楚了我不懂的地方和似是而非的地方,使我及时补上了欠缺。
再次,通过5天综合实训编程使我的知识形成了一个完整的框架结构,而不再是零散的知识个体,使我在使用时更加的方便。
同样道理,路由器B还会产生一条(10.1.0.0,S0,1)路由,这条路由是通过网络端口S0从路由器A获得的。如此反复,直到最终收敛,形成图中所示的路由表。
概括地说,距离向量算法要求每一个路由器把它的整个路由表发送给与它直接连接的其它路由器。路由表中的每一条记录都包括目标逻辑地址、相应的网络接口和该条路由的向量距离。当一个路由器从它的相邻处收到更新信息时,它会将更新信息与本身的路由表相比较。如果该路由器比较出一条新路由或是找到一条比当前路由更好的路由时,它会对路由表进行更新:将从该路由器到邻居之间的向量距离与更新信息中的向量距离相加作为新路由的向量距离。
{
printf("%d ", i);
for (j=0; j<ROUTNUM; j++)
{
if (data[i][j].dis < 0) /*如果无路径*/
printf("- ");
else
printf("%-5d", data[i][j].dis);
if (data[i][j].from < 0) /*如果未经过其它节点*/
所有路由器只与其相邻路由器交换信息,在发来为RIP报文情况下更新其路由表的具体步骤为:
1.对地址为X的相邻路由器发来的RIP报文,先修改报文中的所有项目,把“下跳”字段中地址均改为X,把所有“距离”字段的值加1.每一个项目都有三项数据,即:到目的网络N,距离是d,下一条路由器是X
2.对修改后的RIP报文中每个项目,进行以下步骤:
OutputRoutData();
printf("input the start node(%d-%d) : ", 0, ROUTNUM-1);
scanf("%d", &start);
printf("input the end node(%d-%d) : ", 0, ROUTNUM-1);
scanf("%d", &end);
printf("- ");
else
printf("%c ", data[i][j].from+65);
}
printf("\n");
}
}
void Communication(int recv, int send)
{int i;
for (i=0; i<ROUTNUM; i++)
{
if (data[send][i].dis > 0) /*如果send节点到i号节点有路线*/
void InitData(FILE* pfile); /*从数据文件读取数据,初始化路由表*/
void OutputRoutData(); /*输出所有的路由表*/
void Communication(int recv, int send); /*send点向recv点发送自己的路由表*/
void Exchange(); /*所有节点进行一次数据交换,更新路由表*/
void main()/*main函数,程序入口*/
{
int start,end;
int i;
FILE *pfile;
pfile = fopen("data.txt", "r");/*打开数据文件data*/
if (pfile == NULL)/*文件data为空,显示错误*/
{
printf("data file failed to open, press any key to quit.\n");
{
num[i++] = c;
}
}
}
}
}
void OutputRoutData()
{
int i,j;
printf(" ");
for(i=0; i<ROUTNUM; i++)/*读取路由距离*/
{
printf("< %d >", i);
}
printf("\n");
for (i=0; i<ROUTNUM; i++)
{
char num[10];
int i=0;
char c;
int m,n;
fseek(pfile, 0, 0);
for (m=0; !feof(pfile)&&m<7; m++)
{
for (n=0; !feof(pfile)&&n<7; n++)
{
while (!feof(pfile))
{
c = fgetc(pfile);
第四,在5天的实习结束后,我对做完的习题检查比再是一切的走马观花,而是仔细核对、认真检查。
第五,通过5天的实习改变了我做题时心烦气燥的习惯,现在做题可以平和静气的完成。
第六,通过5天的实习我的自制能力更强了,基本完全可以控制自己,避免外界的干扰,安心地完成自己的工作。
实 习成绩评定表
学生姓名
专业班级
printf("%c->",data[cur][end].from+65);
cur = data[cur][end].from;
}
total += data[cur][end].dis;
printf("%c\ntotal distance=%d", end+65, total);
return;
}
}
void InitData(FILE* pfile)
if (start==end || start<0 || start>6 || end<0 || end>6)
{
printf("\nwrong input, press any key to quit.\n");/*设定距离大于6为错误*/
return;
}
else
{
int cur = start;
int total = 0;
{if (data[i][j].dis > 0) /*如果两个节点之间有路径*/
{Communication(j,i); /*将i号节点的路由表发送给j号节点*/
}
}
}
}
五.运行结果
六.实习心得和体会
历时7天的《C语言程序设计》已经结束了,在这5天编程的过程中感触颇多,实训编程的同时暴露出了许多我自身存在的问题,同时也对自身有了很大的提高。