计算机网络课程设计报告-帧封装.doc_第1页
计算机网络课程设计报告-帧封装.doc_第2页
已阅读5页,还剩12页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

哈尔滨理工大学计算机科学与技术学院网络系实验室 实验报告成绩:课程设计报告课程名称:计算机网络课程设计设计题目:帧封装姓 名:专 业:计算机科学与技术班 级:计算机13-3班学 号:计算机科学与技术学院2016年 1 月 1 日设计项目:帧封装一、 选题背景 以太网这个术语通常是指由dec、intel和xerox公司在1982年联合公布的一个标准,它是当今tcp/ip采用的主要的局域网技术,它采用一种称作csma/cd的媒体接入方法。在tcp/ip世界中,以太网ip数据报文的封装在rfc894中定义。 以太网采用广播机制,所有与网络连接的工作站都可以看到网络上传递的数据。通过查看包含在帧中的目标地址,确定是否进行接收或放弃。如果证明数据确实是发给自己的,工作站将会接收数据并传递给高层协议进行处理。以太网采用csma/cd(carriersensemultipleaccess/collisiondetection)媒体访问机制,任何工作站都可以在任何时间访问网络。在以太网中,所有的节点共享传输介质。如何保证传输介质有序、高效地为许多节点提供传输服务,就是以太网的介质访问控制协议要解决的问题。 帧是在数据链路层数据进行传输与交换的基本单位。构造帧对于理解网络协议的概念、协议执行过程以及网络问题处理的一般方法具有重要的意义。本次课程设计的目的是应用数据链路层与介质访问控制层的知识,根据数据链路层的基本原理,通过构造一个具体的ethernet帧,从而深入理解网络协议的基本概念与网络问题处理的一般方法。二设计思路 数据在网络上是以很小的称为帧(frame)的单位传输的,帧由几部分组成,不同的部分执行不同的功能。帧通过特定的称为网络驱动程序的软件进行成型,然后通过网卡发送到网线上,通过网线到达它们的目的机器,在目的机器的一端执行相反的过程。接收端机器的以太网卡捕获到这些帧,并告诉操作系统帧已到达,然后对其进行存储。 “帧”数据大致由两部分组成:帧头和帧数据。帧头包括接收方主机物理地址的定位以及其它网络信息。帧数据区含有一个数据体。为确保计算机能够解释数据帧中的数据,这两台计算机使用一种公用的通讯协议。互联网使用的通讯协议简称ip,即互联网协议。ip数据体由两部分组成:数据体头部和数据体的数据区。数据体头部包括ip源地址和ip目标地址,以及其它信息。数据体的数据区包括用户数据协议(udp),传输控制协议(tcp),还有数据包的其他信息。这些数据包都含有附加的进程信息以及实际数据以802.3的帧结构由六部分组成:常用的以太网mac帧格式用两种标准,一种是dixethernetv2标准(即以太网v2标准),另一种是ieee的802.3标准。这里只介绍符合ieee802.3标准的帧,其格式如上图所示。 它的组成比较简单,由6个字段组成。接下来对这6个部分详细介绍一下。(1)前导符:由7字节的前同步码和1字节的帧起始定界符构成。 前同步码:这个字段有7个字节(56位)交替出现的1和0,它的作用就是提醒接收系统有帧的到来,以及使到来的帧与计时器进行同步。前同步码其实是在物理层添加上去的,并不是(正式的)帧的一部分。前同步码的目标是允许物理层在接收到实际的帧起始符之前检测载波,并且与接收到的帧时序达到稳定同步。 帧起始定界符:这个字段用1字节(10101011)作为帧开始的信号,表示一帧的开始。最后两位是11,表示下面的字段是目的地址。(2)目的地址(da) 48位,表示帧准备发往目的站的地址,共6个字节,可以是单址(代表单个站)、多址(代表一组站)或全地址(代表局域网上的所有站)。 当目的地址出现多址时,表示该帧被一组站同时接收,称为“组播”(multicast)。目的地址出现全地址时,表示该帧被局域网上所有站同时接收,称为“广播”(broadcast),通常以da的最高位来判断地址的类型,若第一字节最低位为“0”则表示单址,第一字节最低位为“1”则表示组播。 (3)源地址(sa)48位,表明该帧的数据是哪个网卡发的,即发送端的网卡地址。 (4)该字段是“长度/类型”。当这个字段的值大于0x0600时(相当于十进制的1536),就表示“类型”。这样的帧和以太网v2 mac帧完全一样。只有当这个字段的值小于0x0600时才表示“长度”,即mac帧的数据部分长度。 (5)数据字段 最小长度必须为46字节以保证帧长至少为64字节,这意味着传输一字节信息也必须使用46字节的数据字段:如果填入该字段的信息少于46字节,该字段的其余部分也必须进行填充。数据字段的默认最大长度为1500字节。 (6)帧检验序列(fcs)32位冗余检验码(crc),检验除前导、sfd和fcs以外的内容。当发送站发出帧时,一边发送,一边逐位进行crc检验。最后形成一个32位crc检验和填在帧尾fcs位置中一起在媒体上传输。接收站接收后,从da开始同样边接收边逐位进行crc检验。最后接收站形成的检验和若与帧的检验和相同,则表示媒体上传输帧未被破坏。反之,接收站认为帧被破坏,则会通过一定的机制要求发送站重发该帧差错检验:在校验字段中,使用的是crc校验。校验的范围包括目的地址字段、源地址字段、长度字段、llc数据字段。 循环冗余编码(crc)是一种重要的线性分组码、编码和解码方法,具有简单、检错和纠错能力强等特点,在通信领域广泛地用于实现差错控制。crc校验码的检错能力很强,不仅能检查出离散错误,还能检查出突发错误。利用crc进行检错的过程可简单描述如下:在发送端根据要传送的k位二进制码序列,以一定的规则产生一个校验用的r位监督码(crc码),附在原始信息的后边,构成一个新的二进制码序列(共k+r位),然后发送出去。在接收端,根据信息码和crc码之间所遵循的规则进行检验,以确定传送中是否出错。这个规则在差错控制理论中称为“生成多项式”。 循环冗余校验码的特点:(1)crc校验码可检测出所有单个错误。 (2)crc校验码可检测出所有奇数位错误。 (3)crc校验码可检测出所有双位的错误。 (4)crc校验码可检测出所有小于、等于校验位长度的突发错误。 (5)crc校验码可以的概率检测出长度为(k+1)位的突发错误。三主要问题的解决方法和关键技术1. 填充帧头部字段要完成一次帧封装的过程,首先要完成的就是帧头部的装入,将前导码、定界符、目的地址、源地址、长度字段的相应数值写入。长度字段的值即为要发送的数据的实际长度。我们通过下面的方式获得长度字段:22 ifstream infile;23 infile.open(argv1, ios:binary);24 infile.seekg(0, ios:end);25 short length = (short) infile.tellg();26 file.put(char(length/256);27 file.put(char(length%256);2. 填充数据字段如果数据字段长度小于46b,填充0补足,超过1500b把超过的部分装入下一帧发送。if (length 46) for (int i = 0; i 0; i=1)53 54 / printf(-nihao);55 if (crc&0x80)56 57 crc = 1;58 if (temp&i) crc = 0x01;59 60 crc = 0x07;61 62 else63 64 crc 1; if(a) regs.val=0x8408;2.字节型算法数字通信系统一般是对一帧数据进行crc校验,而字节是帧的基本单位。最常用的是一种按字节查表的快速算法。该算法基于这样一个事实:计算本字节后的crc码,等于上一字节crc右移8位和本字节之和再与上一字节余式crc码的低8位左移8位相加后所求得的crc码。如果我们把8位二进制序列数的crc全部计算出来,放在一个表里,那么编码时只要从表中查找对应的值进行处理即可。算法如下:1)寄存器组初始化为全1。2)寄存器组向右移动一个字节。3)刚移出的那个字节与数据字节进行异或运算,得出一个指向值表的索引。4)将索引所指的表值与寄存器组做异或运算。5)数据指针加1,如果数据没有全部处理完,则重复步骤2.6)寄存器组取反,得到crc,附加在数据之后。验证算法:1)寄存器组初始化为全1.2)寄存器组向右移动一个字节。3)刚移出的那个字节与数据字节进行异或运算,得出一个指向值表的索引。4)将索引所指的表值与寄存器组做异或运算。5)数据指针加1,如果数据没有全部处理完,则重复步骤2.6)判断寄存器组的值是否等于“magicvalue”,若相等则通过,7)否则失败。填充数据字段在填充数据字段的过程中要注意的主要问题是数据字段的长度。802.3标准中规定了帧数据字段的最小长度为46b,最大长度为1500b。如果数据不足46b,则需要通过填充0来补足;若数据长度超过1500b,则将超过部分封装入下一个帧进行发送。由于帧头部分应该包括6b目的地址、6b源地址、2b长度字段以及4b帧校验字段,因此帧头部分长度为18b。前导码与帧前定界符不计入帧头长度中。那么,ethernet帧的最小长度为64b,最大长度为1518b。填充数据字段的代码如下:if(len=1500)len=0;if(len46)for(i=len;i46;i+)fr.datai=0x00;data_len=len;四程序流程图crc计算流程图:五原程序清单1 #include 2 #include 3 using namespace std; 4 int main(int argc, char* argv) 5 6 if (argc != 3) 7 8 cout “framer inputfile outputfile endl; 9 return 0;10 11 fstream file;12 file.open(argv2, ios:in|ios:out|ios:binary|ios:trunc);13 for (int i = 0; i 7; +i) file.put(char(0xaa);14 file.put(char(0xab);15 long pcrcs = file.tellp();16 char dst_addr6 = char(0x00), char(0x00),char(0xe4), char(0x1a), char(0xe6), char(0x65);17 file.write(dst_addr, sizeof(dst_addr);18 char src_addr6 = char(0x00), char(0x00),char(0x80), char(0x1a), char(0xe6), char(0x65);19 file.write(src_addr, sizeof(src_addr);20 21 22 ifstream infile;23 infile.open(argv1, ios:binary);24 infile.seekg(0, ios:end);25 short length = (short) infile.tellg();26 file.put(char(length/256);27 file.put(char(length%256);28 29 char* data = new charlength;30 infile.seekg(0, ios:beg);31 infile.read(data, length);32 33 file.write(data, length);34 35 infile.close();36 delete data;37 38 if (length 46) for (int i = 0; i 0; i=1)53 54 / printf(-nihao);55 if (crc&0x80)56 57 crc = 1;58 if (temp&i) crc = 0x01;59 60 crc = 0x07;61 62 else63 64 crc = 1;65 if (temp & 1 ) crc = 0x01;66 67 68 69 /printf(n-%xn, crc);70 file.seekp(pcrc, ios:beg);71 file.put(crc);72 /printf(nihao);73 74 /*file.seekg(0, ios:beg);75 while (!file.eof()76 77 char temp;78 file.get(temp);79 cout hex (short) temp endl;80 */81 82 cout argv2 endl;83 file.close();84 return 0;85 六程序运行结果cmd运行界面:输入文件:in.txt输出文件:out.txt:前7b的0xaa为前导码,之后0xab为是帧前定界符,之后2个6b字段分别为目的地址和源地址(mac),之后的0x00、0x0c标志数据字段长度。之后46b为数据字段。最后一个字节为crc冗余校验的检验字段。七设计总结最开始编程的时候,没有完全掌握好帧的七个组成部分,在进行封装的时候因为缺少了其

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论