《以太帧封装与解析----感谢 网友 分享 载自 互联网》由会员分享,可在线阅读,更多相关《以太帧封装与解析----感谢 网友 分享 载自 互联网(9页珍藏版)》请在金锄头文库上搜索。
1、计算机网络的第一次作业,得了 90 分。其实实际上就是字符串的处理,没有什 么难的。 一、帧的封装 1、背景知识介绍 当数据在以太网通信中传输时,被封装在帧中(见下图)。帧的组成部分都是预 定义的。 第 1 部分为前同步信号, 5 6 位长。前同步信号同步帧的传输,由交 替的 0 和 1 构成。下一个域是 8 位的帧首定界符(Start Frame De l i m i t e r,S F D )。帧首定界符的形式为 1 0 1 0 1 0 11。在帧首定界 符之后,跟随 着两个包含目标地址和源地址的地址域。根据 I E E E 8 0 2 . 3 标准,地址 域或者是 1 6 位,或者是 4
2、 8 位。接下来就是指定帧长度的 1 6 位域。帧的数据部分在长度域之后。封装的数据 的长度必须是 8 位的倍数,如果不是,就必须包含一个填充域。帧的最末部分 是帧校验序列(Frame Check Se q u e n c e,FC S )域,3 2 位长,允许使用 循环冗余校验法(Cyclic Redundancy Ch e c k,C R C )进行错误检测。这个 值是在封装时从帧的其他域中计算出来的,当目标结点接收到帧时会重新计算 一次。如果重新计算的值与原来计算出来的值不同,就会产生错误,接收结点 就要求帧重新传输。当重计算的值与原来的值完全匹配时, C R C 比较算法产 生结果 0
3、,不发出重新计算的要求。现在 C R C 算法已经被指定为 I E E E 标准。Ethernet II 是一种以太网数据格式化方法,用于 I n t e r n e t 和其他现代 网络中,与 I E E E 8 0 2 . 3 标准的差别很小,从而使得网络传输更有效。 在 EthernetII 中,前同步信号为 6 4 位长,包含有起始分界符和帧开始定界符 ( S O F )。Ethernet II 中的目标和源地址都是严格的 4 8 位(图 2 - 1 2 )。 Ethernet II 使用 1 6 位类型域而不是长度域,该域用于高水平的网络通信。数 据域无须 p a d 域来封装,长度
4、界于 5 7 6 位和 12 208 位之间。域尺寸的最小 值和最大值有利于提高改善包的冲突检测,并确保一个大型的包不会太长时间 地占据网络。Ethernet II 帧中的最后一个域是 3 2 位长的帧校验序列( F C S )域,按照 8 0 2 . 3 标准中的方法执行 C R C.为避免网络通信问题,切勿于同 一网络上在相同的通信结点中同时使用 Ethernet II 和 8 0 2 . 3 标准的帧。8 0 2 . 3 标准和 Ethernet II 在长度(或类型域)与 I E E E 8 0 2 . 2 的数据链 路层的 L L C 子层通信标准中指定的数据域之间有 3 个可选的域
5、: 目标地址服务访问点( D S A P )、源服务访问点( S S A P )和控制。 这些域使得数据链路层可以管理帧并与 O S I 模型中的高层进行通信。D S A P 和 S S A P 均为 8 位长。服务访问点( S A P )可使网络层确定目标结点的哪一 个网络进程可以接收帧。而且它们也代表着诸如 O S I、N o v e l l、N e t B I O S、T C P / I P、B PD U 和 I B M 网络管理、X N S 等通信进程。下面来 举例说明。E 0 是 Novell SAP 的 1 6 进制值,0 6 是 T C P / I P 的 S A P 的 1 6
6、 进制码。D S A P 指定了接收帧的接收结点的服务访问点, S S A P 则标识发 送帧的发送结点的服务访问点。控制域的长度为 8 位或 1 6 位,用来识别帧的 功能,比如它是否带有数据或报错信息。图 1 几种常见的局域网数据链路帧类型2、封装的实现 2.1 编程风格的约定 变量的命名的约定:变量名的第一个字母都用该变量的类型的第一个字母,比 如 char 类型的变量定义为 cName,int 类型的变量命名为 iName。对于指针类 型的变量,则在上述的基础上加上“pointer”的第一个字母“p”,比如 char * pcName。对于数组变量则变量名以“a”开头,比如 int a
7、iName,这样就可 以不看定义知道是整型的数组变量。方便代码的阅读和理解。 变量名都是与变量意义相关的单词组成,不写无意义的变量名和容易产生歧义 的变量名。 代码的缩进以 4 个空格为基本单位,这样可以使多层的嵌套容易理解,而且嵌 套不超过 3 层,以减少代码的出错和整体的理解。 2.2 主要常量的定义 #define DATA_MAX 1500 /*数据的最长长度*/ #define DATA_MIN 46 /*数据的最短长度*/ #define PREAMBLE_LEN 8 /*前导码长度*/ #define DEST_LEN 6 /*目的地址长度*/ #define SOURCE_LE
8、N 6 /*源地址长度*/ #define DATA_AREA_LEN 2 /*数据的实际长度*/ #define FCS_LEN 4 /*帧校验字段的长度*/ char cPreamble8=(char)0xAA,(char)0xAA,(char)0xAA,(char)0xAA,(ch ar)0xAA, (char)0xAA,(char)0xAA,(char)0xAB;/* 前导码的定义 */ char cDest6=(char)0xFF,(char)0xFF,(char)0xFF,(char)0xFF,(char) 0xFF, (char)0xFF;/*目的地址的定义*/ char cSo
9、urce6=(char)0x00,(char)0x16,(char)0x76,(char)0xB4, (char)0xE4,(char)0x77; /*源地址的定义*/2.3 函数的功能说明 void framer()实现了具体的封装,主函数在封装帧时调用该接口。 void deFramer();实现了具体的帧的解析,主函数在解析帧时调用该接口。 int GenerateCRC(char* DataBuf,unsigned long len); 根据所给的字符串, 生成该字符串的校验码。 void frameInDetail(char *pcFrame,char *pcData,long lD
10、ataLeft,int *pnDataAreaLen,int *pnFCS);实现了对一个帧的具体的封装,对于三种不同的 帧,即数据长度小于 46,大于 1500 和介于两者之间的数据长度进行不同的封装。2.4 主函数的框架 在程序执行时,需要用户输入两个参数,第一个参数用来标识是封装或者解析帧,第二个参数用来标识输入或者输出的文件名。所以需要对用户输入的参数 进行判断,以用来处理异常情况。if(argcDATA_MAX) lDataLeft=lDataLeft-DATA_MAX; else /*数据已经封装完毕,退出循环体*/break; fout DATA_MAX) nMASK= DATA
11、_MAX; else nMASK = lDataLeft; /*计算当前数据帧的总长度*/ nFrameLen=PREAMBLE_LEN+DEST_LEN+SOURCE_LEN+ DATA_AREA_LEN+nMASK+FCS_LEN; pcFrame=(char *) malloc(nFrameLen); /*为帧分配空间*/ memcpy(pcFrame,cPreamble,PREAMBLE_LEN); /*加入前导码*/memcpy(pcFrame+PREAMBLE_LEN,cDest,DEST_LEN); /*加入目 的地址*/ /*加入源地址*/memcpy(pcFrame+PREA
12、MBLE_LEN+DEST_LEN,cSource,SOURCE_LEN); *pnDataAreaLen=nMASK /* 求得数据长度*/memcpy(pcFrame+PREAMBLE_LEN+DEST_LEN+SOURCE_LEN, pnDataAreaLen,DATA_AREA_LEN); /*加入数据长度*/memcpy(pcFrame+PREAMBLE_LEN+DEST_LEN+SOURCE_LEN+ DATA_AREA_LEN,pcData,nMASK);/* 加入数据 */ if (lDataLeft=0) (void)checkCRC(chCurrByte,(int)pcDa
13、tanCont-1); return chCurrByte;二、帧的解析 1、背景知识介绍 Ethernet 帧的解析,简单说就是列出帧的各字段的值。 历史上以太网帧格式有五种: 1.Ethernet V1:这是最原始的一种格式,是由 Xerox PARC 提出的 3Mbps CSMA/CD 以太网标准的封装格式,后来在 1980 年由 DEC,Intel 和 Xerox 标准化 形成 Ethernet V1 标准. 2.Ethernet V2(ARPA):由 DEC,Intel 和 Xerox 在 1982 年公布其标准,主 要更改了 Ethernet V1 的电气特性和物理接口,在帧格式上
14、并无变化; Ethernet V2 出现后迅速取代 Ethernet V1 成为以太网事实标准;Ethernet V2 帧头结构为 6bytes 的源地址+6bytes 的目标地址+2Bytes 的协议类型字段+数据。3.RAW 802.3:这是 1983 年 Novell 发布其划时代的 Netware/86 网络套件 时采用的私有以太网帧格式,该格式以当时尚未正式发布的 802.3 标准为基础; 但是当两年以后 IEEE 正式发布 802.3 标准时情况发生了变化IEEE 在 802.3 帧 头中又加入了 802.2 LLC(Logical Link Control)头,这使得 Novel
15、l 的 RAW 802.3 格式跟正式的 IEEE 802.3 标准互不兼容. 4.802.3/802.2 LLC:这是 IEEE 正式的 802.3 标准,它由 Ethernet V2 发 展而来。它将 Ethernet V2 帧头的协议类型字段替换为帧长度字段(取值为 0000-05dc;十进制的 1500);并加入 802.2 LLC 头用以标志上层协议,LLC 头中 包含 DSAP,SSAP 以及 Crontrol 字段. 5.802.3/802.2 SNAP:这是 IEEE 为保证在 802.2 LLC 上支持更多的上层协 议同时更好的支持 IP 协议而发布的标准,与 802.3/8
16、02.2 LLC 一样 802.3/802.2 SNAP 也带有 LLC 头,但是扩展了 LLC 属性,新添加了一个 2Bytes 的协议类型域(同时将 SAP 的值置为 AA),从而使其可以标识更多的上层协议 类型;另外添加了一个 3Bytes 的 OUI 字段用于代表不同的组织,RFC 1042 定义 了 IP 报文在 802.2 网络中的封装方法和 ARP 协议在 802.2 SANP 中的实现.802.3 以太网帧格式备注:前导码(7 字节)、帧起始定界符(1 字节)、目的 MAC 地址(6 字节)、 源 MAC 地址(6 字节)、类型/长度(2 字节)、数据(461500 字节)、帧校验 序列(4 字节)MAC 地址可以用 26 字节来表示,原则上是这样,实际都是 6 字节2、帧解析的实现 2.1 编程风格的约定 编程风格与变量命名与