当前位置:文档之家› 重庆大学计算机网络课程设计2

重庆大学计算机网络课程设计2

《计算机网络》课程设计报告

学院:计算机学院

专业:计算机科学与技术6班

指导老师:宋伟

学生姓名:李皓楠、王博韬、魏征、杨俊铸

一、课程设计目的

1.熟练掌握计算机网络课程中所学的理论知识;

2.通过综合计算机网络课程的基础知识来解决实际问题;

3.培养学生软件编程能力、分析问题、解决问题的能力

二、课程设计要求

课程设计题目:Project 4路由分组转发仿真

课程设计要求:

(1)模拟实现网络中路由器进行分组转发的过程;

(2)使每台PC上需要实现的2个功能为:

Ⅰ:一个主机Host的功能,包括原始数据的发送和目的数据的接收;

Ⅱ:一个路由器的功能,包括转发数据的接收,路由表的维护,查找路由表,和路由转发(即将数据转发给查找到的对应的路由器或主机)。

(3)程序在主机功能中示发送和接收的数据的原始地址和目的地址,在路由器功中显示接收到的数据的原始地址和目的地址,当前路由表,查找到的路由记录和

转发情况。

三、正文

1.组内分工

代码编写:王博韬、魏征

资料查找、程序测试、报告编写:李皓楠、杨俊铸

2.系统设计

2.1 通过模拟3个路由器,3个路由器两两相通。对应的网络拓扑如图一所示:

图一

2.2 仿真环境的建立需要3台PC和一台交换机,如图二所示:

图二

其中PC1模拟实现H1和R1的功能,PC2模拟实现H2和R2的功能,PC3模拟实现H3和R3的功能。使每台PC上能够实现课程设计要求的2个功能:一个主机Host的功能,包括原始数据的发送和目的数据的接收;一个路由器的功能,包括转发数据的接收,路由表的维护,查找路由表,和路由转发(即将数据转发给查找到的对应的路由器或主机)。

3.系统实现

3.1 封装的类介绍

Ⅰ:address()

声明的address为IP地址类,在该类里void setAddress()来设置地址。

Ⅱ:packet()

声明packet作为数据包类,其中包含了data(数据包的数据);address sourceAddress(发送方地址);address targetAddress(接受方地址)。

Ⅲ:node()

声明node作为路由表节点类,记录路由表的节点的信息。

Ⅳ:router()

声明router作为路由器类,在该类里声明了路由器地址(address routerAddress);设置了可扩展型路由表(vector routingTable),又包含了路由表的转发功能(void transform(packet p))和路由表打印功能(void showRoutingTable())。

Ⅴ:host()

声明host作为主机类,在该类里包含了主机的详细信息:主机地址(address hostAddress)和与主机连接的路由器编号(int nextHop),又分出主机是发送数据包(void send(packet p))或者是接收数据包(void receive(packet p))。

Ⅵ:主函数

作为主函数,它的主要功能是使函数能够按照设计流程运作。

3.2 路由分组转发

1.首先从IP数据包首部提取出目的主机的IP地址D,得出其所在的网络N。

2.若N就是与此路由器直接相连的某个网络,则进行直接交付,不需要经过其它的路由

器进行转发,直接把数据报交付给目的主机。若不是则执行步骤3。

3.若路由表中有目的地址为D的特定主机路由,则把数据报传给路由表中所指明的下一

跳路由器。若没有则执行步骤4.

4.若路由表中有到达网络N的路由,则把数据报传给路由表中所指明的下一跳路由器。

否则执行步骤5.

5.报告转发分组错误。

3.3 系统设计流程

4.实验截图

最终结果如图三所示:

图三

四、总结

经过计算机网络课程设计实践学习,使我们小组对计算机网络有了更进一步的认识和了解,通过课程实践学习,我们也发现自己的不足之处,让自己对计算机网络这门课程有更深的理解。计算机网络是我们今后的专业课程的基础,通过这次课程实践学习,也使我们小组的各个成员的实践动手能力得到了加强。

五、附录(代码)

#include

#include

using namespace std;

class address//IP地址类

{

public:

int part1;

int part2;

int part3;

int part4;

void setAddress(int p1,int p2,int p3,int p4)//设置地址

{

part1=p1;

part2=p2;

part3=p3;

part4=p4;

}

bool operator ==(address& a)

{

return (part1==a.part1)&&(part2==a.part2)&&(part3==a.part3)&&(part4==a.part4);

}

friend ostream& operator <<(ostream& os,address& a)

{

cout<

return os;

}

};

