网络协议分析论文.docx
- 文档编号:15799989
- 上传时间:2023-07-07
- 格式:DOCX
- 页数:40
- 大小:172.13KB
网络协议分析论文.docx
《网络协议分析论文.docx》由会员分享,可在线阅读,更多相关《网络协议分析论文.docx(40页珍藏版)》请在冰点文库上搜索。
网络协议分析论文
学生毕业设计(论文)
开题报告书
课题名称
网络协议分析
姓名
学号
0406401*20
院、系、部
计算机科学与技术系
专业
网络工程
指导教师
2008年5月25日
材料清单
1、毕业设计(论文)课题任务书
2、毕业设计(论文)开题报告
3、指导教师评阅表
4、评阅教师评阅表
5、答辩及最终成绩评定表
6、毕业设计说明书
7、附录材料
湖南城市学院
2008届毕业设计说明书
网络协议分析
院(系)、部:
计算机科学系
学生姓名:
指导教师:
职称讲师
专业:
计算机科学与技术
班级:
0406401班
完成时间:
2008年5月20日
摘要
嗅探器就是能够捕获网络报文的设备。
嗅探器的正当用处在于分析网络的流量,以便找出所关心的网络中潜在的问题。
例如,假设网络的某一段运行得不是很好,报文的发送比较慢,而我们又不知道问题出在什么地方,此时就可以用嗅探器来作出精确的问题判断。
嗅探器在功能和设计方面有很多不同。
有些只能分析一种协议,而另一些可能能够分析几百种协议。
Socket是Windows下网络编程的标准接口,它允许两个或多个应用程序在相同机器上,或者是通过网络互相交流。
关键词嗅探器;多线程;Socket;VisualC++6.0;MFC
ABSTRACT
Sniffernetworkisabletocapturethetextontheequipment.Snifferisthelegitimateuseofnetworktraffic,inordertoidentifytheconcernsofpotentialproblemsinthenetwork.Forexample,ifacertainperiodofoperationofthenetworkisnotaverygood,tosendthetextmoreslowly,butwedonotknowthattheprobleminanyplaceatthistimecanbeusedsniffertomakeaccuratejudgementoftheissue.
Snifferinfunctionanddesignofalotofdifferent.Somecanonlybeofanagreement,whileothersmaybeabletoanalysisofhundredsofagreement.
SocketnetworkprogrammingunderWindowsisthestandardinterface,whichallowstwoormoreapplicationsinthesamemachine,orthroughtheInternetexchange.
Keywordssnifffer;multithreading;Socket;VisualC++6.0;MFC
目录
摘要16
1前言19
1.1项目开发背景19
1.2项目开发目标19
1.3几个关键技术19
1.3.1多线程编程19
1.3.2Socket编程20
1.3.3MFC编程20
2开发工具VisualC++简介22
3需求分析25
3.1整体需求分析25
3.2具体应用分析25
3.2.1网络抓包及协议分析需求分析25
3.2.2本地网络信息获取需求分析25
3.2.3端口扫描需求分析25
3.2.4域名查询需求分析26
3.3可行性研究26
3.3.1技术方面26
3.3.2经济方面26
3.3.3工作难点26
4.系统总体结构设计27
4.1软件模块结构设计27
4.1.1软件工作模式图27
4.1.2软件模块结构图27
5.系统详细设计30
5.1嗅探器30
5.1.1嗅探器简介31
5.1.2界面设计30
5.1.3程序流程图30
5.1.4主要代码分析31
5.2本地网络信息浏览33
5.2.1界面设计33
5.2.2程序流程图34
5.2.3主要代码分析34
5.3端口扫描36
5.3.1界面设计36
5.3.2程序流程图37
5.3.3主要代码分析37
5.4域名分析37
5.4.1主要代码分析37
6系统的安装与调试40
6.1系统的安装40
6.2系统的调试41
7结束语42
参考文献43
致谢44
附录45
1前言
1.1项目开发背景
随着计算机网络的不断普及,网络管理的应用需求越来越大,而嗅探器很早就在此领域发挥着重要的作用。
嗅探器的种类繁多,有的是专门的某一个协议的分析器,有的则具有强大的功能,如非常著名的Ethereal,NetXRay和Sniffer等。
而这些大型的嗅探器需要昂贵的价格购买,对于小型网络则有“大材小用”之弊。
所以,针对小型网络的简易实用的嗅探器应运而生。
这里,我们的网络协议分析工具就是应用于小型局域网的管理,对其进行基于数据抓包的监控,包括本地局域网行为的实时查看,从而满足小型局域网如学校机房,公司部门,政府单位等这样规模的网络的监管及网络信息获取。
1.2项目开发目标
本项目开发的目标是开发出实用于规模不大的局域网的监控于管理。
监控就是实时对网络的行为进行监视从而获取采取控制行为所需的信息。
管理是基于网络信息的掌握而产生的,我们提供了本地网络信息快速获取的工具,域名查询的实用工具,以观察本地主机的行为,另外我们还提供了端口扫描的功能,使监视能力更加强大。
总之,我们的开发目标是满足小型网络的信息获取和行为监管。
1.3几个关键技术
1.3.1多线程编程
(1)多线程处理的优点
同步应用程序的开发比较容易,但由于需要在上一个任务完成后才能开始新的任务,所以其效率通常比多线程应用程序低。
如果完成同步任务所用的时间比预计时间长,应用程序可能会不响应。
多线程处理可以同时运行多个过程。
例如,文字处理器应用程序在您处理文档的同时,可以检查拼写(作为单独的任务)。
由于多线程应用程序将程序划分成独立的任务,因此可以在以下方面显著提高性能:
·多线程技术使程序的响应速度更快,因为用户界面可以在进行其他工作的同时一直处于活动状态。
·当前没有进行处理的任务可以将处理器时间让给其他任务。
·占用大量处理时间的任务可以定期将处理器时间让给其他任务。
·可以随时停止任务。
·可以分别设置各个任务的优先级以优化性能。
是否需要创建多线程应用程序取决于多个因素。
在以下情况下,最适合采用多线程处理:
·耗时或大量占用处理器的任务阻塞用户界面操作。
·各个任务必须等待外部资源(如远程文件或Internet连接)。
例如,用于跟踪Web页上的链接并下载满足特定条件的文件的Internet应用程序“robot”。
这种应用程序可以依次同步下载各个文件,也可以使用多线程同时下载多个文件。
多线程方法比同步方法的效率高很多,因为即使在某些线程中远程Web服务器的响应非常慢,也可以下载文件。
(2)多线程编程的难点
当多个线程之间有联系的时候,线程之间的同步控制就会成为一个难点,因为没有人能预期线程的被执行。
在一个合作型多任务系统中,操作系统必须得到程序的允许才能够改变线程。
但是在强制性多任务系统中,控制权被调度程序强制转移,也因此两个线程之间的执行次序变得不可预期。
这不可预期性造成了所谓的racecondition。
由于资源是共享的,有时还会出现死锁。
1.3.2Socket编程
Socket是Windows下网络编程的标准接口,它允许两个或多个应用程序在相同机器上,或者是通过网络互相交流。
这种Windows下的Socket简称Winsock,Winsock库有两个版本,Winsock1和Winsock2。
现在开发网络应用程序都使用Winsock2,需要在程序中包含头文件Winsock2.h,它包含了绝大部分socket函数和相关结构类型的声明和定义。
同时要添加的还有到WS2_32.lib库的链接。
包含必要的头文件,设置好链接环境之后,便可进行编码工作了。
(1)TCP/IP的socket提供下列三种类型套接字。
流式套接字(SOCK_STREAM):
提供了一个面向连接、可靠的数据传输服务,数据无差错、无重复地发送,且按发送顺序接收。
内设流量控制,避免数据流超限;数据被看作是字节流,无长度限制。
文件传送协议(FTP)即使用流式套接字。
数据报式套接字(SOCK_DGRAM):
提供了一个无连接服务。
数据包以独立包形式被发送,不提供无错保证,数据可能丢失或重复,并且接收顺序混乱。
网络文件系统(NFS)使用数据报式套接字。
原始式套接字(SOCK_RAW):
该接口允许对较低层协议,如IP、ICMP直接访问。
常用于检验新的协议实现或访问现有服务中配置的新设备。
(2)为了更好地说明套接字编程原理,下面给出几个基本套接字系统调用说明。
创建套接字──socket()
应用程序在使用套接字前,首先必须拥有一个套接字,系统调用socket()向应用程序提供创建套接字的手段,其调用格式如下:
SOCKETPASCALFARsocket(intaf,inttype,intprotocol);
该调用要接收三个参数:
af、type、protocol。
参数af指定通信发生的区域,UNIX系统支持的地址族有:
AF_UNIX、AF_INET、AF_NS等,而DOS、WINDOWS中仅支持AF_INET,它是网际网区域。
因此,地址族与协议族相同。
参数type描述要建立的套接字的类型。
参数protocol说明该套接字使用的特定协议,如果调用者不希望特别指定使用的协议,则置为0,使用默认的连接模式。
根据这三个参数建立一个套接字,并将相应的资源分配给它,同时返回一个整型套接字号。
指定本地地址──bind()
当一个套接字用socket()创建后,存在一个名字空间(地址族),但它没有被命名。
bind()将套接字地址(包括本地主机地址和本地端口地址)与所创建的套接字号联系起来,即将名字赋予套接字,以指定本地半相关。
其调用格式如下:
intPASCALFARbind(SOCKETs,conststructsockaddrFAR*name,intnamelen);
参数s是由socket()调用返回的并且未作连接的套接字描述符(套接字号)。
参数name是赋给套接字s的本地地址(名字),其长度可变,结构随通信域的不同而不同。
namelen表明了name的长度。
如果没有错误发生,bind()返回0。
否则返回值SOCKET_ERROR。
地址在建立套接字通信过程中起着重要作用,作为一个网络应用程序设计者对套接字地址结构必须有明确认识。
例如,UNIXBSD有一组描述套接字地址的数据结构,其中使用TCP/IP协议的地址结构为:
structsockaddr_in{
shortsin_family; /*AF_INET*/
u_shortsin_port; /*16位端口号,网络字节顺序*/
structin_addrsin_addr; /*32位IP地址,网络字节顺序*/
charsin_zero[8]; /*保留*/
}
建立套接字连接──connect()与accept()
这两个系统调用用于完成一个完整相关的建立,其中connect()用于建立连接。
无连接的套接字进程也可以调用connect(),但这时在进程之间没有实际的报文交换,调用将从本地操作系统直接返回。
这样做的优点是程序员不必为每一数据指定目的地址,而且如果收到的一个数据报,其目的端口未与任何套接字建立“连接”,便能判断该端口不可操作。
而accept()用于使服务器等待来自某客户进程的实际连接。
connect()的调用格式如下:
intPASCALFARconnect(SOCKETs,conststructsockaddrFAR*name,intnamelen);
参数s是欲建立连接的本地套接字描述符。
参数name指出说明对方套接字地址结构的指针。
对方套接字地址长度由namelen说明。
如果没有错误发生,connect()返回0。
否则返回值SOCKET_ERROR。
在面向连接的协议中,该调用导致本地系统和外部系统之间连接实际建立。
由于地址族总被包含在套接字地址结构的前两个字节中,并通过socket()调用与某个协议族相关。
因此bind()和connect()无须协议作为参数。
accept()的调用格式如下:
SOCKETPASCALFARaccept(SOCKETs,structsockaddrFAR*addr,intFAR*addrlen);
参数s为本地套接字描述符,在用做accept()调用的参数前应该先调用过listen()。
addr指向客户方套接字地址结构的指针,用来接收连接实体的地址。
addr的确切格式由套接字创建时建立的地址族决定。
addrlen为客户方套接字地址的长度(字节数)。
如果没有错误发生,accept()返回一个SOCKET类型的值,表示接收到的套接字的描述符。
否则返回值INVALID_SOCKET。
accept()用于面向连接服务器。
参数addr和addrlen存放客户方的地址信息。
调用前,参数addr指向一个初始值为空的地址结构,而addrlen的初始值为0;调用accept()后,服务器等待从编号为s的套接字上接受客户连接请求,而连接请求是由客户方的connect()调用发出的。
当有连接请求到达时,accept()调用将请求连接队列上的第一个客户方套接字地址及长度放入addr和addrlen,并创建一个与s有相同特性的新套接字号。
新的套接字可用于处理服务器并发请求。
四个套接字系统调用,socket()、bind()、connect()、accept(),可以完成一个完全五元相关的建立。
socket()指定五元组中的协议元,它的用法与是否为客户或服务器、是否面向连接无关。
bind()指定五元组中的本地二元,即本地主机地址和端口号,其用法与是否面向连接有关:
在服务器方,无论是否面向连接,均要调用bind();在客户方,若采用面向连接,则可以不调用bind(),而通过connect()自动完成。
若采用无连接,客户方必须使用bind()以获得一个唯一的地址。
以上讨论仅对客户/服务器模式而言,实际上套接字的使用是非常灵活的,唯一需遵循的原则是进程通信之前,必须建立完整的相关。
监听连接──listen()
此调用用于面向连接服务器,表明它愿意接收连接。
listen()需在accept()之前调用,其调用格式如下:
intPASCALFARlisten(SOCKETs,intbacklog);
参数s标识一个本地已建立、尚未连接的套接字号,服务器愿意从它上面接收请求。
backlog表示请求连接队列的最大长度,用于限制排队请求的个数,目前允许的最大值为5。
如果没有错误发生,listen()返回0。
否则它返回SOCKET_ERROR。
listen()在执行调用过程中可为没有调用过bind()的套接字s完成所必须的连接,并建立长度为backlog的请求连接队列。
调用listen()是服务器接收一个连接请求的四个步骤中的第三步。
它在调用socket()分配一个流套接字,且调用bind()给s赋于一个名字之后调用,而且一定要在accept()之前调用。
accept()调用为实现并发服务提供了极大方便,因为它要返回一个新的套接字号
数据传输──send()与recv()
当一个连接建立以后,就可以传输数据了。
常用的系统调用有send()和recv()。
send()调用用于在参数s指定的已连接的数据报或流套接字上发送输出数据,格式如下:
intPASCALFARsend(SOCKETs,constcharFAR*buf,intlen,intflags);
参数s为已连接的本地套接字描述符。
buf指向存有发送数据的缓冲区的指针,其长度由len指定。
flags指定传输控制方式,如是否发送带外数据等。
如果没有错误发生,send()返回总共发送的字节数。
否则它返回SOCKET_ERROR。
recv()调用用于在参数s指定的已连接的数据报或流套接字上接收输入数据,格式如下:
intPASCALFARrecv(SOCKETs,charFAR*buf,intlen,intflags);
参数s为已连接的套接字描述符。
buf指向接收输入数据缓冲区的指针,其长度由len指定。
flags指定传输控制方式,如是否接收带外数据等。
如果没有错误发生,recv()返回总共接收的字节数。
如果连接被关闭,返回0。
否则它返回SOCKET_ERROR。
输入/输出多路复用──select()
select()调用用来检测一个或多个套接字的状态。
对每一个套接字来说,这个调用可以请求读、写或错误状态方面的信息。
请求给定状态的套接字集合由一个fd_set结构指示。
在返回时,此结构被更新,以反映那些满足特定条件的套接字的子集,同时,select()调用返回满足条件的套接字的数目,其调用格式如下:
intPASCALFARselect(intnfds,fd_setFAR*readfds,fd_setFAR*writefds,fd_setFAR*exceptfds,conststructtimevalFAR*timeout);
参数nfds指明被检查的套接字描述符的值域,此变量一般被忽略。
参数readfds指向要做读检测的套接字描述符集合的指针,调用者希望从中读取数据。
参数writefds指向要做写检测的套接字描述符集合的指针。
exceptfds指向要检测是否出错的套接字描述符集合的指针。
timeout指向select()函数等待的最大时间,如果设为NULL则为阻塞操作。
select()返回包含在fd_set结构中已准备好的套接字描述符的总数目,或者是发生错误则返回SOCKET_ERROR。
使用TCP创建网络应用程序稍微复杂一些,因为TCP是面向连接的协议,需要通信双方首先建立一个连接,而UDP编程则相对简单些。
Winsock的编程步骤是比较固定的,一般分以下几个步骤:
套接字的创建和关闭;绑定套接字到指定的IP地址和端口号;设置套接字进入监听状态;接受连接请求;收发数据。
1.3.3MFC编程
如果你曾经使用过传统的windows编程方法开发应用程序,你会深刻地体会到,即使是开发一个简单的windows应用程序也需要对windows的编程原理有很深刻的认识,同时也要手工编写很多的代码。
因为程序的出错率几乎是随着代码长度的增加呈几何级数增长的,这就使得调试程序变得非常困难。
所以传统的windows编程是需要极大的耐心和丰富的编程经验的。
近几年来,面向对象技术无论是在理论还是实践上都在飞速地发展。
面向对象技术中最重要的就是“对象”的概念,它把现实世界中的气球、自行车等客观实体抽象成程序中的“对象”。
这种“对象”具有一定的属性和方法,这里的属性指对象本身的各种特性参数。
如气球的体积,自行车的长度等,而方法是指对象本身所能执行的功能,如气球能飞,自行车能滚动等。
一个具体的对象可以有许多的属性和方法,面向对象技术的重要特点就是对象的封装性,对于外界而言,并不需要知道对象有哪些属性,也不需要知道对象本身的方法是如何实现的,而只需要调用对象所提供的方法来完成特定的功能。
从这里我们可以看出,当把面向对象技术应用到程序设计中时,程序员只是在编写对象方法时才需要关心对象本身的细节问题,大部分的时间是放在对对象的方法的调用上,组织这些对象进行协同工作。
MFC的英文全称是MicrosoftFundationClasses,即微软的基本类库,MFC的本质就是一个包含了许多微软公司已经定义好的对象的类库,我们知道,虽然我们要编写的程序在功能上是千差万别的,但从本质上来讲,都可以化归为用户界面的设计,对文件的操作,多媒体的使用,数据库的访问等等一些最主要的方面。
这一点正是微软提供MFC类库最重要的原因,在这个类库中包含了一百多个程序开发过程中最常用到的对象。
在进行程序设计的时候,如果类库中的某个对象能完成所需要的功能,这时我们只要简单地调用已有对象的方法就可以了。
我们还可以利用面向对象技术中很重要的“继承”方法从类库中的已有对象派生出我们自己的对象,这时派生出来的对象除了具有类库中的对象的特性和功能之外,还可以由我们自己根据需要加上所需的特性和方法,产生一个更专门的,功能更为强大的对象。
当然,你也可以在程序中创建全新的对象,并根据需要不断完善对象的功能。
正是由于MFC编程方法充分利用了面向对象技术的优点,它使得我们编程时极少需要关心对象方法的实现细节,同时类库中的各种对象的强大功能足以完成我们程序中的绝大部分所需功能,这使得应用程序中程序员所需要编写的代码大为减少,有力地保证了程序的良好的可调试性。
最后要指出的是MFC类库在提供的对象的各种属性和方法都是经过谨慎的编写和严格的测试,可靠性很高,这就保证了使用MFC类库不会影响程序的可靠性和正确性。
2开发工具VisualC++简介
VisualC++是一个功能强大的可视化软件开发工具。
自1993年Microsoft公司推出VisualC++1.0后,随着其新版本的不断问世,VisualC++已成为专业程序员进行软件开发的首选工具。
虽然微软公司推出了VisualC++.NET(VisualC++7.0),但它的应用的很大的局限性,只适用于Windows2000,WindowsXP和WindowsNT4.0。
所以实际中,更多的是以VisualC++6.0为平台。
VisualC++6.0不仅是一个C++编译器,而且是一个基于Windows操作系统的可视化集成开发环境(integrateddevelopmentenvironment,IDE)。
VisualC++6.0由许多组件组成,包括编辑器、调试器以及程序向导AppWizard、类向导ClassWizard等开发工具。
这些组件通过一个名为DeveloperStudio的组件集成为和谐的开发环境。
VisualC++它大概可以分成三个主要的部分:
(1)D
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 网络 协议 分析 论文