我要投搞

标签云

收藏小站

爱尚经典语录、名言、句子、散文、日志、唯美图片

当前位置:双彩网 > 帧首定界符 >

帧的封装与解析-网络作业

归档日期:06-22       文本归类:帧首定界符      文章编辑:爱尚语录

  帧的封装与解析-网络作业_IT/计算机_专业资料。一、背景知识 1、Ethernet 帧 帧是网络通信的基本传输单元, 网络结点间发送的数据都要放在帧的有效字段, 分为一个或 多个帧进行传输。我们在这里只讨论基于 IEEE 802.3 标准的 Eth

  一、背景知识 1、Ethernet 帧 帧是网络通信的基本传输单元, 网络结点间发送的数据都要放在帧的有效字段, 分为一个或 多个帧进行传输。我们在这里只讨论基于 IEEE 802.3 标准的 Ethernet 帧,图 1 给出了 Ethernet 帧的结构图。 图 1: Ethernet 帧结构 如图 1 所示,Ethernet 帧结构由以下几个部分组成。 1) 前导码和帧前定界符字段 前导码由 56 位(7B)的 10101010…1010 比特序列组成, 帧前定界符由一个 8 位的字节组成, 其比特序列为 10101011。前导码与帧前定界符主要起到接收同步的作用,这 8 个字节接收 后不需要保留,也不计入帧头长度中。 2) 目的地址和源地址 目的地址与源地址分别表示帧的接收结点与发送结点的物理地址(亦称 MAC 地址) 。在目前 Ethernet 帧中,都使用 6B(即 48 位)长度的目的地址和源地址。为了方便起见,通常使 用十六进制数书写(例如,00-13-d3-a2-42-a8) 。每个 MAC 地址在世界上都是唯一的。 3) 长度字段 802.3 标准中的帧用 2B 定义了数据字段包含的字节数。长度字段描述了 LLC 数据的实际长 度。 4) 数据字段 IEEE 802.3 协议规定数据的长度在 46-1500B 之间。如果数据的长度少于 46B,需要加填充 字节,补充到 46B。填充字段是任意的,不计入长度字段值中。由于帧头部分包括 6B 的目 的地址字段,6B 的源地址字段、2B 的长度字段、4B 的帧校验和字段,因此,帧头部分长度 为 18B。前导码和帧前定界符不计入帧头长度中。那么,帧的最小长度为 64B,最大长度为 1518B。设置最小帧长度的一个目的是使每个接受结点能够有足够的时间检测到冲突。如果 数据的长度大于 1500B,则需要分片到多个帧中进行传输。 5) 帧校验字段 帧校验字段采用 32 位(4B)CRC 校验。校验的范围包括目的地址字段、源地址字段、长度 字段、数据字段。在接收端进行校验,如果发现错误,帧将被丢弃。 2、CRC 校验码的工作原理 CRC 校验的工作原理是: 将要发送的数据比特序列当作一个多项式 f(x)的系数, 在发送端用 收发双方预先约定的生成多项式 G(x)去除,求得一个余数多项式。将余数多项式附在数据 多项式之后发送到接收端。在接收端用同样的生成多项是 G(x)去除接受数据多项式 f(x), 得到计算余数多项式。如果计算余数多项式与接受余数多项式不相同,则表示传输有差错; 否则数据认为正确而被接受。 编码实际上是一个循环移位的模 2 运算, CRC 在加法中不进位, 在减法中不借位,等价于操作数的按位异或(XOR) 。 CRC 校验的实现:为了简便起见,我们在程序中采用 8 位的 CRC 校验。8 位 CRC 校验的生 成多项式如式 1 : G(x) = x8 + x2 + x1 +1 (1) 图 2:CRC‐8 的基本实现 图 2 就是一个用来计算 CRC‐8(x8 + x2 + x1 +1)的硬件电路实现方法,它由 8 个移位 寄存器和 3 个加法器(异或单元)组成。计算过程如下: 1) 编码或解码前将所有寄存器清零; 2) 输入位作为最右边异或操作的输入之一,8 个寄存器上的移位操作同时进行,均为左移 一位; 3) 最左边寄存器中位作为所有三个异或操作的输入之一; 4) 每次移位时,最右边的寄存器作为中间异或操作的输入之一,中间的寄存器作为最左边 异或操作输入之一; 5) 各个异或操作的结果作为它左边那个寄存器的移入位; 6) 重复步骤 2 到 6, 每输入一个 bit 就做一次移位操作, 直到输入了所有要计算的数据为 止。这时这个寄存器组中的数据就是 CRC-8 的结果。 二.程序的执行环境、编译环境、运行方式、测试结果截图 1、 执行环境:Windows XP 编译环境:VC6.0 运行方式: 1) 开始→运行→输入 cmd→进入 DOS 界面 2) 改变当前目录到可执行程序所在的文件夹下 3) 用户输入命令,程序包含帧封装和帧解析两个部分的功能。 帧封装格式:[可执行文件名] –p [数据帧文件名] 其中 -p 表示帧封装, 数据帧文件名由用户自己拟定。 帧封装可以让用户输入任意一段信息, 以两个回车作为结束,然后程序将这段信息作为帧的数据字段封装到数据帧文件中。 帧封装格式:[可执行文件名] –u [数据帧文件路径] 其中 -u 表示帧解析,数据帧文件路径表示要进行解析的数据帧文件路径,比如 input1 文 件和 input2 文件的路径。 帧解析可以将包含帧的数据文件作为数据, 从这些文件中读出帧, 并对其各字段进行解析。 并通过重新计算 CRC 校验和, 判断该帧是否接受。 若校验和正确, 则接受;否则,丢弃。 2、测试结果截图 解析帧如下: 封装与发送: 三、主要流程的说明 Main 函数流程图: 帧的封装 帧封装程序段让用户输入任意一段信息, 以两个回车作为结束。 然后程序将这段信息作为帧 的数据字段封装到数据帧文件中。 在填充数据帧时, Mac 地址统一设为 00-16-76-B4-E4-77, 源 目的 Mac 地址统一设置为 FF-FF-FF-FF-FF-FF。除了源 Mac 地址和目的 Mac 地址,还要根据 Ethernet 帧的结构依次准确填写前导码和帧前定界符字段,长度字段,数据字段,以及 CRC 校验和字段。前导码和帧前定界符字段、源地址和目的地址都是直接写进帧中。我们输入的 字符是以字符串的形式输入之后转换成字符数组类型, 然后挨个填入数据字段, 并计算出字 符个数。CRC 校验码则是按照上面所述的算法进行计算之后填入相应字段之中。 帧封装的程序主要得考虑一个数据长度的问题。由于 Ethernet 帧的数据字段规定长度在 46-1500B 之间。如果数据的长度少于 46B,需要加填充字节,补充到 46B。如果数据的长度 大于 1500B,则需要分片到多个帧中进行传输。 帧封装的流程图如图所示: 帧的封装 用 wb+方式打开文件 文件是否存在 新建帧文件 计算输入信息的长度、字 节数为 1500 的字节数以及 最后一帧的数据长度 最后一帧是否 为小于 46 填充字节 0 写入前导码、帧前定界符、 目的地址和源地址、长度字 段并校验 根据实际长度写入数据 字段并校验 写入校验码 封装完所有的 帧? 开始发送 帧的解析 帧解析程序将包含帧的数据文件作为数据,从这些文件中读出帧,并对其各字段进行解析。 并通过重新计算 CRC 校验和,判断该帧是否接受。若校验和正确,则接受;否则,丢弃。 帧解析的每次循环大致分为以下几步: 1) 完整性检查 即查看文件是否包含完整的帧头,这其中包括找到 7 个连续的 0xAA(即前导码字段) ,紧跟 着前导码的帧前定界符字段 0xAB,以及目的地址,源地址和长度字段是否完整。 2) 各字段解析输出 根据 Ethernet 帧的结构把各字段依次从文件中输出, 并根据新计算的 CRC 校验值和原校验 值的比较情况,来决定该帧的状态是 Accept 还是 Discard。 3) CRC 校验 要判断该帧的正确性, 即决定该帧的接受还是丢弃, 如果得到的校验值和原来的校验值相同, 则说明该帧是正确的,接受;否则,丢弃。 帧解析的流程图如图所示: 帧的解析 用 rb+方式打开文件 文件是否存在 找到前导码和帧 前定界符? 是否有完整的 帧头? 输出前导码、帧前定界符、 目的地址和源地址、长度字 段并校验 CRC 校验正 确? 输出校验码和状态 输出正确、错误校验码和 状态 是否到达文 件结尾 结束 四、代码中核心程序的设计解释 其具体实现的伪代码如下: //register_8 是一个 8 位的寄存器 把 register_8 中的值置为 0; 在原始数据 input 后添加 8 各 0; while(数据未处理完) { if(register_8 首位是 1) { register_8 中的数据左移 1 位; if(从 input 中读入的新的数据为 1) { 将 register_8 的最低位置 1; } register_8 = register_8 XOR 00000111; } else { register_8 中的数据左移 1 位; if(从 input 中读入的新的数据为 1) { 将 register_8 的最低位置 1; } } } 计算 CRC 校验码的程序如下: unsigned char Ethernet_Pack::CalculateCRC(unsigned char& crc, unsigned char data) { for (unsigned char i = 0x80; i 0; i = 1) { if ((crc & 0x80) != 0) { crc = 1; if ( (data & i) != 0) { crc = 1; } crc ^= 0x07; } else { crc = 1; if ( (data & i) != 0) { crc = 1; } } } return crc; } 五、参考资料 [1] 《计算机网络高级软件编程技术》 ,吴功宜 董大凡 王珺 刘乾编著,清华大学出版社, 第 2 章 Ethernet 帧结构解析程序 [2] 《计算机网络程序设计》 吴功宜 胡晓英 张仁 王宁编著, , 机械工业出版社, 第三章 帧 封装

本文链接:http://passion2017.com/zhengshoudingjiefu/90.html