网络实验第六组实验报告.docx
- 文档编号:27770225
- 上传时间:2023-07-04
- 格式:DOCX
- 页数:15
- 大小:666.14KB
网络实验第六组实验报告.docx
《网络实验第六组实验报告.docx》由会员分享,可在线阅读,更多相关《网络实验第六组实验报告.docx(15页珍藏版)》请在冰豆网上搜索。
网络实验第六组实验报告
云南大学数学与统计学实验教学中心实验报告
课程名称:
计算机网络实验
学期:
2012-2013学年第一学期
成绩:
指导教师:
陆正福
学生姓名:
卢富毓
学生学号:
20101910072
实验名称:
网络编程环境的准备实验
实验要求:
必做
实验学时:
4学时
实验编号:
六
实验日期:
2012/11/21
完成日期:
2012/9/30
学院:
数学与统计学院
专业:
信息与计算科学
年级:
2010级
一、实验目的:
通过实验,进一步的了解路由器的原理,同时加深网络编程
二、实验内容:
1.路由表的构造原理分析
2.基于Socket编程,实现以端系统为基础的数据多路转发
本实验的指导思想:
将“UDP段”看成“IP数据报”的近似形式,通过主机模拟实现“IP路由器”的主要功能:
数据转发、路由决策等。
通过此实验学会“软路由”的基本编程原理。
三、实验环境
WindowsXP、win7java平台
四、实验过程(请学生认真填写):
1.预备知识
A、对路由器工作原理的分析,路由器是如何工作的、它的功能有些什么。
这些事我们需要最先了解的。
B、在了解了路由器是如何工作的之后,我们需要对UDP编程的知识有一定的了解以及如何用java语言来试验,这是我们必须要考虑的,毕竟我们是实现一个A-Router-B、或者A-Router-C的模型以及解决他们是怎样相互通信。
(这里,在接收/发送端必须用线程来实现,Router端则可有可无)
2.实验过程:
步骤一、原理分析:
从整体来看,很容易理解路由器,他就是起到一个连接以及转发(路由算法等,都是以转发为目的)。
但是细节个人觉得有些难。
所以我们做实验的时候也是从整体,从他的转发功能来考虑的。
步骤二、路由表的构造原理分析
所谓路由表,指的是路由器或者其他互联网网络设备上存储的表,该表中存有到达特定网络终端的路径,在某些情况下,还有一些与这些路径相关的度量。
在计算机网络中,路由表或称路由择域信息库(RIB)是一个存储在路由器或者联网计算机中的电子表格(文件)或类数据库。
路由表存储着指向特定网络地址的路径(在有些情况下,还记录有路径的路由度量值)。
路由表中含有网络周边的拓扑信息。
路由表建立的主要目标是为了实现路由协议和静态路由选择。
在现代路由器构造中,路由表不直接参与数据包的传输,而是用于生成一个小型指向表,这个指向表仅仅包含由路由算法选择的数据包传输优先路径,这个表格通常为了优化硬件存储和查找而被压缩或提前编译。
步骤三、图示分析路由表
步骤四、代码以及结果
由步骤一的叙述和步骤三图,我们就可以清晰的了解路由器的工作原理了。
代码如下:
//HashMapTes.Java
importjava.util.*;
/**
*@author卢富毓、吕世嘉、刘君宇、杨清想
*/
/*
*通过HashMap来实现一个转发表的设置
*/
publicclassHashMapTes{
byteflag;
StringIPaddress;
publicHashMapTes(byteflag){
this.flag=flag;
}
publicStringseeksIP(){
//转发表
Map
map.put((byte)1,"192.168.0.106");
map.put((byte)2,"192.168.0.104");
map.put((byte)3,"192.168.0.103");
map.put((byte)0,"192.168.105");
Iterator
while(iter.hasNext()){
Objectkey=iter.next();
bytek=(Byte)key;
if(k==flag){
IPaddress=map.get(key);
returnIPaddress;
}
}
return"127.0.0.1";
}
}
//UDPClient.java
import.*;
importjava.io.*;
/**
*@author卢富毓、吕世嘉、刘君宇、杨清想
*/
publicclassUDPClient{
/**
*@paramargs
*@throwsIOException
*路由表:
1,192.168.0.106、2,192.168.0.104、3,192.168.0.103、0,
*192.168.105
*/
staticDatagramSocketclientsocket;
staticbooleanb=true;
staticStringRouterIP="127.0.0.1";//路由IP的更改
staticbytebflag=0;//对于flag的更改
publicstaticvoidmain(String[]args)throwsIOException{
clientsocket=newDatagramSocket(9999);//创建一个端口号9999
newUDPClient().start();//开始消息的发送以及接受
}
/*
*启动两个线程sender、receive用来分别监听接收与发送!
*/
publicvoidstart(){
senders=newsender();
receiver=newreceive();
newThread(s).start();//启动线程
newThread(r).start();//启动线程
}
/*
*发送的线程
*/
classsenderimplementsRunnable{
BufferedReaderinfromuser=newBufferedReader(newInputStreamReader(
System.in));
publicvoidrun(){
try{
while(b){
Sender(clientsocket,infromuser);
}
}catch(SocketExceptione){
e.printStackTrace();
}catch(IOExceptione){
e.printStackTrace();
}
}
}
/*
*接收的线程
*/
classreceiveimplementsRunnable{
byte[]recvdata=newbyte[1024];
publicvoidrun(){
try{
while(b){
Receive(clientsocket,recvdata);
}
}catch(IOExceptione){
//TODOAuto-generatedcatchblock
e.printStackTrace();
}
}
}
privatestaticvoidSender(DatagramSocketclientsocket,
BufferedReaderinfromuser)throwsIOException,SocketException{
byte[]senddata;
byte[]buf=newbyte[1024];
byteflag=bflag;//bflag代表了要给谁发信息
//从键盘读入一行
Stringstr=infromuser.readLine();
senddata=str.getBytes();
//实现了一个字符串的连接
buf[0]=flag;
System.arraycopy(senddata,0,buf,1,senddata.length);
senddata=buf;
//进行发送
DatagramPacketsendpacket=newDatagramPacket(senddata,
senddata.length,newInetSocketAddress(RouterIP,6789));
clientsocket.send(sendpacket);
}
privatestaticvoidReceive(DatagramSocketclientsocket,byte[]recvdata)
throwsIOException{
Stringstr;
//数据报打包
DatagramPacketrecvpacket=newDatagramPacket(recvdata,
recvdata.length);
//打好包的packet用来接收数据
clientsocket.receive(recvpacket);
//把接收来的数据String化
str=newString(recvpacket.getData());
str=str.trim();//trim方法是用来把null的地方清楚,只留下字符串的真实长度
System.out.println("FromRouter:
"+str);
//如果受到的字符串为exit则推出;
//但是这里有点问题,需要修改,不然不能退出
//由于时间的问题,这里没有给予解决,但是并没有影响到路由的实现
if(str.equals("exit")){
b=false;
}
}
}
//Router.java
importjava.io.*;
import.*;
importjava.util.Date;
/**
*@author卢富毓、吕世嘉、刘君宇、杨清想
*/
publicclassRouter{
staticStringIPaddress;
staticInetAddressaddr;
publicstaticvoidmain(String[]args)throwsIOException{
DatagramSocketserversocket=newDatagramSocket(6789);
byte[]senddata=newbyte[1024];
byte[]recvdata=newbyte[1024];
while(true){
//创建一个packet来接收数据
DatagramPacketrecvpacket=newDatagramPacket(recvdata,
recvdata.length);
//接收数据的方法
senddata=Receive(serversocket,recvpacket);
//转发收到的消息
Sender(serversocket,senddata,recvpacket);
}
}
privatestaticbyte[]Receive(DatagramSocketserversocket,
DatagramPacketrecvpacket)throwsIOException{
byte[]senddata;
byte[]buf=newbyte[1024];
//具体的就收数据
serversocket.receive(recvpacket);
Stringstr=newString(recvpacket.getData());
senddata=str.getBytes();
//得到flag,然后转发(相当于转发时候的路由选择操作)
byteflag=senddata[0];
System.out.println("logtime:
--------"+(newDate()).toString()+"--------");
System.out.println("Header:
"+flag);
System.out.println("From:
"+recvpacket.getSocketAddress());
HashMapTesH=newHashMapTes(flag);
IPaddress=H.seeksIP();
addr=InetAddress.getByName(IPaddress);
//进行数组中的数据截取
System.arraycopy(senddata,1,buf,0,buf.length-1);
System.arraycopy(buf,0,senddata,0,buf.length);
returnsenddata;
}
privatestaticvoidSender(DatagramSocketserversocket,byte[]senddata,
DatagramPacketrecvpacket)throwsIOException{
//创建一个发送数据需要的packet
DatagramPacketsendpacket=newDatagramPacket(senddata,
senddata.length,addr,recvpacket.getPort());
System.out.println("To:
"+addr);
//System.out.println(recvpacket.getPort()+"!
!
!
");
serversocket.send(sendpacket);
Stringstr=newString(sendpacket.getData()).trim();
System.out.println(str);
}
}
Eclipse运行结果如下:
//来自吕世嘉发给刘君宇信息的截图
//来自刘君宇发给卢富毓信息的截图
//来自卢富毓发给吕世嘉信息的截图
//来自杨清想控制的router的log信息
五、实验总结
1.遇到的问题及分析:
遇到问题:
如何把头部值(flag)加入数组中去
分析并解决:
由于用的byte数组,所以在加入的过程中,我采用来的复制的方法(AtoB)来添加flag的。
这样的后果就是在打印的时候不没有存值得地方也当做空格打印了出来(byte[1024]并没有用完,可能要发的信息只有几bit,但是后面没用的也打印了出来),——但是,在最后终于找到了解决的方法——就是用trim()这个方法!
遇到问题:
发送和接收消息是连续、或者是分几次发送的,但是在实验过程中发一次之后,程序就结束了。
分析并解决:
我们再实验的时候,应当考虑到sender端虽然是有接收与发送组成,但是这两者之间并没有一次的次序以及关联。
所以我们需要用线程来是这二者分开执行。
2.体会和收获。
1、加深了对路由器的理解以及对路由器的运行有了一个大致的了解。
这对我们学习网络层这一章来说,这是一个对课本知识的加深巩固,以及发现自己理解是否正确的一个检验。
2、对于用java来编写程序又有了一点进步。
对于查API文档的能力又有了进一步的提升(由于是转发,需要目标的IP地址,这就需要我们查这方面的API文档的知识,来加以运用)。
3、团队协作的重要性在这里有进步体现了出来,一个人是无法完成这个程序。
所以在这里感谢我们成员与我的配合!
六、参考文献
《计算机网络---自顶向下方法》
七、教师评语:
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 网络 实验 第六 报告
![提示](https://static.bdocx.com/images/bang_tan.gif)