第一题-编写C++程序输出IP数据包并检验IP数据包正确性---郭照凯

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

编写C++程序输出IP数据包并检验IP数据包正确性郭照凯南开大学通信工程专业摘要:本文主要通过编写C++程序来输出网络数据包中的MAC帧以及IP首部的各个字段信息。数据包本来是用input文件,但其验证有问题,所以就通过由Wireshark捕获新的数据包。编写程序运行后,程序输出的各个字段与Wireshark的分析对比,验证程序的正确性关键词:C++;Wireshark;MAC帧;IP首部Abstract:ThispapermainlybywritingC++programtooutputnetworkpacketsintheMACframesandIPheaderinformationinvariousfields.Packetisinputfileshavebeen,buttheverificationproblem,soWiresharkcapturebythenewdatapacket.Writeaprogramrunning,theprogramoutputanalysisofthevariousfieldsincomparisonwithWiresharktoverifythecorrectnessoftheprogram.Keywords:C++;Wireshark;MACframe;IPheader0引言协议是两个实体之间用于交换数据的一组规则。协议通常是按照各个功能划分的,而各个功能又对应不同的层次,上层对应用户层,下层是服务提供层,国际标准化组织(InternationalStandardsOrganization,ISO)的SC16委员会在1978年3月提出开放式互联系统(OpenSystemsInterconnection,OSI)参考模型作为第一个计算机网络的体系的国际标准,目前在互联网上最为广泛应用的TCP/IP模型也是国际标准之一。TCP/IP协议是Internet最基本的协议、Internet国际互联网络的基础,由网络层的IP协议和传输层的TCP协议组成。了解并且掌握协议的结构,以及各个字段的含义,有助于更好的理解各个协议的原理。本文则通过编写C++程序来对IP数据包进行解析,并与wireshark捕获的内容进行对比验证其正确性。1wireshark导出数据文件老师给的input文件打开之后如下图所示,可以看得出,这是一个十六进制文件。前七个字节的AA是前导码,AB是帧前定界符,FFFFFFFFFFFF是目的MAC地址,0027E3B4FCDE是源MAC地址,之后的0083不是标志着帧的类型,那么应该标志着帧的长度。数一下,到6E刚好是83(10进制是131),还剩4个字节,刚好是帧校验序列长(FCS)。之后又是7个字节AA,又开始一个新帧。从最右边的该16进制的文本表示中也可看出。因此input里没有IP数据报。图片1所以,我们用wireshark重新捕获数据包并导出。Wireshark是目前世界上最受欢迎的一款免费开放的协议分析软件,可以用它来捕获网络上数据包并且将其翻译为人们容易读懂的文字和图标形式,极大地方便了对网络活动的检测分析和教学实验。我们通过登录我校BT网站得到data数据文件为例,步骤如下:1)打开Wireshark,选择capture-interface-start开始捕包。图片22)登录bt.nankai.edu.cn我们可以马上得到如下的数据包:图片3值得提到的是本来是出现很多的数据包的,其中有很多都不是我们所需要的,之所以由以上的结果是因为我们在Filter(过滤)里面打上了ip.addr==202.113.16.214。202.113.16.214是bt的IP号,是在命令行界面打pingbt.nankai.edu.cn得到的。图片4而如果在命令行打入ping,经验证得不到百度的IP号,这也是我们选择学校的内网网址的原因。图片53)选择数据包进行导出。选中我们要导出的数据包,依次点选菜单目录下的file-export-file.出现如下界面:图片6在左下角点选Selectedpacket,保存类型选择CArrays,以文件名data保存到D盘。4)打开D盘的data文件,删去头尾不符合C++引用文件的内容,并将“,”全部替换为“”,并保存文件。data文件截图如下:图片72IP数据报包首部校验和原理说明虽然说IP协议提供的是不可靠无连接的传输方式,但是在IP首部中还有一个字段——首部校验和,用来检测IP数据报首部的正确性,对IP数据报首部进行校验。校验和或称检验和,通常用于对数据块的校验,它把数据块的每两个字节按二进制加法进行循环求和。基本原理如下图:图片83编写程序并验证IP数据包的正确性编写C++程序如下:#includefstream#includeiostream#includeiomanip#includeWinsock2.husingnamespacestd;structeth_header{unsignedchareth_dst[6];unsignedchareth_src[6];unsignedshortupper_pro;};//mac头共14字节structip_header{union{unsignedcharversion;//4bitsunsignedcharihl;//4bits};unsignedchartos;//1字节unsignedshorttotal_len;//2字节unsignedshortidentifer;//2字节union{unsignedshortflags;//3bitsunsignedshortoffset;//13bits};unsignedcharTTL;//1字节unsignedcharprotocol;//1字节unsignedshortchecksum;//2字节unsignedcharip_src[4];//4字节unsignedcharip_dst[4];//4字节unsignedintoption;//option加填充共为32bits在此处把这四个字节看成一个字段};voidmain()//程序主函数,实现所有功能{inttemp[38];ifstreaminfile(D:\\data);//打开文件for(inti=0;i38;i++){infilehextemp[i];}infile.close();structeth_headereth;//定义帧头结构变量structip_headerip;//定义Ip头部结构变量//以下给mac帧头变量赋值for(inti=0;i6;i++){eth.eth_dst[i]=(unsignedchar)temp[i];}for(inti=6;i12;i++){eth.eth_src[i-6]=(unsignedchar)temp[i];}eth.upper_pro=(temp[12]8)|temp[13];//以下给ip头部变量赋值ip.version=(unsignedchar)temp[14];ip.tos=(unsignedchar)temp[15];ip.total_len=(temp[16]8)|temp[17];ip.identifer=(temp[18]8)|temp[19];ip.flags=(unsignedshort)(temp[20]8)|(temp[21]);ip.TTL=(unsignedchar)temp[22];ip.protocol=(unsignedchar)temp[23];ip.checksum=(temp[24]8)|temp[25];for(inti=26;i30;i++){ip.ip_src[i-26]=(unsignedchar)temp[i];}for(inti=30;i34;i++){ip.ip_dst[i-30]=(unsignedchar)temp[i];}//以下输出mac头部信息cout输出mac帧头部信息(十六进制):endl;cout目的mac地址为:;for(inti=0;i5;i++){coutsetfill('0')setw(2)hex(int)eth.eth_dst[i]-;}coutsetfill('0')setw(2)hex(int)eth.eth_dst[5]endl;cout源mac地址为:;for(inti=0;i5;i++){coutsetfill('0')setw(2)hex(int)eth.eth_src[i]-;}coutsetfill('0')setw(2)hex(int)eth.eth_src[5]endl;cout上层协议类型为:;coutsetfill('0')setw(4)hexeth.upper_proendl;cout----------------------------endl;//以下输出ip头部信息cout输出ip头部信息(十进制):endl;cout版本:dec(ip.version4)endl;ip.ihl=ip.version&0x0f;coutip头部长度(ihl):(ip.ihl*4)endl;cout服务类型:(int)ip.tos(优先权子字段:(ip.tos5)tos子字段:((ip.tos1)&0x0f))endl;cout总长度:(int)ip.total_lenendl;cout标识符:(int)ip.identiferendl;cout片偏移:(ip.offset&0x1fff)endl;cout生存期:(int)ip.TTLendl;cout协议:(int)ip.protocolendl;cout首部检校和:(int)ip.checksumendl;cout源ip地址:;for(inti=0;i3;i++){cout(int)ip.ip_src[i].;}cout(int)ip.ip_src[3]endl;cout目的ip地址:;for(inti=0;i3;i++){cout(int)ip.ip_dst[i].;}cout(int)ip.ip_src[3]endl;//以下验证有没有选项字段if(ip.ihl==5){cout没有选项字段endl;for(inti=34;i38;i++){temp[i]=0;}}else{ip.option=(unsignedint)(temp[34]24)|(temp[35]16)|(temp[36]8)|temp[37];cout选项:(int)ip.optionendl;//如果有选项字段将选项和填充一起输出}cout------------------------endl;//以下验证ip数据包头部的正确性unsignedshortm1,m2,sum;unsignedintsum1=0;for(inti=14;i37;i=i+2){m1=(unsignedshort)(temp[i]8);m2=(unsignedshort)temp[i+1];sum=m1|m2;sum1+=sum;}sum1=(sum116)+(sum1&0xffff);//oxffff截掉进位那一位sum1=(sum116)+(sum1&0xffff);sum1=(unsignedshort)~sum1;if(sum1==0){coutip数据包是正确的endl;}else{coutip数据包是错误的en

1 / 9
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功