您好,欢迎访问三七文档
1山西大学软件学院数字通讯与计算机网络课程设计报告书题目Ethernet的帧封装(按802.3标准)专业软件工程班级1528姓名王铸学号201515614373指导教师吴勇2016年12月28日2目录一、设计题目及需求分析.............................................3二、总体设计.................................................................41.帧结构分析.................................................................42.CRC校验分析.....................................................6三、详细设计.................................................................8.1.帧封装过程..........................................................8(1)填充帧头部字段..........................................8(2)填充数据字段..............................................8(3)CRC校验.....................................................92.源程序代码..........................................................11四、测试........................................................................14五、总结........................................................................15六、参考资料................................................................153一、设计题目及需求分析设计题目:Ethernet的帧封装(按802.3标准)需求分析:编写程序,根据给出的原始数据,组装一个802.3标准格式的帧,要求程序为命令行程序,如:framerinputfileoutputfile其中,framer为可执行文件名framer.exe,inputfile为原始数据文件,outputfile为输出结果文件。操作系统及所使用的语言和编译环境不限。4二、总体设计1.帧结构分析术语“帧”来源于串行线路上的通信。其中,发送者在发送数据的前后分别添加特殊的字符,使它们成为一个帧。Ethernet从某种程度上可以被看做是机器之间的数据链路层连接。首先我们来认识一下帧结构,EthernerV2.0规范和IEEE802.3标准中的Ethernet帧结构有一些差别,这里我们按802.3标准的帧结构进行讨论。图为帧结构图前导码帧前定界符目的地址源地址长度字段数据字段校验字段(7B)(1B)(2/6B)(2/6B)(2B)(长度可变)(4B)如上图所示,802.3标准的Ethernet帧结构由7部分组成。(1)前导码与帧前定界符字段前导码由56位(7B)的10101010„10101010位序列组成。帧前定界符可以视为前导码的延续。1B的帧前定界符结构为10101011.如果将前导码与帧前定界符一起看,那么在62位101010„1010位序列之后出现11。在11之后是Ethernet帧的目的地址字段。前导码与帧前定界符主要是保证接收同步,这8B接收后不需要保留,也不记入帧头长度中。(2)目的地址和源地址目的地址(DA)与源地址(SA)分别表示帧的接收结点地址与发送结点的硬件地址。5在Ethernet帧中,目的地址和源地址字段长度可以是2B或6B。目前的Ethernet都使用6B长度的地址。Ethernet帧的目的地址可以是单播地址、多播地址与广播地址,目的地址的第一位为0表示单播地址,为1表示多播地址,目的地址为全1则表示广播地址。(3)长度字段Ethernet帧用2B定义数据字段包含的字节数。协议规定,帧数据的最小长度为46B,最大长度为1500B。设置最小帧长度的目的是使每个接收结点能够有足够时间检测到冲突。(4)数据字段帧数据字段的最小长度为46B。如果帧的LLC数据少于46B,则应将数据字段填充只46B。填充字符是任意的,不计入长度字段值中。(5)校验字段帧校验字段(FCS)采用32位的CRC校验。校验的范围包括目的地址字段、源地址字段、长度字段、LLC数据字段。此处,为了简便起见,采用8位的CRC校验。CRC校验的生成多项式为:G(X)=X^8+X^2+X+1某些帧结构中还会包括帧类型字段,用来识别此帧所承载的数据的类型。当一个帧到达指定的计算机时,操作系统根据帧类型决定用哪个协议软件模块对它进行处理。自识别帧的主要优点是,可以在同一物理网络中使用多个协议而互不干扰。62.CRC校验循环冗余编码的编码方式。过程:在发送端,根据要传送的k位二进制码序列,以一定的规则产生一个校验用的r位监督码,附在原始信息的后边,构成一个新的二进制码序列,然后发送出去。在接收端,根据信息码和CRC码之间所遵循的规则进行检验,以确定传送中是否出错。(1)CRC编码的代数学原理将一个码组表示为一个多项式,码组中的各码元作为多项式的系数。设编码前的原始信息多项式为P(x),P(x)最高次幂加1等于k;生成多项式为G(x),它的最高次幂等于r;CRC多项式为R(x);编码后的带CRC的信息多项式为T(x)。发送方编码的方法是:P(x)乘以x^r,再除以G(x),得余式即为R(x)。接收方得解码方法是:将T(x)除以G(x),如果余数为0,则说明传输中无错误发生,否则说明传输有错误。(2)CRC的基本实现以CRC-8(X^8+X^2+X^1为例,它由多个移位寄存器和加法器组成。编码、解码前将各寄存器初始化为0,输入位作为最右边异或操作的输入之一。三个寄存器上的移位操作同时进行,均为左移一位,左边的寄存器的最左一位作为三个异或操作的输入之一。每次移位时,最右边的寄存器内容作为中间异或操作的输入之一,中间的寄存器的内容作为最左边异或操作输入之一,各个异或操作的结果作为与它左边那个寄存器的移入位。重复以上步骤,每输入一位就做一次移7位操作,直到输入了所有要计算的数据为止。这时,这个寄存器组中的数据就是CRC-8的结果。CRC的工作原理是:CRC在发送端编码和接收端校验时,都可以利用事先约定的生成多项式G(x)来得到,K位要发送的信息位可对应于一个(k-1)次多项式K(x),r位冗余位对应于一个(r-1)次多项式R(x),由r位冗余位组成的n=k+r位码对应于一个(n-1)次多项式T(x)=X^r*K(x)+R(x)。(3)循环冗余校验码的特点CRC校验码的检错能力很强,不仅能检查出离散错误,还能检查出突发错误.CRC校验码具有以下的检错能力:CRC校验码可检测出所有单个错误,所有奇数位错误,所有双位的错误,所有小于、等于校验位长度的突发错误。8三、详细设计1.帧封装过程(1)填充帧头部字段要完成一次帧封装的过程,首先要完成的是帧头部的装入,这一过程只要将前导码、定界符、目的地址、源地址、长度字段的相应数值按顺序写入就可以了。其中,长度字段的值即为要发送的数据的实际长度。有以下两种方式来获得长度字段的值。方法一:While(!in.eof()){in.get(a);buf[j]=a;j++;}方法二:infile.open(argv[1],ios::binary);infile.seekg(0,ios::end);shortlength=(short)infile.tellg();file.put(char(length/256));file.put(char(length%256));(2)填充数据字段在填充数据字段的过程中要注意的主要问题是数据字段的长度。802.3标准中规定了帧数据字段的最小长度为46B,最大长度为1500B。如果数据不足46B,则需要通过填充0来补足;若数据长度超过1500B,则将超过部分封装入下一个帧进行发送。由于帧头部分应该包括6B目的地址、6B源地址、2B长度字段9以及4B帧校验字段,因此帧头部分长度为18B。前导码与帧前定界符不计入帧头长度中。那么,Ethernet帧的最小长度为64B,最大长度为1518B。填充数据字段的代码如下:if(len==1500){„len=0;}if(len46){for(i=len;i46;i++)fr.data[i]=0x00;}data_len=len;(3)CRC校验帧封装的最后一步就是对数据进行校验,并将校验结果记入帧校验字段。CRC编码实际上就是一个循环移位的模二运算。流程描述为:把CRC中的值置为0在原始数据input后添加8个0while(数据未处理完)beginif(crc首位是1)crc=crcXOR100000111把crc中的值左移一位,从input中读取一位新的数据并置于10crc的0位endcrc中的后8位就是经过CRC-8校验的余数。这样,我们只需要看后8位即可,因此上面流程可以简化。构造一个8位的寄存器crc,初始值为0,数据依次移入crc的0位,同时crc的7位移出。当移出的数据为1时,crc才和00000111进行XOR运算;移出数据为0时,不做运算。每次crc中数据位为1时还需要对crc0位进行处理伪代码:while(数据未处理完)beginif(crc的首位是1)crc左移1位crc=crcXOR00000111elsecrc左移1位if(从input中读入的新的数据为1)End112.程序代码#includeiostream.h#includefstream.hvoidmain(intargc,char*argv[]){if(argc!=3){cout请按以下格式输入命令行:framerinputfileoutputfileendl;return;}fstreamfile;file.open(argv[2],ios::in|ios::out|ios::binary|ios::trunc);for(inti=0;i7;i++)file.put(char(0xaa));file.put(char(0xab));longpCrcs=file.tellp();chardst_addr[6]={char(0x00),char(0x00),char(0x80),char(0x1a),char(0xe6),char(0x65)};file.write(dst_addr,sizeof(dst_addr));ifstreaminfile;12infile.open(argv[1],ios::binary);infile.seekg(0,ios::end);shortlength=(short)infile.tellg();file.put(char(length/256));file.put(char(length%256));char*data=newchar[length];infile.seekg(0,ios::beg);infile.read(data,length);infile.close();deletedata;if(length46)for(inti=0;i46-length;i++)file.put(char(0x00));longpCrc=file.tellp();file.put(char(0x00));shorttotal=short(file.tellp())-(short)p
本文标题:计算机网络课设报告
链接地址:https://www.777doc.com/doc-5995096 .html