当前位置:文档之家› 计算机网络抓包课程设计

计算机网络抓包课程设计

课程设计报告课程:计算机通信与网络题目:网络流量解析程序的实现学号:姓名:一、任务描述 (3)二、win dump的安装和使用 (3)三、win dump文件格式 (3)四、程序实现 (6)(1)算法() (6)(2)编码中的关键问题 (6)(3)头文件 (6)(4)源文件 (7)五、总结 (10)一、任务描述编写一个网络流量解析程序输入:由“ Win dump- W抓取的二进制流量文件输出:文件中所有IP报文主要字段的信息时间戳源IP目的IP高层协议总长度二、windump的安装和使用(一)找到windump官方网站(二)下载同一版本的winpcap和windump (三)先安装win dump动态链接库(四)Win dump是个命令行程序三、win dump文件格式抓取的每个链路层帧都被附加16字节的数据包头,其中8~11是帧在文件中的存储长度或抓取长度,12~15则是该帧的实际长度(按照编程的习惯,从0开始数)。

由于抓取的时候可能发生截取,两个值可能不一致,使用-s 0抓取的话,两个值相同。

假设第一个数据包头的8~11字节是60 00 00 00 (十六进制),当读取顺序为“D4 C3 B2 A1”时,表示整数值0X00 00 00 60,即十进制数96。

则意味着从40字节开始的96个字节是第一个帧的抓取。

链路层数据的1273字节=0X0800IP数据报首咅13数据部分IP数据报四、程序实现(1)算法()解析程序的算法流程(2)编码中的关键问题如何读取二进制文件,如何输出文本文件如何将二进制数据以十进制形式输出(3)头文件#in clude<iostream>#in clude<fstream>(4)源文件#in clude<iostream>#in clude<fstream>using n amespace std;int read(){ ifstream inf(” f3.dat",ios::b in ary);if(!i nf){cout<<"ca n't ope n in put file\n,";exit(1);}char ch;int coun t=0;int c=0;int n=0;int p=0;int i=0;int s=24;int w=0;un sig ned char m;un sig ned char b;//in f.seekg(54,ios::beg);ofstream out;out.ope n( "e:\\test.txt");for(i=0;i<10;i++){in f.seekg(s+8,ios::beg);in f.get(ch);b=ch;int a=(i nt)b;cout<<"数据包长度"<<endl;out<<"数据包长度"<<'';cout<<a<<e ndl;w=a;in f.seekg(s+30,ios::beg);out<<a<<' '<<e ndl;〃system("pause");//in f.get(ch);b=ch;a=(i nt)b;cout<<a<<e ndl; in f.get(ch);b=ch;m=b>>4;a=(i nt)m;cout<<"版本"<<a<<e ndl;out<<"版本"<<a<<endl;b=ch;m=b&15;a=(i nt)m;cout<<"首部长度"<<a<<endl;out<<"首部长度"<<a<<endl;in f.get(ch);b=ch;a=(i nt)b;cout<<"区分服务"<<a<<endl;out<<"区分服务"<<a<<endl;in f.get(ch);b=ch;a=(i nt)b*16*16;in f.get(ch);b=ch;c=(i nt)b;n=c+a;cout<<"总长度"<<n<<endl;out<<"总长度"<<n<<endl;in f.get(ch);b=ch;a=(i nt)b*16*16;in f.get(ch);b=ch;c=(i nt)b;n=c+a;cout<<"标识"<<n<<endl;out<<"标识"<<n<<endl;in f.get(ch);b=ch;m=b>>4;a=(i nt)m;cout<<"标志"<<a<<endl;out<<"标志"<<a<<e ndl;in f.get(ch);in f.get(ch);b=ch;a=(i nt)b;cout<<"生存时间"<<a<<endl;out<<"生存时间"<<a<<endl;in f.get(ch);b=ch;a=(i nt)b;cout<<"协议"<<a<<endl;out<<"协议"<<a<<endl;in f.get(ch);b=ch;c=(i nt)b*16*16;in f.get(ch);b=ch;a=(i nt)b;n=a+c;cout<<"首部校验和"<<n<<endl;out<<"首部校验和"<<n<<endl;in f.get(ch);b=ch;a=(i nt)b;in f.get(ch);b=ch;c=(i nt)b;in f.get(ch);b=ch;n=(i nt)b;in f.get(ch);b=ch;p=(i nt)b;cout<<"源地址"<<a<<'.'<<c<<'.'<<n<<'.'<<p<<endl; out<<"源地址"<<a<<'.'<<c<<'.'<<n<<'.'<<p<<endl; in f.get(ch);b=ch;a=(i nt)b;in f.get(ch);b=ch;c=(i nt)b;in f.get(ch);b=ch;n=(i nt)b;in f.get(ch);b=ch;p=(i nt)b;cout<<"目的地址"<<a<<'.'<<c<<'.'<<n<<'.'<<p<<endl;out<<"目的地址"<<a<<'.'<<c<<'.'<<n<<'.'<<p<<endl<<endl<<endl<<endl<<endl; s=s+16+w;}in f.close();return 0;}int mai n(){ cout<<"解析数据包"<<endl;getchar();read();return 0;}五、总结通过这次实验对网络中的数据包有了新的认识,了解了数据链路层帧的格式,以及帧头的14个字节分别是什么和IP数据包头的结构。

其次对win dump软件的操作更加熟悉,能够根据抓来的流量进行详细的分析。

在将解析好的IP数据报存入文件中时,由于存在非IP数据报使得大量的IP[]数组浪费同时也使得读出IP 数据报的文件中有异常数据(体现在空数组的初始化)。

由于是单个字节的读入二进制文件,所以程序并未实现将文件的所有内容一次性都读入内存而是采取认为的选定长度,而数据报的解析通样是使用人为的输入解析个数来惊喜解析,这使得程序的功能不是那么强大、完整。

相关主题