《计算机网络》课程设计报告
学院:计算机学院
专业:计算机科学与技术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
Ⅴ: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 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:"< }