欢迎来到天天文库
浏览记录
ID:15167337
大小:51.00 KB
页数:9页
时间:2018-08-01
《以太帧封装与解析----感谢 网友 分享 载自 互联网》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、计算机网络的第一次作业,得了90分。其实实际上就是字符串的处理,没有什么难的。一、帧的封装1、背景知识介绍当数据在以太网通信中传输时,被封装在帧中(见下图)。帧的组成部分都是预定义的。第1部分为前同步信号,56位长。前同步信号同步帧的传输,由交替的0和1构成。下一个域是8位的帧首定界符(StartFrameDelimiter,SFD)。帧首定界符的形式为10101011。在帧首定界符之后,跟随着两个包含目标地址和源地址的地址域。根据IEEE802.3标准,地址域或者是16位,或者是48位。接下来就是指定帧长度的16位域。帧的数据部分在长度域之后。封装的数据的长度必须是8位的倍数,如
2、果不是,就必须包含一个填充域。帧的最末部分是帧校验序列(FrameCheckSequence,FCS)域,32位长,允许使用循环冗余校验法(CyclicRedundancyCheck,CRC)进行错误检测。这个值是在封装时从帧的其他域中计算出来的,当目标结点接收到帧时会重新计算一次。如果重新计算的值与原来计算出来的值不同,就会产生错误,接收结点就要求帧重新传输。当重计算的值与原来的值完全匹配时,CRC比较算法产生结果0,不发出重新计算的要求。现在CRC算法已经被指定为IEEE标准。EthernetII是一种以太网数据格式化方法,用于Internet和其他现代网络中,与IEEE802
3、.3标准的差别很小,从而使得网络传输更有效。在EthernetII中,前同步信号为64位长,包含有起始分界符和帧开始定界符(SOF)。EthernetII中的目标和源地址都是严格的48位(图2-12)。EthernetII使用16位类型域而不是长度域,该域用于高水平的网络通信。数据域无须pad域来封装,长度界于576位和12208位之间。域尺寸的最小值和最大值有利于提高改善包的冲突检测,并确保一个大型的包不会太长时间地占据网络。EthernetII帧中的最后一个域是32位长的帧校验序列(FCS)域,按照802.3标准中的方法执行CRC.为避免网络通信问题,切勿于同一网络上在相同的通
4、信结点中同时使用EthernetII和802.3标准的帧。802.3标准和EthernetII在长度(或类型域)与IEEE802.2的数据链路层的LLC子层通信标准中指定的数据域之间有3个可选的域:目标地址服务访问点(DSAP)、源服务访问点(SSAP)和控制。这些域使得数据链路层可以管理帧并与OSI模型中的高层进行通信。DSAP和SSAP均为8位长。服务访问点(SAP)可使网络层确定目标结点的哪一个网络进程可以接收帧。而且它们也代表着诸如OSI、Novell、NetBIOS、TCP/IP、BPDU和IBM网络管理、XNS等通信进程。下面来举例说明。E0是NovellSAP的16进
5、制值,06是TCP/IP的SAP的16进制码。DSAP指定了接收帧的接收结点的服务访问点,SSAP则标识发送帧的发送结点的服务访问点。控制域的长度为8位或16位,用来识别帧的功能,比如它是否带有数据或报错信息。图1几种常见的局域网数据链路帧类型2、封装的实现2.1编程风格的约定变量的命名的约定:变量名的第一个字母都用该变量的类型的第一个字母,比如char类型的变量定义为cName,int类型的变量命名为iName。对于指针类型的变量,则在上述的基础上加上“pointer”的第一个字母“p”,比如char*pcName。对于数组变量则变量名以“a”开头,比如intaiName[],这
6、样就可以不看定义知道是整型的数组变量。方便代码的阅读和理解。变量名都是与变量意义相关的单词组成,不写无意义的变量名和容易产生歧义的变量名。代码的缩进以4个空格为基本单位,这样可以使多层的嵌套容易理解,而且嵌套不超过3层,以减少代码的出错和整体的理解。2.2主要常量的定义#defineDATA_MAX1500/*数据的最长长度*/#defineDATA_MIN46/*数据的最短长度*/#definePREAMBLE_LEN8/*前导码长度*/#defineDEST_LEN6/*目的地址长度*/#defineSOURCE_LEN6/*源地址长度*/#defineDATA_AREA_LE
7、N2/*数据的实际长度*/#defineFCS_LEN4/*帧校验字段的长度*/charcPreamble[8]={(char)'0xAA',(char)'0xAA',(char)'0xAA',(char)'0xAA',(char)'0xAA',(char)'0xAA',(char)'0xAA',(char)'0xAB'};/*前导码的定义*/charcDest[6]={(char)'0xFF',(char)'0xFF',(char)'0xFF',(char)'0xF
此文档下载收益归作者所有