版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
CENTRALSOUTHUNIVERSITY网络工程实验报告学生姓名惠苗壮指导教师刘丽敏学院信息科学与工程学院专业班级计科0904班学号0909091627完成时间2012年05月30日
目录第一章设计目的、任务与要求 1.1设计目的······················································11.2设计的任务与要求··············································1第二章系统分析设计 2.1捕获原理分析··················································22.2数据包详细结构················································32.3主流程图······················································5第三章系统实现3.1WindowsSocket编程简介······································63.2报头数据结构定义·············································63.3程序具体实现················································73.4程序运行····················································12第四章心得体会 ·················································14参考文献···························································16附录·······························································17IP数据包的捕获与分析第二章系统分析设计设计目的、任务与要求1.1课程设计的目的:《计算机网络原理》课程是计算机科学与技术专业的重要专业课程之一。随着计算机网络技术的迅速发展和在当今信息社会中的广泛应用,给《计算机网络》课程的教学提出了新的更高的要求。计算机网络原理课程设计的目的与任务是为了使学生在课程学习的同时,通过在一个计算机网络环境中的实际操作,巩固《计算机网络原理》课堂教学所讲授网络的基本理论、基本概念和方法技术,对现代计算机网络的基本功能有一个初步的了解。为学生今后使用计算机网络的理论和方法,开发大型、复杂的集成系统,打下一个坚实的基础.1.2课程设计的任务与要求:课程设计的基本要求是:1.通过课程设计实践,理解计算机网络原理的基本要点;2.通过课程设计实践,要求学生对于网络的相关协议有深入的掌握,通过实验加深对计算机网络工作原理的理解,学会使用网络软件开发工具,培养学生的自学能力和开发网络系统软件的能力,并训练软件工程的开发方法。3.通过课程设计实践,进一步培养学生综合开发网络软件的能力,培养团队合作的能力,重点在网络应用软件的开发。4.整个课程设计要求学生按软件工程原理进行组织,文档和参考文献必须规范、齐全。1.3IP数据包的捕获与分析的基本要求:本次实验的要求在网络环境,使用VC++编写程序实现捕获网络中的IP数据包,解析数据包的内容,将结果显示在标准输出上,并同时写入日志文件。程序的具体要求如下:l)以命令行形式运行:ipparselogfile,其中Ipparse是程序名,而logfile则代表记录结果的日志文件。2)在标准输出和日志文件中写入捕获的IP包的版本、头长度、服务类型、数据包总长度、数据包标识、分段标志、分段偏移值、生存时间、上层协议类型、头校验和、源IP地址和目的IP地址等内容。3)当程序接收到键盘输入Ctrl+C时退出。系统分析设计2.1数据包捕获的原理分析:
以太网(Ethernet)具有共享介质的特征,信息是以明文的形式在网络上传输,当网络适配器设置为监听模式(混杂模式,Promiscuous)时,由于采用以太网广播信道争用的方式,使得监听系统与正常通信的网络能够并联连接,并可以捕获任何一个在同一冲突域上传输的数据包。IEEE802.3标准的以太网采用的是持续CSMA的方式,正是由于以太网采用这种广播信道争用的方式,使得各个站点可以获得其他站点发送的数据。运用这一原理使信息捕获系统能够拦截的我们所要的信息,这是捕获数据包的物理基础。
以太网是一种总线型的网络,从逻辑上来看是由一条总线和多个连接在总线上的站点所组成各个站点采用上面提到的CSMA/CD协议进行信道的争用和共享。每个站点(这里特指计算机通过的接口卡)网卡来实现这种功能。网卡主要的工作是完成对于总线当前状态的探测,确定是否进行数据的传送,判断每个物理数据帧目的地是否为本站地址,如果不匹配,则说明不是发送到本站的而将它丢弃。如果是的话,接收该数据帧,进行物理数据帧的CRC校验,然后将数据帧提交给LLC子层。
网卡具有如下的几种工作模式:
1)广播模式(BroadCastModel):它的物理地址(MAC)地址是0Xffffff的帧为广播帧,工作在广播模式的网卡接收广播帧。
2)多播传送(MultiCastModel):多播传送地址作为目的物理地址的帧可以被组内的其它主机同时接收,而组外主机却接收不到。但是,如果将网卡设置为多播传送模式,它可以接收所有的多播传送帧,而不论它是不是组内成员。
3)直接模式(DirectModel):工作在直接模式下的网卡只接收目地址是自己Mac地址的帧。
4)混杂模式(PromiscuousModel):工作在混杂模式下的网卡接收所有的流过网卡的帧,信包捕获程序就是在这种模式下运行的。
网卡的缺省工作模式包含广播模式和直接模式,即它只接收广播帧和发给自己的帧。如果采用混杂模式,一个站点的网卡将接受同一网络内所有站点所发送的数据包这样就可以到达对于网络信息监视捕获的目的。2.2网络数据包的结构为:DLC数据帧头:IP数据报结构:TCP数据包结构:UDP数据报结构:ICMP数据报结构:IGMP数据报结构:2.3主流程图:IP数据包的捕获与分析第三章系统实现第三章系统实现3.1WindowsSocket编程简介TCP/IP协议与WinSock网络编程接口的关系
WinSock并不是一种网络协议,它只是一个网络编程接口,也就是说,它不是协议,但是它可以访问很多种网络协议,你可以把他当作一些协议的封装。现在的WinSock已经基本上实现了与协议无关。你可以使用WinSock来调用多种协议的功能。那么,WinSock和TCP/IP协议到底是什么关系呢?实际上,WinSock就是TCP/IP协议的一种封装,你可以通过调用WinSock的接口函数来调用TCP/IP的各种功能.例如我想用TCP/IP协议发送数据,你就可以使用WinSock的接口函数Send()来调用TCP/IP的发送数据功能,至于具体怎么发送数据,WinSock已经帮你封装好了这种功能。3.2报头数据结构的定义:typedefstruct_IP_HEADER{ union { BYTEVersion; BYTEHdrLen; }; BYTEServiceType; WORDTotalLen; WORDID; union { WORDFlags; WORDFragoff; }; BYTETimeToLive; BYTEProtocol; WORDHdrChksum; DWORDSrcAddr; DWORDDstAddr; BYTEOptions;}IP_HEADER;3.3程序的具体实现:1.启动winsock使用函数WSAStartup()完成winsock的启动if(WSAStartup(MAKEWORD(2,2),&wsData)!=0) { printf("WSAStartupfailed!\n"); return-1; }2.初始化socket的创建 SOCKETsock;WSADATAwsData; ofstreamofs("ip.log",ios::app); if(WSAStartup(MAKEWORD(2,2),&wsData)!=0) { printf("WSAStartupfailed!\n"); return-1; } if((sock=socket(AF_INET,SOCK_RAW,IPPROTO_IP))==INVALID_SOCKET) { printf("createsocketfailed\n"); return-1; } BOOLflag=true; if(setsockopt(sock,IPPROTO_IP,IP_HDRINCL,(char*)&flag,sizeof(flag))==SOCKET_ERROR) { printf("setsockoptfailed!\n"); return-1; } charhostName[128]; if(gethostname(hostName,100)==SOCKET_ERROR) { printf("gethostnamefailed!\n"); return-1; } hostent*pHostIP; if((pHostIP=gethostbyname(hostName))==NULL) { printf("gethostbynamefailed\n"); return-1; }3.初始化socket的绑定:sockaddr_inaddr_in; addr_in.sin_addr=*(in_addr*)pHostIP->h_addr_list[0]; addr_in.sin_family=AF_INET; addr_in.sin_port=htons(6000); if(bind(sock,(PSOCKADDR)&addr_in,sizeof(addr_in))==SOCKET_ERROR) { printf("bindfailed\n"); return-1; }4.设置网卡的混杂模式:#defineIO_RCVALL_WSAIOW(IOC_VENDOR,1)DWORDdwBufferLen[10]; DWORDdwBufferInLen=1; DWORDdwBytesReturned=0; charbuffer[100]; if(WSAIoctl(sock,IO_RCVALL,&dwBufferInLen,sizeof(dwBufferInLen), &dwBufferLen,sizeof(dwBufferLen),&dwBytesReturned,NULL,NULL)==SOCKET_ERROR) { printf("ioctlsocketfaild\n"); return-1; }5.用户按下Ctrl+C,终止程序的实现。对于程序来说,要时时处于抓包状态,对于用户来说又要随时能结束程序。所以在实现该功能时,我使用了线程技术,即通过主线程以外的另一个进程,来控制主进程中的抓包循环。从而,既保证了程序的实时性,又不影响抓包。6.日志文件的实现定义一个C++输出流,利用write函数,将操作逐步写入文件即可。while(true) { intsize=recv(sock,buffer,sizeof(buffer),0); IP_HEADERip=*(IP_HEADER*)buffer; cout<<""<<endl; s+="\n\n"; cout<<"Version:"<<(ip.Version>>4)<<endl; _itoa(ip.Version>>4,buffer1,10); s+="Version:"; s+=buffer1; s+="\n"; cout<<"IHL:"<<((ip.HdrLen&0x0f)*4)<<endl; s+="IHL:"; _itoa((ip.HdrLen&0x0f)*4,buffer1,10); s+=buffer1; s+="\n"; cout<<"Typeofservice:Priority"<<(ip.ServiceType>>5)<< ",Service"<<((ip.ServiceType>>1)&0x0f)<<endl; s+="Typeofservice:Priority";_itoa(ip.ServiceType>>5,buffer1,10); s+=buffer1;s+=",Service";_itoa((ip.ServiceType>>1)&0x0f,buffer1,10); s+=buffer1; s+="\n"; cout<<"TOtalLength:"<<ip.TotalLen<<endl; s+="TOtalLength:";_itoa(ip.TotalLen,buffer1,10); s+=buffer1; s+="\n"; cout<<"Identifcation:"<<ip.ID<<endl; s+="Identifcation:";_itoa(ip.ID,buffer1,10); s+=buffer1; s+="\n";cout<<"sign:"<<((ip.Flags>>15)&0x01)<<",DF="<< ((ip.Flags>>14)&0x01)<<",Mf="<<((ip.Flags>>13)&0x01)<<endl; s+="sign:";_itoa((ip.Flags>>15)&0x01,buffer1,10); s+=buffer1; s+=",DF=";_itoa((ip.Flags>>14)&0x01,buffer1,10);s+=buffer1; s+=",Mf=";_itoa((ip.Flags>>13)&0x01,buffer1,10);s+=buffer1; s+="\n"; cout<<"Fragmentoffset:"<<(ip.Fragoff&0x1fff)<<endl;s+="Fragmentoffset:";_itoa(ip.Fragoff&0x1fff,buffer1,10);s+=buffer1; s+="\n"; cout<<"Timetolive:"<<(int)ip.TimeToLive<<endl;s+="Timetolive:";_itoa((int)ip.TimeToLive,buffer1,10);s+=buffer1; s+="\n"; cout<<"Protocol:"<<(int)ip.Protocol<<endl; s+="Protocol:";_itoa((int)ip.Protocol,buffer1,10);s+=buffer1; s+="\n"; cout<<"HeaderChecksum:"<<ip.HdrChksum<<endl;s+="HeaderChecksum:";_itoa(ip.HdrChksum,buffer1,10);s+=buffer1; s+="\n"; cout<<"Sourceaddress:"<<inet_ntoa(*(in_addr*)&ip.SrcAddr)<<endl; s+="Sourceaddress:";s+=inet_ntoa(*(in_addr*)&ip.SrcAddr); s+="\n"; cout<<"Destinationaddress:"<<inet_ntoa(*(in_addr*)&ip.DstAddr)<<endl; s+="Destinationaddress:";s+=inet_ntoa(*(in_addr*)&ip.DstAddr); s+="\n"; p=&s[0]; ofs.write(p,strlen(p)); }3.4程序运行主页面:文件;IP数据包的捕获与分析第四章心得体会第四章心得体会这次的课程设计使我感触很深,学了一个学期的计算机网络,都不知道那些书上的知识是怎么应用在实践中,通过这次的课程设计我了解了很多以前似懂非懂的东西,然后在把书上的那些代码经过分析,应用在这次课程设计中,使感觉计算机网络真的是很有趣的一门课程。这次的课程设计,加强了我们动手、思考和解决问题的能力。巩固和加深了对网络编程的理解,提高综合运用本课程所学知识的能力。培养了我选用参考书,查阅手册及文献资料的能力。培养独立思考,深入研究,分析问题、解决问题的能力。通过课程设计,培养了我严肃认真的工作作风,逐步建立正确的生产观念、经济观念和全局观念。而且做课程设计同时也是对课本知识的巩固和加强,平时看课本时,有些问题就不是很能理解,做完课程设计,那些问题就迎刃而解了。而且还可以记住很多东西。认识来源于实践,实践是认识的动力和最终目的,实践是检验真理的唯一标准。所以这个期末测试之后的课程设计对我们的作用是非常大的。这次的课程设计使我懂得了理论与实际相结合是很非常重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能真正为社会服务,从而提高自己的实际动手能力和独立思考的能力。在整个设计过程中,构思是很花费时间的。调试时经常会遇到这样那样的错误,有的是因为粗心造成的语法错误。当然,很多也时用错了方法,总是实现不了。同时在设计的过程中发现了自己的不足之处,对以前所学过的知识理解得不够深刻,掌握得不够牢固。根据我在课程设计中遇到得问题,我将在以后的学习过程中注意以下几点:1、认真上好专业实验课,多在实践中锻炼自己。2、写程序的过程中要考虑周到,严密。3、在做设计的时候要有信心,有耐心,切勿浮躁。4、认真的学习课本知识,掌握课本中的知识点,并在此基础上学会灵活运用。5、在课余时间里多写程序,熟练掌握在调试程序的过程中所遇到的常见错误,以便能节省调试程序的时间。每个实验通常都要花费很久的时间才能理清一个程序的思路,而且要不断的调试程序才能把程序调试正确,同时还要做到界面的输出也是需要美化的。这次课程设计终于顺利完成了,在设计中遇到了很多专业知识问题,最后在老师的辛勤指导下,也完成了课程设计。通过这次的课程设计,让我更加了解到计算机网络的重要性。以及它对我们专业的网络方向发展发挥的作用。对我们而言,知识上的收获很重要,但精神上的丰收更加可喜。让我知道了学无止境的道理。我们每一个人永远不能满足于现有的成就,人生就像在爬山,一座山峰的后面还有更高的山峰在等着你。挫折是一份财富,经历是一份拥有。这次课程设计必将成为我人生旅途上一个非常美好的回忆!同时在做课程设计时要能够从多方面去考虑,去研究,用多种算法去实现要求。此次课程设计,学到了很多课内学不到的东西,比如独立思考解决问题,出现差错的随机应变,这些都让我受益非浅,今后的制作应该能够更轻松,自己也都能够解决并高质量的完成项目。最后,感谢这些天来,一直陪着我们,辛苦工作的指导刘丽敏老师,感谢您的无私奉献和辛勤教导,使我能得到进步,能够取得成功,感谢您!参考文献:[1]AndrewS.Tanenbaum.计算机网络.清华大学,1998,32.[2]网站IP数据包的捕获与分析附录附录;程序源代码如下:#include"winsock2.h"#include"ws2tcpip.h"#include<windows.h>#include<fstream>#include<iostream>#pragmacomment(lib,"ws2_32")usingnamespacestd;typedefstruct_IP_HEADER{ union { BYTEVersion; BYTEHdrLen; }; BYTEServiceType; WORDTotalLen; WORDID; union { WORDFlags; WORDFragoff; }; BYTETimeToLive; BYTEProtocol; WORDHdrChksum; DWORDSrcAddr; DWORDDstAddr; BYTEOptions;}IP_HEADER;intmain(){ SOCKETsock;WSADATAwsData; ofstreamofs("ip.log",ios::app); if(WSAStartup(MAKEWORD(2,2),&wsData)!=0) { printf("WSAStartupfailed!\n"); return-1; } if((sock=socket(AF_INET,SOCK_RAW,IPPROTO_IP))==INVALID_SOCKET) { printf("createsocketfailed\n"); return-1; } BOOLflag=true; if(setsockopt(sock,IPPROTO_IP,IP_HDRINCL,(char*)&flag,sizeof(flag))==SOCKET_ERROR) { printf("setsockoptfailed!\n"); return-1; } charhostName[128]; if(gethostname(hostName,100)==SOCKET_ERROR) { printf("gethostnamefailed!\n"); return-1; } hostent*pHostIP; if((pHostIP=gethostbyname(hostName))==NULL) { printf("gethostbynamefailed\n"); return-1; } sockaddr_inaddr_in; addr_in.sin_addr=*(in_addr*)pHostIP->h_addr_list[0]; addr_in.sin_family=AF_INET; addr_in.sin_port=htons(6000); if(bind(sock,(PSOCKADDR)&addr_in,sizeof(addr_in))==SOCKET_ERROR) { printf("bindfailed\n"); return-1; }#defineIO_RCVALL_WSAIOW(IOC_VENDOR,1)DWORDdwBufferLen[10]; DWORDdwBufferInLen=1; DWORDdwBytesReturned=0; charbuffer[100]; if(WSAIoctl(sock,IO_RCVALL,&dwBufferInLen,sizeof(dwBufferInLen), &dwBufferLen,sizeof(dwBufferLen),&dwBytesReturned,NULL,NULL)==SOCKET_ERROR) { printf("ioctlsocketfaild\n"); return-1; } printf("AnalysisIPPacket!\n\n"); strings; char*p; charbuffer1[100]; while(true) { intsize=recv(sock,buffer,sizeof(buffer),0); IP_HEADERip=*(IP_HEADER*)buffer; cout<<""<<endl; s+="\n\n"; cout<<"Version:"<<(ip.Version>>4)<<endl; _itoa(ip.Version>>4,buffer1,10); s+="Version:"; s+=buffer1; s+="\n"; cout<<"IHL:"<<((ip.HdrLen&0x0f)*4)<<endl; s+="IHL:"; _itoa((ip.HdrLen&0x0f)*4,buffer1,10); s+=buffer1; s+="\n"; cout<<"Typeofservice:Priority"<<(ip.ServiceType>>5)<< ",Service"<<((ip.ServiceType>>1)&0x0f)<<endl; s+="Typeofservice:Priority";_itoa(ip.ServiceType>>5,buffer1,10); s+=buffer1;s+=",Service";_itoa((ip.ServiceType>>1)&0x0f,buffer1,10); s+=buffer1; s+="\n"; cout<<"TOtalLength:"<<ip.TotalLen<<endl; s+="TOtalLength:";_itoa(ip.TotalLen,buffer1,10); s+=buffer1; s+="\n"; cout<<"Identifcation:"<<ip.ID<<endl; s+="Identifcation:";_itoa(ip.ID,buffer1,10); s+=buffer1; s+="\n";
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- Hive面试核心问题及答案呈现
- 2026年寒假作业科学素养培养方案
- 2026年荷兰猪VC缓释粮分析
- 蓼莪相关测试题及参考答案
- 包装技术考卷题目和答案
- 面向企业领导招聘的题目及对应答案
- 尘肺病培训测评试题及答案展示
- 2026年《煤矿安全规程》考试试卷及答案
- 会计测试题目及答案大全
- 口腔中级专业试题及答案
- 游戏陪玩平台运营及服务提升方案设计
- 亲属关系课件
- 装载机安全管理办法
- 2024年高考(江西卷)地理真题(学生版+解析版)
- 工作照片拍摄培训课件
- 体育术科高考备考方案
- 叠合板吊装专项方案
- 电梯安装施工方案
- DL∕T 1576-2016 6kV~35kV电缆振荡波局部放电测试方法
- 女病人导尿术操作及评分标准
- 风湿免疫疾病的心理应激与心理干预
评论
0/150
提交评论