802.3以太网数据帧的解析报告_以太网帧构成实验报告
802.3以太网数据帧的解析报告由刀豆文库小编整理,希望给你工作、学习、生活带来方便,猜你可能喜欢“以太网帧构成实验报告”。
802.3 以太网数据帧解析
一:实验要求及目的1、读取文件ch03_mac_frame_data中的数据帧,通过解析解析已封装好的以太帧,了解以太帧结构及各个字段的含义以及帧的接收过程,从而加深对数据链路层协议的理解,进而理解网络协议的概念,协议执行过程以及网络层次的结构。2.通过编程实现CRC-8校验,掌握帧CRC校验算法原理。二:实验原理 1.以太网数据帧:
网络结点间发送数据都要将它放在帧的有效部分,分为一个或多个帧进行传输。Ethernet是当今应用最广泛的局域网技术,因此本次实验是解析Ethernet。
“以太网”是指符合DIX Ethernet V2 标准的局域网。以太网提供的服务是不可靠交付,即尽最大努力交付。当目的站收到有差错的数据帧时就丢弃此帧,差错的纠正由高层来决定。如果高层发现丢失了一些数据而进行重传,但以太网并不知道这是一个重传的帧,而当做一个新的数据帧来发送。
Ethernet是目前使用最广泛的局域网,基于802.3协议,通过MAC地址(物理地址)实现主机间通信。
常用的以太网MAC帧格式有两种标准 :DIX Ethernet V2 标准及IEEE 的 802.3标准。DIX Ethernet V2 是先于IEEE标准的以太网版本。Ethernet V2通过在DLC头中2个字节的类型(Type)字段来辨别接收处理。类型字段是用来指定上层协议的(如0800指示IP、0806指示ARP等),它的值一定是大于05FF的,它提供无连接服务的,本身不控制数据(DATA)的长度,它要求网络层来确保数据字段的最小包长度(46字节)。IEEE802.3把DLC层分隔成明显的两个子层:MAC层和LLC层,其中MAC层主要是指示硬件目的地址和源地址。LLC层用来提供一些服务:
– 通过SAP地址来辨别接收和发送方法 – 兼容无连接和面向连接服务
– 提供子网访问协议(Sub-network Acce Protocol,SNAP),类型字段即由它的首部给出。MAC层要保证最小帧长度不小于64字节,如果数据不满足64字节长度就必须进行填充。
以太网的帧格式如图1 所示:
图1.以太网的帧格式
前导码和帧开始符:一个帧以7个字节的前导码和1个字节的帧开始符作为帧的开始。
目的/源地址:48位(6B),是物理地址,又称MAC地址,如00-13-d3-a2-42-a8 单播地址:目的地址第一位为0,只被该地址节点接收 多播地址:目的地址第一位为1,被一组节点接收 广播地址:目的地址为全1,被所有节点接收
类型字段:16位(2B),表示网络层协议类型,0x0800,表示网络层为IP协议 0x8137,表示网络层为NetWare的IXP协议 2.CRC循环冗余校验
在数据后面添加上的冗余码称为帧检验序列 FCS(Frame Check Sequence)。循环冗余检验 CRC 和帧检验序列 FCS并不等同。
(1)CRC 是一种常用的检错方法,而 FCS 是添加在数据后面的冗余码。(2)FCS 可以用 CRC 这种方法得出,但 CRC 并非用来获得 FCS 的唯一方法。CRC是一类重要的线性分组码,编码和解码方法简单,检错和纠错能力强。CRC检错的原理: 根本思想就是先在要发送的帧后面附加一个数(这个就是用来校验的校验码,这里的数也是二进制序列的),生成一个新帧发送给接收端。这个附加的数不是随意的,它要使所生成的新帧能与发送端和接收端共同选定的某个特定数整除(采用一种称之为“模2除法”)。到达接收端后,再把接收到的新帧除以(同样采用“模2除法”)这个选定的除数。因为在发送端发送数据帧之前就已通过附加一个数,做了“去余”处理,所以结果应该是没有余数。如果有余数,则表明该帧在传输过程中出现了差错。
“模2除法”与“算术除法”类似,但它既不向上位借位,也不比较除数和被除数的相同位数值的大小,只要以相同位数进行相除即可。模2加法运算为:1+1=0,0+1=1,0+0=0,无进位,也无借位;模2减法运算为:1-1=0,0-1=1,1-0=1,0-0=0,也无进位,无借位。相当于二进制中的逻辑异或运算。也就是比较后,两者对应位相同则结果为“0”,不同则结果为“1”。
具体来说,CRC校验原理就是以下几个步骤:
(1)先选择一个用于在接收端进行校验时,对接收的帧进行除法运算的除数(是二进制比较特串,通常是以多项方式表示,所以CRC又称多项式编码方法,这个多项式也称之为“生成多项式”。
(2)看所选定的除数二进制位数(假设为k位),然后在要发送的数据帧(假设为m位)后面加上k-1位“0”,然后以这个加了k-1个“0“的新帧(一共是m+k-1位)以“模2除法”方式除以上面这个除数,所得到的余数(也是二进制的比特串)就是该帧的CRC校验码,也称之为FCS(帧校验序列)。余数的位数一定要是比除数位数只能少一位。
(3)再把这个校验码附加在原数据帧(就是m位的帧,注意不是在后面形成的m+k-1位的帧)后面,构建一个新帧发送到接收端;最后在接收端再把这个新帧以“模2除法”方式除以前面选择的除数,如果没有余数,则表明该帧在传输过程中没出错,否则出现了差错。
CRC校验中有两个关键点:一是要预先确定一个发送端和接收端都用来作为除数的二进制比特串(或多项式);二是把原始帧与上面选定的除进行二进制除法运算,计算出FCS。前者可以随机选择,也可按国际上通行的标准选择,但最高位和最低位必须均为“1”。
三:仿真过程:
首先读取ch03_mac_frame_data文件,用语句argv[1]=“H:研一上课数据网络技术ch03_mac_frame_data”;其次打开文件 char* filePath= argv[1];ifstream file(filePath,ios::binary);//打开文件
再计算文件的长度及通过给定帧中连续的7个AA以及一个AB来搜索判断,若是连续的7个AA和一个AB,则说明可能是合法帧,如果不是,则说明给定帧不正确,系统退出。利用文件指针返回帧头位置,为帧解析做准备。实验中定义了一个帧解析标志位,当标志为正确时,开始帧解析,输出帧序号等信息。输出完毕后,开始CRC校验。CRC8处理流程图:
开始Register8=0,Input 后填8位0数据处理完?结束Register8首位=1?Register8
图2.CRC8的流程图
CRC8检验的代码实现如下:
void checkCRC(int&chCurrByte, int chNextByte){ // CRC循环:每次调用进行8次循环,处理一个字节的数据。for(int nMask = 0x80;nMask > 0;nMask >>= 1){
if((chCurrByte & 0x80)!= 0)// 首位为1:移位,并进行异或运算
{
chCurrByte
// 移一位
if((chNextByte & nMask)!= 0)// 补一位
{
chCurrByte |= 1;
}
chCurrByte ^= 7;
// 首位已经移出,仅对低8位进行异或运算,7的二进制为0000,0111
}
else
// 首位为0,只移位,不进行异或运算
{
chCurrByte
// 移一位
if((chNextByte & nMask)!= 0)// 补一位
{
chCurrByte |= 1;
}
} } }
四:实验结果及分析
如图分别显示了解析出的四个帧,并将每个帧的帧结构内容显示出来,如图3显示的解析出的前两个帧,图4显示的解析出的后两个帧。其中分别输出了前同步码,帧定界符,目的地址,源地址,类型字段,数据字段的解析结果,以及FCS和CRC校验结果。