计算机网络实验学院:计算机科学与信息工程学院班级:学号:2姓名:实验1 Ethernet帧结构解析1. 需求分析实验目的:掌握Ethernet帧各个字段的含义与帧接收过程;掌握Ethernet帧解析软件设计与编程方法;掌握Ethernet帧CRC校验算法原理与软件实现方法。
实验任务:实现帧解析的软件编程实验环境:1台PC机操作系统:Windows 7开发环境:Visual Studio 2010。
1.1问题重述根据给出的IEEE802.3格式的Ethernet帧结构,编写程序来解析并显示帧的各个字段值,并将得到的数据字段值组合写入输出文件。
Ethernet帧数据从输入文件获得,默认文件为二进制数据文件。
2概要设计2.1原理概述TCP/IP支持多种不同的链路层协议,这取决于网络所使用的硬件,如Ethernet,令牌环网,FDDI(Fiber Distributed Data Interface,光纤分布式数据接口)等。
基于不同的硬件的网络使用不同形式的帧结构,Ethernet是当今应用最广泛的局域网技术。
Ethernet V2.0的帧结构:1.前导码和帧前定界符。
字段前导码由56位(7B)的101010...1010比特序列组成,帧前定界符由一个8位的字节组成,其比特序列为10101011。
如果将前导码与帧前定界符一起看,那么在62位101010...1010比特序列之后出现11。
在这个11之后便是Ethernet帧的目的地址字段。
从Ethernet物理层角度看,接收电路从开始接收比特到进入稳定状态,需要一定的时间。
设计前62位1和0的交替比特序列的目的是保证接收电路在帧的目的地址到来之前到达正常状态。
接收端在收到最后两位11时,标志在他之后应该是帧的目的地址。
前导码与帧前定界符主要起到接收同步的作用,这8个字节接收后不需要保留,也不计入帧头长度。
2.目的地址和源地址。
目的地址与源地址分别表示帧的接收节点与发送节点的硬件地址。
硬件地址一般称作MAC地址,物理地址或Ethernet地址。
地址长度为6B(即48位)。
为了方便起见,通常使用十六进制数字书写。
Ethernet帧的目的地址可分为3种:●单播地址(unicast address):目的地址的第一位为0表示单播地址。
目的地址是单播地址,则表示该帧只被与目的地址相同的节点所接收●多播地址(multicast address):目的地址第一位为1表示多播地址。
目的地址是多播地址,则表示该帧被一组节点所接收。
●广播地址(broadcast address):目的地址全为1表示广播地址。
目的地址是广播地址,则表示该帧被所有所有节点接收。
3.类型字段类型字段表示的是网络层使用的协议类型。
常见的协议类型:0800表示网络层使用IP 协议,0806表示网络层使用ARP 协议,8137表示网络层使用Novell IPX 协议,809b 表示网络层使用Apple Talk 协议。
4. 数据字段IEEE 802.3协议规定数据的长度在46~1500B 之间。
如果数据的长度少于46B ,需要加填充字节,补充到46B 。
填充字节是任意的,不计入长度字段中。
帧头部分长度为18B ,包括6B 的目的地址字段,6B 的源地址字段,2B 的类型字段和4B 的帧校验和字段,而前导码与帧前界定符不计入帧头长度中,那 么,Ehternet 帧的最小长度为64B (46B+18B ),最大长度为1518B (1500B+18B )。
设置最小帧长度的一个目的是使每个接收节点 能够有足够的时间检测到冲突5. 帧校验字段帧校验字段FCS 采用32位CRC 校验。
校验的范围包括目的地址字段、源地址字段、长度字段、LLC 数据字段。
在接收端进行校验,如果发现错误,帧将被丢弃。
8位CRC 校验的生成多项式为:1)(128+++=x x x x G2. 2主要问题问题一:文件的读写操作由于Ethernet 帧数据需要从输入文件获得,而数据字段内容也需要写入输出文件,因此首先要完成对文件的相关操作。
问题二:解析帧的头部字段在完成Ethernet 帧解析的过程中,首先要进行的是帧头部的解析。
这是只需将前导码、帧前定界符、目标地址、眼地址、长度字段的值,根据每个字段的规定长度依次读取。
问题三:解析数据字段在进行帧的数据字段的解析过程中,需要注意的问题是数据字段的长度。
IEEE802.3标准规定帧数据字段的最小长度为46字节,最大长度为1500字节。
如果数据长度小于46字节,需要填充“0”来补足46字节,但这些“0”不计入长度字段。
3 详细设计#include"stdafx.h"#include<fstream>#include<iostream>#include<cstring>using namespace std;int _tmain(int argc, _TCHAR* argv[]){if(argc!=3){cout<<endl<<"请按一下格式输入命令行:FrameParse input_file output_file"<<endl;//return 1;}fstream outfile;outfile.open(argv[2],ios::in|ios::out|ios::binary|ios::trunc);fstream infile;infile.open(argv[1],ios::in|ios::binary/*|ios::trunc*/);if(!infile.is_open()){cout<<endl<<"无法打开文件"<<endl;return 1;}bool bframe=1;int nframes=0;int nframenum=0;int nframelen=0;while(bframe){nframenum++;cout<<endl<<"帧"<<nframenum<<"开始解析?"<<endl;nframes=infile.tellg();for(int i=0;i<7;i++)if(infile.get()!=0xaa){cout<<"没找到合法的帧?"<<endl;infile.close();return 1;}if(infile.get()!=0xab){cout<<"没找到合法的帧?"<<endl;infile.close();return 1;}infile.seekg(nframes,ios::beg);cout<<endl<<"前导码:";for(int i=0;i<7;i++)cout<<hex<<infile.get()<<dec<<"";cout<<endl<<"帧前定界符:";cout<<hex<<infile.get();cout<<endl<<"目的地址:";for(int i=0;i<6;i++){cout<<hex<<infile.get()<<dec;if(i!=5)cout<<"-";}cout<<endl<<"源地址:";for(int i=0;i<6;i++){cout<<hex<<infile.get()<<dec;if(i!=5)cout<<"-";}cout<<endl<<"长度字段:";cout<<hex<<infile.get()<<"";nframelen=infile.get();cout<<endl<<nframelen;char* data=new char[nframelen];infile.read(data,nframelen);outfile.write(data,nframelen);cout<<endl<<"数据字段:";for(int i=0;i<nframelen;i++)cout<<data[i];delete data;if(nframelen<100)bframe=false;if(nframelen<46)for(int i=0;i<46-nframelen;i++)infile.get();cout<<endl<<"帧校验字段:";for(int i=0;i<4;i++)cout<<hex<<infile.get()<<dec<<"";cout<<endl;}cout<<endl<<"帧全部解析完成¨¦"<<endl;outfile.close();infile.close();return 1;}4测试报告由于没有封装帧,所以提示“无法打开输入文件”5.2 使用说明由于界面十分简单,按按钮文字提示执行即可,就不多说了。
6 项目评价6.1 项目总结该课程设计根据计算机网络编程指导书来具体实行。
6.2 心得体会在做这个课程设计之前,对于帧的结构是一片空白,找资料也比较仓促,导致程序有许多不足的地方,总的来说,通过课程设计,使得知识更加牢固。
附录一:参考书目一.《计算机网络(第五版)》谢希仁著清华大学出版社二.《计算机网络软件编程指导书》。