网基课程设计.docx
《网基课程设计.docx》由会员分享,可在线阅读,更多相关《网基课程设计.docx(15页珍藏版)》请在冰豆网上搜索。
![网基课程设计.docx](https://file1.bdocx.com/fileroot1/2022-11/16/d70077b6-8c21-4fe4-9d06-e264118e9ba4/d70077b6-8c21-4fe4-9d06-e264118e9ba41.gif)
网基课程设计
信息技术学院
计算机网络基础
课程设计报告
学号:
姓名:
班级:
题号:
01、06、07
题目:
曼切斯特编码模拟、透明网桥自学习域转发帧算法模拟、IP分片模拟
分值:
10+20+10
目录
一、理论基础与原理分析1
二、数据结构与算法分析2
三、测试数据与结果分析6
四、课程设计心得与体会8
五、课程设计程序源代码10
一、理论基础与原理分析
(归纳整理相关知识,用文字、图表等表述算法原理,可以举例说明。
切忌照抄课本)
01、
曼彻斯特编码,常用于局域网传输。
曼彻斯特编码将时钟和数据包含在数据流中,在传输代码信息的同时,也将时钟同步信号一起传输到对方,每位编码中有一跳变,不存在直流分量,因此具有自同步能力和良好的抗干扰性能。
但每一个码元都被调成两个电平,所以数据传输速率只有调制速率的1/2。
就是说主要用在数据同步传输的一种编码方式。
在曼彻斯特编码中,用电压跳变的相位不同来区分1和0,即用正的电压跳变表示1,用负的电压跳变表示0。
因此,这种编码也称为相位编码。
由于跳变都发生在每一个码元的中间,接收端可以方便地利用它作为位同步时钟,因此,这种编码也称为自同步编码。
在曼彻斯特编码中,每一位的中间有一跳变,位中间的跳变既作时钟信号,又作数据信号;从低到高跳变表示“0”,从高到低跳变表示“1”。
还有一种是差分曼彻斯特编码,每位中间的跳变仅提供时钟定时,而用每位开始时有无跳变表示“0”或“1”,有跳变为“0”,无跳变为“1”。
06、
1、每个网桥保存一个动态路由表(目的站点地址,端口号)。
2、初始时,该路由表为空,以后通过逆向自学习方法获取路由信息。
逆向自学习方法:
当一个MAC帧到达网桥时,网桥根据其源MAC地址以及到达的端口号,向路由表增加或刷新一条记录。
3、路由表的每一项都设置一个超时计时器,若超时,则删除该项,以适应拓扑结构的变化。
4、当某一帧到达网桥时,查询路由表。
若找到目的地址,则向对应的端口转发。
若找不到目的地址,则向所有的端口广播(除了它所到达的端口外)。
5、当网络拓扑结构出现环路时,应阻塞某些网桥的某些端口,消除环路,使网络呈现出生成树结构(Spaningtree)。
当一帧到达时,网桥必须决定将其丢弃还是转发。
如果要转发,则必须决定发往哪个LAN。
在插入网桥之初,由于网桥不知道任何目的地的位置,因而采用扩散算法(floodingalgorithm),把每个到来的、目的地不明的帧输出到连在此网桥的所有LAN中(除了发送该帧的LAN)。
随着时间的推移,网桥将了解每个目的地的位置。
一旦知道了目的地位置,发往该处的帧就只放到适当的LAN上,而不再散。
07、
分片和重新组装的过程对传输层是透明的,其原因是当IP数据报进行分片之后,只有当它到达目的站时,才可进行重新组装,且它是由目的端的IP层来完成的。
分片之后的数据报根据需要也可以再次进行分片。
IP分片和完整IP报文差不多拥有相同的IP头,ID域对于每个分片都是一致的,这样才能在重新组装的时候识别出来自同一个IP报文的分片。
在IP头里面,16位识别号唯一记录了一个IP包的ID,具有同一个ID的IP分片将会重新组装;而13位片偏移则记录了某IP片相对整个包的位置;而这两个表中间的3位标志则标志着该分片后面是否还有新的分片。
这三个标志就组成了IP分片的所有信息(将在后面介绍),接受方就可以利用这些信息对IP数据进行重新组织
分片重组是IP层一个最重要的工作,其处理的主要思想:
当数据包从一个网络A进入另一个网络B时,若原网络的数据包大于另一个网络或者接口的MTU长度,则需要进行分片(若设置DF为1,则丢弃,并回送ICMP不可达差错报文)。
因而在IP数据包的报头有若干标识域注明分片包的共同标识号、分片的偏移量、是否最后一片及是否允许分片。
传输途中的网关利用这些标识域进可能的再行分片,目有主机把收到的分片进行重组以恢重数据。
因此,分片包在经过网络监测设备、安全设备、系统管理设备时,为了获取信息、处理数据,都必须完成数据包的分片或重组。
二、数据结构与算法分析
(结合程序流程图、模块结构图等图表分析程序结构、关键数据结构、关键算法。
切忌粘贴源代码)
01、
在曼彻斯特编码中,用电压跳变的相位不同来区分1和0,即用正的电压跳变表示1,用负的电压跳变表示0。
06、
透明网桥采用的算法是逆向学习法(backwardlearning)。
网桥按混杂的方式工作,故它能看见所连接的任一LAN上传送的帧。
查看源地址即可知道在哪个LAN上可访问哪台机器,于是在散列表中添上一项。
当计算机和网桥加电、断电或迁移时,网络的拓扑结构会随之改变。
为了处理动态拓扑问题,每当增加散列表项时,均在该项中注明帧的到达时间。
每当目的地已在表中的帧到达时,将以当前时间更新该项。
这样,从表中每项的时间即可知道该机器最后帧到来的时间。
网桥中有一个进程定期地扫描散列表,清除时间早于当前时间若干分钟的全部表项。
于是,如果从LAN上取下一台计算机,并在别处重新连到LAN上的话,那么在几分钟内,它即可重新开始正常工作而无须人工干预。
这个算法同时也意味着,如果机器在几分钟内无动作,那么发给它的帧将不得不散发,一直到它自己发送出一帧为止。
到达帧的路由选择过程取决于发送的LAN(源LAN)和目的地所在的LAN(目的LAN),
1、如果源LAN和目的LAN相同,则丢弃该帧。
2、如果源LAN和目的LAN不同,则转发该帧。
3、如果目的LAN未知,则进行泛洪。
07、
分片重组是IP层一个最重要的工作,其处理的主要思想:
当数据包从一个网络A进入另一个网络B时,若原网络的数据包大于另一个网络或者接口的MTU长度,则需要进行分片(若设置DF为1,则丢弃,并回送ICMP不可达差错报文)。
因而在IP数据包的报头有若干标识域注明分片包的共同标识号、分片的偏移量、是否最后一片及是否允许分片。
传输途中的网关利用这些标识域进可能的再行分片,目有主机把收到的分片进行重组以恢重数据。
三、测试数据与结果分析
(结合输入的测试用例和算法原理,分析运行结果。
切忌仅仅粘贴数据)
01、
06、
07、
四、课程设计心得与体会
(课程设计中的收获、经验、教训等等)
刚开始的时候看到这个题目觉得很简单。
应该很容易就能做出来。
后来发现还有很多的小问题,首先用java编写有关本题的代码。
在01题目中我们先要从一个原本就写好的input.txt文件中读取里面的内容。
而且要一个数字一个数字的读。
因此,我不能直接用Scanner包中的next()来直接读取。
而是要用其他方法来解决读取问题。
再经过判断读取的数据是0还是1来决定在output_e.txt中的输入的内容。
然后从output_e.txt中读取数据,此时要两个两个的读。
经过判断还原为0和1,输出到output_d.txt中。
除此之外,还要进行一些简单的异常处理,比如找不到文件。
经过此次实验,我深刻的了解了曼切斯特编码。
而且,熟悉了部分的java代码。
更熟悉的了解了有关文件的读入和输出。
在06里,比如:
路由表的建立、每次事件对发送和接受端口是否已经存在在路由表中,要进行对比、路由表的更新、还有对最后的发送方式的选择等。
我用knum2即接受端口是否存在在路由表中和k[1][num1]和k[1][num2](发送端口和接受端口)对比,来判断进行怎样的发送方式。
经过此次实验,我深刻的了解了透明网桥的工作原理。
而且,熟悉了部分的java代码。
更熟悉的了解了有关文件的读入和输出。
07中通过此次实验,因为有了上次实验的经历。
此次实验更为迅速的完成了。
通过此次实验,我了解了IP分片的方法和计算方法。
在读取文件input.txt文件中的两个数据后,通过数据之间的计算,就可以得出要分片的数量和偏移量这些数据。
while(a[0]!
=0){
if(a[0]>a[1]){
intk=a[1]+20;
w.write(k+""+"1"+""+"0"+""+j*i+"\r\n");
a[0]=a[0]-a[1];
}
else{
intk=a[0]+20;
w.write(k+""+"0"+""+"0"+""+j*i+"\r\n");
a[0]=0;
}
j++;
}
这部分代码就是计算的部分。
通过while就可以一次又一次的输出每次的分片的内容。
通过if来区分最后一次和前面的分片的区别。
五、课程设计程序源代码
(粘贴所有程序源代码)
01、
importjava.io.*;
publicclassManchester{
publicstaticvoidmain(String[]args)throwsException{
//TODOAuto-generatedmethodstub
try{
Stringmid="";
Filef2=newFile("output_e.txt");
f2.createNewFile();
FileWriterw=newFileWriter("output_e.txt");
FileReaderfr=newFileReader("input.txt");
charstr[]=newchar[1];
while(fr.read(str)!
=-1){
mid=String.valueOf(str);
if(mid.equals("1")){
w.append("LH");
}
elseif(mid.equals("0")){
w.append("HL");
}
}
w.close();
fr.close();
}
catch(FileNotFoundExceptione){
System.out.println("找不到文件!
请去创建文件");
}
try{
Stringm="";
Filef3=newFile("output_d.txt");
f3.createNewFile();
FileWriterw=newFileWriter("output_d.txt");
FileReaderfr=newFileReader("output_e.txt");
charstr[]=newchar[2];
while(fr.read(str)!
=-1){
m=String.valueOf(str);//将char的str转化为String
if(m.equals("LH")){
w.append("1");
}
elseif(m.equals("HL")){
w.append("0");
}
}
w.close();
fr.close();
}
catch(FileNotFoundExceptione){
System.out.println("找不到文件!
请去创建文件");
}
}
}
06、
importjava.io.*;
importjava.util.Scanner;
publicclassTransparentBr