class packet//数据包类

{

public:

string data;//数据包中数据

address sourceAddress;//发送方地址

address targetAddress; //接收方地址

};

class node//路由表节点类

{

public:

address targetAddress;

int nextHop;

void setNode(address t,int n)

{

targetAddress.setAddress(t.part1,t.part2,t.part3,t.part4);

nextHop=n;

}

};

class router//路由器类

{

public:

vector routingTable;//可扩展型路由表

address routerAddress;//路由器地址

void transform(packet p);//路由器转发功能

void showRoutingTable(); //路由表打印

};

class host//主机类

{

public:

address hostAddress;//主机地址

int nextHop;//与主机连接路由器编号

void send(packet p);//主机发送数据包

void receive(packet p);//主机接收数据包

};

router routers[3];

host hosts[3];

int main()

{

//设置主机IP地址

hosts[0].hostAddress.setAddress(192,168,1,1);

hosts[1].hostAddress.setAddress(192,168,1,2);

hosts[2].hostAddress.setAddress(192,168,1,3);

//设置主机下一跳路由器

hosts[0].nextHop=0;

hosts[1].nextHop=1;

hosts[2].nextHop=2;

//设置路由器地址

routers[0].routerAddress.setAddress(192,168,0,1);

routers[1].routerAddress.setAddress(192,168,0,2);

routers[2].routerAddress.setAddress(192,168,0,3);

//定义路由表中各节点

node n[6];

n[0].setNode(hosts[0].hostAddress,0);

n[1].setNode(hosts[1].hostAddress,1);

n[2].setNode(hosts[2].hostAddress,2);

n[3].setNode(hosts[0].hostAddress,-1);

n[4].setNode(hosts[1].hostAddress,-1);

n[5].setNode(hosts[2].hostAddress,-1);

//将R1路由表存入

routers[0].routingTable.push_back(n[1]);

routers[0].routingTable.push_back(n[2]);

routers[0].routingTable.push_back(n[3]);

//将R2路由表存入

routers[1].routingTable.push_back(n[0]);

routers[1].routingTable.push_back(n[2]);

routers[1].routingTable.push_back(n[4]);

//将R3路由表存入

routers[2].routingTable.push_back(n[0]);

routers[2].routingTable.push_back(n[1]);

routers[2].routingTable.push_back(n[5]);

//定义数据包内数据、发送方地址,接收方地址

packet p;

p.data="hello";

p.sourceAddress.setAddress(192,168,1,1);

p.targetAddress.setAddress(192,168,1,3);

//主机H1发送数据包

hosts[0].send(p);

cout<

//主机H1发送数据包,地址不在网络内

p.targetAddress.setAddress(202,202,1,1);

hosts[0].send(p);

cout<

//显示R1路由表

routers[0].showRoutingTable();

return 0;

}

void router::transform(packet p)

{

address sen=p.sourceAddress;

address rec=p.targetAddress;

cout<<"Received packet from "<

for(int i=0;i

{

if(routingTable[i].targetAddress==rec)

{

if(routingTable[i].nextHop==-1)

{

int j;

for(j=0;j<3;j++)

{

if(routingTable[i].targetAddress==hosts[j].hostAddress)

break;

}

cout<<"Sending to H"<

cout<<"H"<

hosts[j].receive(p);

return;

}

else

{

cout<<"Sending to router R"<

cout<<"R"<

routers[routingTable[i].nextHop].transform(p);

return;

}

}

}

cout<<"Can`t find target address in routing table\n";

cout<<"Sending failed"<

}

void router::showRoutingTable()

{

cout<<"Routing table :\n";

cout<<"Target address Next hop"<

for(int i=0;i

{

cout<<""<

if(routingTable[i].nextHop==-1)

cout<<" -"<

else

cout<<" R"<

}

}

void host::send(packet p)

{

cout<<"Host "<

cout<<"Sending to router R"<

cout<<"R"<

routers[nextHop].transform(p);

}

void host::receive(packet p)

{

cout<<"Host "<

cout<<"\nData in packet:"<

}

相关主题
文本预览
相关文档 最新文档