网络软件开发技术实验报告实验一解析Ethernet帧1.实验目的:(1)根据局域网MAC子层的基本原理,通过解析Ethernet帧,掌握帧结构的各个字段含义以及帧的接收过程,加深对MAC子层设计思想与设计方法的理解(2)掌握Ethernet帧结构解析软件设计与编程实现的方法(3)掌握帧CRC校验算法原理与编程实现方法2实验环境:(1)Linux操作系统(2)局域网能连接Internet。3.实验报告中应包含如下内容:1)搭建和配置开发环境的方法,重点介绍使用了哪些软件,其功能及其配置;先搭建VMware,然后安装linux系统。安装gcc编译器,安装加载libpcap包,2)解析帧的相关知识,包括帧结构和CRC工作原理;帧结构分为5部分:①、前导码和帧前定界符字段字段前导码由56位(7B)的101010...1010比特序列组成,帧前定界符由一个8位的字节组成,其比特序列为10101011。如果将前导码与帧前定界符一起看,那么在62位101010...1010比特序列之后出现11。在这个11之后便是Ethernet帧的目的地址字段。从Ethernet物理层角度看,接收电路从开始接收比特到进入稳定状态,需要一定的时间。设计前62位1和0的交替比特序列的目的是保证接收电路在帧的目的地址到来之前到达正常状态。接收端在收到最后两位11时,标志在他之后应该是帧的目的地址。前导码与帧前定界符主要起到接收同步的作用,这8个字节接收后不需要保留,也不计入帧头长度。②、目的地址DA和源地址SA网络软件开发技术实验报告目的地址与源地址分别表示帧的接收节点与发送节点的硬件地址。硬件地址一般称作MAC地址,物理地址或Ethernet地址。地址长度为6B(即48位)。为了方便起见,通常使用十六进制数字书写。Ethernet帧的目的地址可分为3种:单播地址(unicastaddress):目的地址的第一位为0表示单播地址。目的地址是单播地址,则表示该帧只被与目的地址相同的节点所接收。多播地址(multicastaddress):目的地址第一位为1表示多播地址。目的地址是多播地址,则表示该帧被一组节点所接收。broadcastaddress):目的地址全为1表示广播地址。目的地址是广播地址,则表示该帧被所有所有节点接收。③、类型字段类型字段表示的是网络层使用的协议类型。常见的协议类型:0800表示网络层使用IP协议,0806表示网络层使用ARP协议,8137表示网络层使用NovellIPX协议,809b表示网络层使用AppleTalk协议。④、数据字段IEEE802.3协议规定数据的长度在46~1500B之间。如果数据的长度少于46B,需要加填充字节,补充到46B。填充字节是任意的,不计入长度字段中。帧头部分长度为18B,包括6B的目的地址字段,6B的源地址字段,2B的类型字段和4B的帧校验和字段,而前导码与帧前界定符不计入帧头长度中,那么,Ehternet帧的最小长度为64B(46B+18B),最大长度为1518B(1500B+18B)。设置最小帧长度的一个目的是使每个接收节点能够有足够的时间检测到冲突⑤、帧校验字段FCS帧校验字段FCS采用32位CRC校验。校验的范围包括目的地址字段、源地址字段、长度字段、LLC数据字段。在接收端进行校验,如果发现错误,帧将被丢弃。在本次作业中,为了简便起见,采用8位的CRC校验。8位CRC校验的生成多项式为:CRC工作原理:将要发送的数据比特序列当做一个多项式f(x)的系数,在发送端用收发双方预先约定好的生成多项式G(x)去除,求得一个余数多项式。将余数多项式附在数据多项式后发送到接收端。在接收端用同样的生成多项式G(x)去除接受数据多项式f(x),得到计算余数多项式。如果计算余数多项式与接受余数多项式相同,则表示传输无差错;反之则表示传输有差错。3)使用UML画出程序的流程图;网络软件开发技术实验报告4)程序中的关键代码和注释;①、用户输入参数错误时输出错误提示信息,程序强制退出If(argc!=2){Cout”请以帧封包文件名为参数重新执行程序”endl;Exit(0);}②、定位输入文件中的第一个有效帧While(true){网络软件开发技术实验报告For(intj=0;j7;j++){If(file.tellg()=nFileEnd){Cout”没有找到合法的帧”endl;File.close();Exit(0);}If(file.get()!=0xaa{J=-1;}}If(file.get()==0xab){Break;}}③、检测剩余文件是否可能包含完整帧头If(file.tellg()+14nFileEnd){Cout”没有找到完整的帧头,解析终止“endl;File.close();Exit(0);}④、帧头信息的解析输出目的地址:Coutendl”目的地址:\t”;For(inti=0;i6;i++){C=file.get();Cout.width(2);Couthexcdec(i==5?””:”-”);}输出源地址字段:Coutendl”源地址:\t”;For(inti=0;i6;i++){C=file.get();Cout.width(2);Couthexcdec(i==5?””:”-”);}输出类型字段IntEthertType;网络软件开发技术实验报告Coutendl”类型字段:\t”;C=file.get();Cout.width(2);Couthexcdec””;EthertType=c;C=file.get();Cout.width(2);Couthexc;EthertType=8;EthertType|=c;⑤、CRC校验算法把register8中的值置0;在原始数据Input后添加8个0;While(数据未处理完){If(register8首位是1){Register8中的数据左移1位;If(从input中读入的新数据为1){将register8的最低位置1;}Register8=register8XOR00000111;}Else{Register8中的数据左移1位;If(从input中读入新数据为1){将register8的最低位置1;}}}5)程序健壮性保障措施;程序分为3个主要部分:①、安全性检测部分检测用户输入的参数是否正确。检测输入文件是否存在并可以打开?②、初始化及解析准备部分定位输入文件中第一个有效Ethernet帧。查看剩余文件是否可能包含完整的帧头③、解析的主控循环部分安全性检测部分和初始化及解析准备部分都属于程序健壮性保护措施。6)给出Ethernet帧头的解析算法;网络软件开发技术实验报告输出目的地址:Coutendl”目的地址:\t”;For(inti=0;i6;i++){C=file.get();Cout.width(2);Couthexcdec(i==5?””:”-”);}输出源地址字段:Coutendl”源地址:\t”;For(inti=0;i6;i++){C=file.get();Cout.width(2);Couthexcdec(i==5?””:”-”);}输出类型字段IntEthertType;Coutendl”类型字段:\t”;C=file.get();Cout.width(2);Couthexcdec””;EthertType=c;C=file.get();Cout.width(2);Couthexc;EthertType=8;EthertType|=c;7)判断下一个Ethernet帧的方法。处理完帧头信息之后,文件指针所指的位置就是数据字段的起始位置。每帧的最后一个字节是CRC校验码,倒数第二个字节就是数据字段的最后一个字节。所以要确定数据字段的结束位置,就归结为定位下一个帧的其实位置,即寻找下一个连续的“AAAAAAAAAAAAAAAB”比特串。如果直到文件结束仍没找到这样的比特串,则视该帧为最后一个需要处理的帧,数据字段结束于文件的倒数第二个字节。