《计算机网络课程设计报告--帧封装.docx》由会员分享,可在线阅读,更多相关《计算机网络课程设计报告--帧封装.docx(10页珍藏版)》请在第一文库网上搜索。
1、计算机网络课程设计报告帧封装一、问题描述题目是帧封装,帧是在数据链路层数据进行传输与交换的基本单位。构造帧对于理解网络协议的概念、协议执行过程以及网络问题处理的一般方法具有重要的意义。本次课程设计的目的是应用数据链路层与介质访问控制层的知识,根据数据链路层的基本原理,通过构造一个具体的Ethernet帧,从而深入理解网络协议的基本概念与网络问题处理的一般方法。将打einput文件中的数据封装成帧,封装好的帧写入到文件中。如果数据长度小于46字节,则补全到46字节,如果数据长度大于1500,则封装成多个帧。二、设计原理802.3标准帧结构前序目的地址源地址长度数据FCS8B6B6B2B46150
2、0B4B以太网Ethernet帧格式:a.前序字段前序字段由7个字节的交替出现的1和0组成,设置该字段的目的是指示帧的开始并便于网络中的所有接收器均能与到达帧同步。2.帧起始定界符字段它可以被看作前序字段的延续。实际上,该字段的组成方式继续使用前序字段中的格式,这个一个字节的字段的前6个比特位置由交替出现的1和0构成。该字段的最后两个比特位置是11,这两位中断了同步模式并提醒接收后面跟随的是帧数据。b.帧起始定界符字段它可以被看作前序字段的延续。实际上,该字段的组成方式继续使用前序字段中的格式,这个一个字节的字段的前6个比特位置由交替出现的1和0构成。该字段的最后两个比特位置是11,这两位中断
3、了同步模式并提醒接收后面跟随的是帧数据。C.目的地址字段目的地址字段确定帧的接收者。6个字节的源地址和目的地址字段是局域网中的所有工作站必须使用同样的地址结构。目前,几乎所有的802.3网络使用6字节寻址.d.源地址字段源地址字段标识发送帧的工作站。和目前地址字段类似,源地址字段的长度六个字节。当使用六个字节的源地址字段时,前三个字节表示由IEEE分配给厂商的地址,将烧录在每一块网络接口卡的ROM中。而制造商通常为其每一网络接口卡分配后节。e.长度字段用于IEEE802.3的两字节长度字段定义了数据字段包含的字节数。从前序到FCS字段的帧长度最小必须是64字节。基于最小帧长为64字节和使用六字
4、节地址字段的要求,意味着每个数据字段的最小长度为46字节。如果传输数据少于46个字节,应将数据字段填充至46字节。不过,填充字符的个数不包括在长度字段值中,数据字段的最大长度为1500字节。f.数据字段数据字段的最小长度必须为46字节以保证帧长至少为64字节,这意味着传输一字节信息也必须使用46字节的数据字段:如果填入该该字段的信息少于46字节,该字段的其余部分也必须进行填充零。数据字段的最大长度为1500字节。g.校验序列字段帧校验序列字段提供了一种错误检测机制,每一个发送器均计算一个包括了地址字段、长度字段和数据字段的循环冗余校验(CRC)码。发送器于是将计算出的CRC填入4字节的FCS字
5、段。2. CRC的基本实现循环冗余编码(CRe)是一种重要的线性分组码、编码和解码方法,具有简单、检错和纠错能力强等特点,在通信领域广泛地用于实现差错控制。CRC校验码的检错能力很强,不仅能检查出离散错误,还能检查出突发错误。利用CRC进行检错的过程可简单描述如下:在发送端根据要传送的k位二进制码序列,以一定的规则产生一个校验用的r位监督码(CRC码),附在原始信息的后边,构成一个新的二进制码序列(共k+r位),然后发送出去。在接收端,根据信息码和CRC码之间所遵循的规则进行检验,以确定传送中是否出错。这个规则在差错控制理论中称为“生成多项式二循环冗余校验码的特点:(1)CRC校验码可检测出所
6、有单个错误。(2)CRC校验码可检测出所有奇数位错误。(3)CRC校验码可检测出所有双位的错误(4)CRC校验码可检测出所有小于、等于校验位长度的突发错误。(5)CRC校验码可以(12H11-k的概率检测出长度为(K+1)位的突发错误。三、概要设计抽象类型定义intUastDataPacketQffsetNum;记录最后一个帧,记录偏移量FI1E*fi1e1nfi1eut;1ongStartCa1ibration,endca1ibration;开始检验位置,结束检验位置shortdataTota1Num;记录校验字节个数程序流程图四、详细设计主要算法fseek函数设置文件指针Stream的位置
7、。如果执行成功,Stream将指向以fromwhere(偏移起始位置:文件头0,当前位置1,文件尾2)为基准,偏移OffSet(指针偏移量)个字节的位置。如果执行失败仕匕如offset超过文件自身大小),则不改变stream指向的位置。fopecout.txt)文件打开函数函数间的调用关系主函数调用帧封装函数frameEncapsu1ation(fi1einput);五、调试分析1. vc6.0安装不上是因为电脑是Win8系统不兼容,解决方法,安装虚拟机安装WinXP系统2. errorC2065:,exit,:undec1aredidentifier修改方法添加#inc1ude3. 有一次出
8、现保存失败是因为保存的位置不存在,修改方法为把位置改成正确的原来封装的数据不能大于1500,现在如果大于1500就封装成两个4. errorC2143:syntaxerror:missingbefore,修改方法增加i;fo5. 其他小问题看了一下提示就改过来了。六、心得体会成员分工:赵亚飞(组长)编写主程序,以及程序的整合,程序调试孙泽鹏(组员)查找资料,以及流程图及程序调试邵亚启(组员)-编写程序设计报告,及后期程序修改及调试。在此次的课程设计中,我们小组做的题目是帧封装。在最开始两天收集资料的过程中,我们查阅了很多帧的封装的知识,对帧及其封装的方法有了一定程度的了解和掌握。从最开始对帧的
9、一个模糊的印象到对帧的结构的七个部分的完全掌握,有了很大的收获,并且使帧的封装得以实现。在编写程序的过程中,用到了很多的函数,这些函数的运用使得程序简便而且正确的运行出来。为了正确的实现这些函数,我们查阅了很多相关的资料,从中获得了大量的有用的信息,收获也颇丰富。七、用户手册a.运行程序出现PIeaSeinputse1ectionnumber:输入1转b),输入2退出。b.出现P1easeenterpathtothefi1e:的提示,输入需要封装的数据的文件路径以及名字,转“C)0c.按下enter,输出结果以及结果文件默认存放在c:out.txt的文件中,转a).附录:(程序源码)/* 将f
10、i1einput文件中的数据封装成帧,封装好的帧写入到文件中.* 如果数据长度小于46字节,则补全到46字节,如果数据长度大于1500,则封装成多个帧* Author:zhaoyafei* Time:2015年4月1日* /inc1ude#inc1ude#defineMAXSIZE1500* 帧封装函数,完成把给* 定的文件封装成帧的功能* /intframeEncapsu1ation(char*fi1einput)inti,IastDataPacket,OffsetNum;记录最后一个帧,记录偏移量FI1E*fi1e1n,*fi1eut;1ongStartCa1ibration,endCa1
11、ibration;开始检验位置,结束检验位置shortdataTota1Num;记录校验字节个数printfC,n封装后的文件保存地址:E:out.txt);if(fi1e1n=fopen(fi1einput,z*r+,z)=NU11)Printf(%s,打开文件失败);return1;)if(fi1eut=fopen(zzE:out.txtzz,z,wb+z,)=二NU11)Printf(%s,写入文件失败);return1;/* 先把fp1n指针退回到文件结尾处。再得到文件位置指针* 当前位置相对于文件首的偏移字节数,即可得到内容的长度* /fseek(fi1e1n,0,SEEK_END)
12、;OffsetNum=fte11(fi1e1n);计算整1500数据包个数intdataPacketNum=offsetNum/1500;把文件指针重新回到文件开头。rewind(fiIeIn);/* for循环处理大于1500B的情况,当大于1500时* 自动转换到下一个数据帧中* /for(intj=0;j=dataPacketNum;j+)chardataMXSIZE;数据临时存储数组写入帧前导码,十六进制OxaaPrintf(n帧的前导码:);for(i=0;i7;i+)fputc(0xaa,fiIeOut);printf(,%X”,Oxaa);写入帧定界符fputc(0xab,fiI
13、eOut);printf(z,%X”,Oxab);charObjectiveMac6=0xff,Oxff,Oxff,Oxff,Oxff,Oxff;模拟目的MAC地址charSourceMac6=0x10,0x16,0x76,0xb4,0xe4,0x77;模拟源MAC地址记录开始进行校验的位置,因为校验是从前导码以后开始的StartCa1ibration=fte11(fiIeOut);printf(z,帧的目的MAC地址:);for(i=0;i6;i+)fputc(objectiveMaci,fiIeOut);写入目的MACprintf(,%X,z,ObjectiveMaci);)printfn
14、帧的源MAC地址:);for(i=0;i6;i+)fputc(sourceMaci,fiIeOut);写入源MACprintf(z,%X,z,SourceMaci);不是最后一个数据,则前面的数据都应该是1500,所以按最大数据数算if(j!=dataPacketNum)添加长度字段fputc(char(1500/256),fiIeOut);fputc(char(1500%256),fi1eut);fread(data,sizeof(char),1500,fi1e1n);fwrite(data,sizeof(char),1500,fi1eut);记录开插入校验码的位置endCa1ibratio
15、n=fte11(fi1eut);fputc(0x00,fiIeOut);添加辅助检验字段dataTota1Num=short(fte11(fiIeOut)-(short)StartCa1ibration;计算检验的字段长度e1se得到最后一个数据块的位置IastDataPacket=fte11(fi1e1n);剩下有多少字节inthas1ongs=OffsetNum-dataPacketNum*1500;还有多少不够46BintSurp1us1ongs=46-has1ongs;记录长度字段fputc(char(has1ongs/256),fi1eut);fputc(char(has1ongs%256),fi1eut);先读取剩余的所有数据fread(data,s