毕业设计(论文)基于IP、TCP协议分析器的开发.doc
摘 要TCP/IP协议是网络通信中应用广泛的协议,通过它可以实现不同网络媒介之间的信息传递。分析TCP/IP协议,了解网络通信的基本流程,对于网络通信,网络优化和网络安全都有重要的意义。通过程序截获TCP/IP协议并对其内容进行相应的提取分析,基本的流程是利用程序将网卡设置成混乱模式,对截取的数据包按相应的协议规格分析,提取相应的地址、端口号以及数据内容,并显示出来。程序中应用了线程的处理方法,使得抓取数据包和分析数据包分离,便于实时监控,并且解决了共享资源的访问冲突的问题。在程序中,截获到的数据都以文件保存下来,方便对已截获的数据进行查询。程序主要涉及到TCP/IP协议的基本知识,网络套接字的应用,线程处理问题的方法,数据的存储,MFC框架下相关的可视化编程等方面的基本知识和实际应用。关键词: TCP/IP,协议,数据包,网络套接字,线程 ABSTRACTTCP/IP protocol is used widely in the network communication, which can realize the message transmission between different network media machines. That has important significance for network optimization, network communication and network security through analyzes of the TCP/IP protocol and understanding of the basic process of network communication. The program can intercept TCP/IP protocol to analyze the messages of the protocol. The basic process is using the program set to mix mode at the network card, analyzing the packet from the network card as relevant protocols, extraction of corresponding specification and address, the socket data content, and displayed. The thread is used in the program, it can make grab packet part and analysis data part in different parts, it make program monitor the network card all the time, and resolve the problem about the share resource. In the program, the data got from the network card is saved as file, it is convenient for check of data. This program mainly involves the TCP/IP protocol's basic knowledge, socket, thread of the method to deal with problems, data storage, MFC framework related visual programming. KEY WORDS: TCP/IP, protocol, packet, network socket, thread目录前 言3第1章 技术可行性分析31.1网络协议实现可行性分析31.2 开发环境可行性分析31.3 程序设计可行性分析3第2章 相关知识32.1 TCP/IP协议32.2 socket简介32.3 线程原理3第3章 设计思路33.1 总体设计33.2详细设计33.2.1 变量的说明33.2.2 数据结构说明33.2.3 网络协议截获部分设计33.2.4数据分析部分设计33.2.5 线程部分设计33.2.6 不同部分数据传递设计3第4章 编码及实现34.1 网络协议截获部分34.2 数据分析部分34.3模块整合部分及线程添加部分34.4出现的其他问题及解决方案3第5章 结果分析3第6章 总结3致谢3参考文献3前 言TCP/IP(Transmission Control Protocol/Internet Protocol)的简写,中文译名为传输控制协议/因特网互联协议。TCP/IP协议是目前应用最广技术最成熟的网络协议,通过TCP/IP协议可以实现不同网络设备之间的相互通信。通过对网络协议的基本内容的分析,可以了解网络通信的基本原理,对网络通信中的数据传输有清晰的概念,对于网络优化,网络通信安全等有基础性的意义。本文主要对IP协议,TCP协议和UDP协议进行截获分析,并在特定的窗口中显示。TCP/IP的体系结构是一个四层结构,从下至上包含网络接口层,网际层,运输层,应用层。网络接口层没有什么具体内容,网际层涉及到的主要协议是IP协议,运输层的主要协议是TCP或UDP,应用层用到的协议是TELNET,FTP,SMTP等。本文主要针对网际层和运输层的协议进行分析,主要研究方向是对比相关的协议格式,通过编写程序提取网络报文的响应内容。程序中用到的开发环境是Microsoft Visual C+ 6.0(以下简称VC6),本文中对网络报文进行截获并分析的程序是在VC6的MFC框架下实现的,应用到的技术主要包括:socket编程,VC中线程的处理方法,MFC框架下图形的显示,MFC框架下的消息响应机制和文件的读写等。本文中第1章主要针对设计的要求分析了技术方面的可行性。第2章主要介绍了设计中应用的一些知识的相关情况。第3章具体介绍了程序设计实现过程中的思路,包括总体设计和详细设计两部分,并且针对具体的设计进行了方法和算法上的分析。第4章是程序的编码和测试部分,主要讲了相对第2章中的提出的设计对应的程序实现方法以及调试过程中发现的错误和处理方法。还有关于在程序设计编码测试过程中遇到的一些问题和相应的解决方案,主要涉及一些连接和版本的问题。第5章是和本设计相关的一些总结性陈述。通过本程序的书写,可以了解MFC框架运行机制,深入理解在C/C+编程中类的应用,熟练在网络编程中使用socket编程,对可视化编程的方法有了进一步的理解,对线程在程序中的使用和对共享资源的理解有了更加准确的认识。程序主要实现的功能是对网络协议进行截获和分析,为后续的网络信息的智能监视分析提供技术支持。通过程序的书写,已经对网络协议的截获和分析部分基本了解,在智能分析框架完善的情况下就可以将网络协议的截获和分析部分嵌入,就可以实现网络信息的智能监视和分析。第1章 技术可行性分析在编写程序之前,对程序用到的知识和开发环境进行了选择和可行性分析。本程序的技术可行性分析涉及到三个方面:网络协议实现的可行性分析,开发环境可行性分析,程序设计可行性分析。1.1网络协议实现可行性分析 TCP/IP协议是网路协议中规范最成熟,应用最广泛的协议,与之相关的技术文档比较多,协议简单容易分析,并且在VC6的开发环境中利用socket得到的基本的协议内容,可以直接保存到数组中去,方便后续的协议分析。本文主要分析的协议是IP,TCP和UDP三个,这三个协议的报文头部分明确,信息都是以字节为基本单位存储,报文的具体信息的定位方便,对于这三种协议的报文头将在3.2.3中详细说明。1.2 开发环境可行性分析 本程序用的开发语言是C/C+语言,C语言具有简洁,高效和可移植性高的特点,C+克服了C语言的类型检查机制薄弱和不适合开发大型程序的缺点。C+语言为程序设计者提供了良好的程序开发环境,能产生模块化程度高,重用性和可维护性好的程序。本程序用的的开发环境是VC61,因为在此开发环境中可以方便快捷地设置网卡模式和网卡过滤数据的类型,便于直接对特定的网络报文进行截获操作。VC6中对于socket的函数支持比较完善,对于网络通信和线程间通信的设计容易实现。对于图形开发,VC6的可视化编程体系比较完善。本程序是在VC6中的MFC框架下书写的,MFC框架比较完善,不用书写大量的关于的窗口框架的代码,在程序的线程处理中,VC6框架比较清晰,对数据的共享处理比较方便。在VC6开发环境下,可以方便定义类,本程序中用到了类的基本操作,可以为以后程序的工程或平台移植提供支持。socket是网络通信的基本构件,一个socket对应于通信的一端,网络通信的socket接口模型将通信主机或进程作为端点。每个网络对话包括两个端点,本地端点和远程端点,在本程序的设计中,是监视网卡的实时动态,所以远程端点可以理解为网卡,程序从网卡中获得信息。1.3 程序设计可行性分析 程序的主要功能分为四部分:数据的截获,数据的分析,不同线程之间的资源共享,窗口相应显示,以下对这四个方面分别做可行性分析。数据的截获部分的实现:将网卡设置成混听模式2,将网卡的过滤类型设置为接受IP协议,然后设置端口,用RECV函数就可以得到网卡上截获的数据。将此部分的函数设置一个while循环就可以达到实时运行的功能,利用文件的读写就可以将得到的数据及时的返回存储。数据的分析:对已知的TPC/IP协议进行数据分析,把一条完整的IP协议报文按字节进行处理。本程序中建立了比较完整的协议处理函数和协议储存的数据结构,将数据的获取和数据的储存设定为两个互不干扰的线程,避免数据的处理过程中出现数据的改动和丢失。在截获数据之后可以进行相应的数据存储,避免了短时间内接收报文过多,数据不能及时分析处理而造成的数据丢失。不同线程之间的资源共享:建立一个独立的数据空间,截获到得数据及时地存储到此数据空间,数据分析的时候,对此数据空间进行访问,避免了直接访问线程的数据,这样实现了数据截获的实时性,同时也避免了数据的丢失。窗口相应显示:VC6工程下的MFC框架体系比较简单,相应的消息响应的添加比较方便快捷,对于图形化的操作比较完善。C+中类的应用比较广泛,可以将各部分的功能分别写入不同的类中,方便平台移植和工程的扩展。在本程序中,将以上几个方面的功能分别写成不同的类,对于每个类都有详细的定义和说明,在每个类中都添加了详细的出错检验,在程序调试的过程中可以进行断点测试,这是C+编程中重要的应用方面。第2章 相关知识程序开发的过程中用到了TCP/IP协议,socket知识和线程原理。2.1 TCP/IP协议网络的体系结构3大致分为三类,OSI的体系结构,TCP/IP的体系结构,五层协议的体系结构。OSI的七层协议体系结构概念清晰,理论也比较完整,但它既复杂又不实用,TCP/IP体系结构则不同,得到了非常广泛的应用。TCP/IP是一个四层的体系结构,包含应用层,运输层,网际层和网络接口层。每一层都有相应的网络协议,本文中涉及到的IP,TCP和UDP协议在TCP/IP体系结构中都有相应的说明,网际层主要的协议是IP,运输层主要的协议是TCP或UDP。网络层主要是负责为分组交换网上的不同主机提供通信服务,在发送数据时,网络层把运输层产生的报文段封装成分组或包进行传送。运输层的任务就是负责向两个主机进程之间的通信提供服务,将收到的信息交付给应用层中的相应的进程。网际层主要是进行更低层网络接口层(如以太网设备驱动程序)和更高层运输层之间的信息传递。IP数据包是不可靠的,因为IP并没有做任何事情来确认数据包是按顺序发送的或者没有被破坏。IP数据包中含有发送它的主机的地址(源地址)和接收它的主机的地址(目的地址)。 运输层的TCP和UDP服务在接收数据包时,通常假设包中的源地址是有效的,在TCP/UDP报文头中没有相关源地址和目的地址的信息,报文段中关于端口号的信息都是在运输层上添加的,TCP/UDP报文头里面包含了网络通信端口号。IP地址形成了许多服务的认证基础,这些服务相信数据包是从一个有效的主机发送来的。IP确认包含一个选项IP source routing,可以用来指定一条源地址和目的地址之间的直接路径,这个选项是为了测试而存在的,说明了它可以被用来欺骗系统来进行平常是被禁止的连接。TCP是面向连接的通信协议,通过三次握手建立连接,通讯时完成时要拆除连接,由于TCP是面向连接的所以只能用于点对点的通讯。TCP提供的是一种可靠的数据流服务,采用“带重传的肯定确认”技术来实现传输的可靠性。TCP还采用一种称为“滑动窗口”的方式进行流量控制,所谓窗口实际表示接收能力,用以限制发送方的发送速度。UDP是面向无连接的通信协议,UDP数据包括目的端口号和源端口号信息,由于通讯不需要连接,所以可以实现广播发送。UDP通讯时不需要接收方确认,属于不可靠的传输,可能会出丢包现象,实际应用中要求在程序员编程验证。UDP与TCP位于同一层,但它不保证数据包的顺序、差错检验或出错重发。因此,UDP不被应用于那些使用虚电路的面向连接的服务,UDP主要用于那些面向查询-应答的服务。UDP没有建立初始化连接,所以TCP比UDP更加安全,但是TCP数据报文头比UDP复杂,并且有相应的检验字段。2.2 socket简介socket(套接字),用于描述IP地址和端口,是一个通信链的句柄。在Internet上的主机一般运行了多个服务软件,同时提供几种服务,每种服务都打开一个socket,并绑定到一个端口上,不同的端口对应于不同的服务。套接字是网络通信的基础,套接字中包括网络通信中需要的地址,端口等信息。套接字可以根据通讯性质分类,这种性质对于用户是可见的。应用程序一般仅在同一类的套接字间通讯,不过只要底层的通讯协议允许,不同类型的套接字间也照样可以通讯。用户目前可以使用两种套接口,即流套接字和数据报套接口。流套接字提供了双向的,有序的,无重复并且无记录边界的数据流服务,数据报套接字支持双向的数据流,但并不保证是可靠,有序,无重复的。在程序中,通过设置套接字的选项就可以实现不同程序或线程的网络通信,windows下的socket技术很成熟,Windows Sockets 规范定义并记录了如何使用API 与Internet 协议族(IPS,通常我们指的是TCP/IP)连接,尤其要指出的是所有的Windows Sockets 实现都支持流套接字和数据报套接字。2.3 线程原理线程,有时被称为轻量级进程(Lightweight Process,LWP),是程序执行流的最小单元。一个标准的线程由线程ID,当前指令指针(PC),寄存器集合和堆栈组成。另外,线程是进程中的一个实体,是被系统独立调度和分派的基本单位,线程自己不拥有系统资源,只拥有一点在运行中必不可少的资源,但它可与同属一个进程的其它线程共享进程所拥有的全部资源。一个线程可以创建和撤消另一个线程,同一进程中的多个线程之间可以并发执行。由于线程之间的相互制约,致使线程在运行中呈现出间断性。线程也有就绪、阻塞和运行三种基本状态。线程处理中一个基本的问题是解决共享资源的竞争问题,当一个系统或者进程中有对个线程同时对共享资源进行操作时,容易引起死锁,会导致系统或者程序不正常运行。避免死锁的方法中有一种方法是避免共享资源的错误操作,通过设置某些限制条件,对共享资源设定相应的条件,通过合理分配资源来避免死锁。对共享资源的限制条件的设定必须明确,一般是通过设定标志来实现,在多个线程中每个线程都有相应的优先级,优先级高的线程可以剥夺优先级较低的线程的资源操作权限。第3章 设计思路3.1 总体设计本程序的总体设计分为三个基本的模块:网络协议截获函数,数据分析函数,显示函数,如图3.1。数据分析函数(从交换分区中,获得相应的网络报文进行分析,将要显示的内容传递到交换分区)网络协议截获函数(主要功能是设置网卡,设置socket,返回网络报文)用于交换的分区显示函数图3.1网络协议截获函数主要功能是设置网卡的工作模式,定义具体的socket选项,通过socket获得具体的网络协议的完整报文,将报文数据传递到交换分区中。数据分析函数主要是对网络协议截获函数返回的报文进行分析,将需要显示的信息传递到显示函数中去。显示函数用于显示网络协议截获函数传递的一些全局的变量,包括截获的协议的总数,以及截获的协议的大小等,以及从数据分析函数传递进来的用于显示的某一个的网络协议的具体信息。图3.1中的用于交换的分区的目的是使解决网络截获函数和数据分析函数相互独立,避免数据的访问出错。具体的内容在3.2.2线程部分设计中详细说明。3.2详细设计3.2.1 变量的说明表3.1中列出了在程序中的一些关键的变量。表3.1 主要变量变量名称数据类型主要作用socketsetclass对socket操作的类ippanclass数据分析的类ipdatastructIP报文头tcpdatastructTCP报文头udpdatastructUDP报文头outdatastruct用于显示temp151518char交换分区anflag15int标志报文是否被分析totalint截获的报文总量total1int防止刷屏antotalint已分析报文总量tcptotalint截获的TCP总量udptotalint截获的UDP总量totalliulong截获的所有报文大小 3.2.2 数据结构说明本程序中定义了比较多的数据结构4,这里就主要的数据结构进行说明。在数据分析函数部分定义了ippan类,ippan类主要用于网络协议报文的读取分析和报文主要信息的显示。ippan类成员函数包括ippan类构造函数和析构函数,IP报文头读取函数iphead,TCP报文头读取函数tcphead,UDP报文头读取函数udphead,协议数据内容读取函数dataread,协议显示函数textout。在ippan中套嵌定义了三个结构体:ipdata,tcpdata,udpdata,这三个结构体是相对三种协议报文头定义的。 在网络协议截获函数部分定义了socketset类,主要用于网卡和socket的设置。在socketset类中定义了两个成员函数: sockemix和void socketdata,前者实现的主要功能是网卡和socket的选项的设置,后者是从网卡中读取相应的网络报文。在MFC中的view类中定义了一个交换分区,大小是15个网络协议报文的存储空间。网络协议报文的最大长度为1518字节,所以在程序中定义了一个15个报文长度的2维数组。3.2.3 网络协议截获部分设计网络协议截获函数分为socket设置,用户信息获取,数据接收三部分。下面分别对这三部分做详细说明:socket设置5:在vc的socket编程中,首先要对进程设置Windows Sockets的版本,由于在本程序中要将网卡的工作模式设置成混乱模式,即可以接收所有通过本网卡的数据。在Windows Sockets的版本中,1.x没有原始套接字的设置,所以本程序用的是2.x的版本,选择2.1的版本即可完成设计的功能。利用socket函数创建一个绑定在指定设备上的套接字,在socket函数的参数中,可以设置套接字的功能,type参数,本程序用的是SOCK_RAW,因为这个参数是原始套接字,原始套接字编程可以接收到本机网卡上的数据帧或者数据包。对于protocol本程序传递参数是IPPROTO_IP表示通过过滤后截获的是IP协议。设置socket的选项,通过setsockopt函数实现。用户信息获取:得到主机数据库,通过gethostname函数实现。 得到主机名称,通过函数gethostbyname函数实现。此函数同时实现将主机信息储存到相应的数据结构中去,用于为后续的SOCKADDR_IN IP地址设定。在socket编程中,必须要定义一个SOCKADDR_IN来保存主机的信息。得到主机的信息之后,对SOCKADDR_IN进行设定。通过bind函数将本地地址和socket进行绑定。通过函数ioctlsocket对socket进行输入输出的控制方式的设定。对于具体设置过程中的函数的使用方法参考附录中网络协议截获部分的函数。数据接收:recv函数可以从设置正确的socket中得到完整的网络协议报文。因为本程序对网络协议截获的部分做的是实时处理,在编写程序的时候应用的线程的处理方法,此部分将在线程部分中详细说明。3.2.4数据分析部分设计数据分析部分分为3部分:IP协议头部分析,TCP/UDP协议头分析,协议转存。网络报文先进过传输层添加TPC或者UDP报文头6,经过网络层的时候添加IP报文头。在本地网卡上截获的数据就是从网络层开始的,按照网络报文的书写规则,先分析IP报文头,然后再分析TCP/UDP报文头。本程序中定义了一个类ippan,具体内容详见数据结构部分。0 15 16 314位版本 4位首部长度 8位服务类型(TOS) 16位总长度(字节数) 16位标识 3位标志 13位片偏移8位生存时间(TTL) 8位协议 16位首部检验和 32位源IP地址 32位目的IP地址 选项(如果有) 数据(261480字节)图3.2 IP数据报的格式首先说明与IP报文头相关的存储方式,本程序中定义了ipdata结构体,用于存储和ip报文头相关的全部信息,由于ip报文头的信息并不是需要全部输出,所以本程序中定义了另一个结构体outdata,用于存储需要输出显示的数据。IP报文头中用于输出的内容是源地址和目的地址,这两个数据保存到两个内存中,在存储到ipdata中后,又存储到outdata结构体中,ipdata中的首部长度,协议类型,偏移量用于传递到TCP或者UDP数据分析的函数中,确定具体的协议以及TCP/UDP报文头的起始位置和报文内容的起始位置。0 15 16 31 16位源端口号 16位目的端口号 32位序号 32位确认序号4位首部长度 保留(6位) U A P R S F 16位窗口大小 16位检验和 16位紧急指针 选项 数据(261460字节)图3.3 TCP首部格式0 15 16 31 16位源端口号 16位目的端口号 16位UDP长度 16位UDP检验和图3.4 UDP首部格式在IP报文头的分析结束之后,ipdata的一些参数传递到TCP/UDP 报文头部的分析函数中,用于确定后续对报文数组的具体操作的起始位置。分析具体的报文的数据部分时,用到的是c+中的Cstring类。因为cstring类对数据的处理比数组方便灵活,对数据边界的界定比较安全,而且在MFC框架下用Textout函数不用确定数据的长度。3.2.5 线程部分设计程序书写过程中,原本套接字受到一个报文,接着分析报文,但是考虑到计算机进程中共享资源的处理方法,可能会导致因为分析报文时间过长,从而导致数据包丢失的情况。程序必须保证在对数据进行分析的时候不会影响到报文的截获函数的运行,本程序中用了线程7的方法来解决这个问题。解决的方法就是将截获报文部分和报文分析部分分离,这样可以保证在进行数据分析的时候不影响网卡上的报文数据。本程序中创建了一个线程,线程之中是一个截获报文的函数,而报文分析就添加在MFC的消息响应函数里面,这样就解决了报文截获的实时性问题。本程序中用AfxBeginThread来调用已经定义的线程。线程中的函数就是报文截获的函数。设计此线程的目的是为了实时截获报文,在线程函数中,用到了两个死循环,第一个是用来调用socket的recv函数以获得报文,第二个是和recv函数相对应的,recv函数返回的是受到的数据的字节数,当他收到的字节数不为0是返回,这两个while死循环保证了通过网卡上的所有数据都可以截获到。但是同时带来的另一个问题是:两个线程之间需要通信,需要进行数据的传递,对共享资源的占用问题的处理不好就会引起死锁,所以本程序设置了一个数据缓冲区,可以存放15个报文数据,用来解决共享资源的访问冲突问题。两个线程可以对此共享存储区域8进行访问,并且不导致冲突。因为,报文截获之后将报文数据写入缓冲区,并不从缓冲区中读取或返回任何数据,报文分析从缓冲区域读取数据,并不对缓冲区的数据进行改动。因为程序实现的功能是现实最后得到的15组数据,所以对于缓冲区,不进行内存的释放,用循环的方式替换掉原来的数据。所以设立一个标志数组,用来标识缓冲区15组数据的状态,写入新数据后标志为1,数据分析之后标志为0.和交换分区相关的两个线程,网络协议截获部分和数据分析部分,本程序使用了不同的刷新方法,网络协议截获部分的要求是实时性,所以其中使用了while循环,而数据分析部分主要是用来显示,使用的方法是定时器。3.2.6 不同部分数据传递设计在数据传递过程中,为了保护数据的完整性,设置了一个交换分区9,用于网络协议截获部分和数据分析部分的数据传递。考虑到程序中数据传递的方法和不同数据显示的频率,显示部分的函数没有单独作为一个类或特定的函数来处理,而是在网络协议截获函数和数据分析函数中添加相应的显示函数。第4章 编码及实现本程序应用的是模块式的流程,在编写代码的过程中,是模块单独编写和测试的,最后是模块之间的整合。4.1 网络协议截获部分由于本部分程序在整个的程序中是作为一个类来使用的,所以作者在编写代码的时候是选择在win32控制台下书写测试代码的。主要是为了将网络协议截获部分的代码封装成类,以便在MFC工程下调用以及在其他工程或者平台下可以方便移植。在程序中,由于设置网卡和socket的步骤比较繁琐,作者在测试的工程中添加了出错提示的代码,对每一步进行差错控制,以便调试。在编译执行的过程中用的是单步运行的方式,在工程中观察每一步返回的值,确定每一步的执行是否正确。此部分调试的过程分为两个阶段,第一个是确定网卡及socket的设置成功,第二个是确定能够得到正确的网络协议数据。第一个阶段,在编译工程中,用单步测试方法,观察每一步能否正确运行,返回值是否正确。在win32控制台下,对于每一步的返回值处设置断点,用单步运行的方式,确定程序的能否正确运行。第二个阶段,在程序中调用socket的接受数据函数,将得到的网络协议报文直接显示。通过对协议格式的分析得知数据中每个字节的数据的含义,对比输出的数据确定得到的是否是正确的网络协议报文。在socket中recv函数是用来获取报文的函数,返回值为报文的长度,在报文数据中,IP报文头部分也有标识报文长度的值,对比两者,可以初步判断得到的是否是正确的报文。4.2 数据分析部分数据分析部分函数是封装成类,在MFC框架下调用的,编写编译调试的过程在win32控制台下进行。数据分析时必须从网络协议截获函数得到网络协议的报文数组,所以在编写此部分的程序代码的时候,作者已经将网络协议截获部分调试成功,并且能确定网络截获函数可以成功返回网络协议数据。在此部分程序的编写代码和测试的过程中,先是ippan类的书写,通过参考各种协议的格式,在程序中定义了相关的结构体和类,然后编写报文数据的分析函数。报文的封装过程是先添加TCP或UDP数据报报文头,然后是添加IP数据报报文头。数据分析的过程是封装过程的逆过程。在本部分的程序书写完成后进行调试,在网络协议截获可分析的报文之后调用数据分析函数进行分析,在工程中添加断点测试,通过对比截获的数据,观察在报文头分析的过程中是否出现错误。4.3模块整合部分及线程添加部分程序最终结果是在可视化界面中显示,所以本程序在网络协议截获模块和数据分析模块调试成功后将两个模块的相关文件添加到MFC工程中。首先做的是两个模块在MFC工程中的可执行性测试,参照在win32平台中的方法,在MFC工程测试。由于本程序实现的是实时监控,所以在MFC中添加一个线程,在线程中调用网络协议截获模块。考虑到实时监控,用while循环,由于网卡和socket的设置不需要重复进行,所以在网络协议截获模块中将网卡及socket设置和数据接收两部分分开,在网卡和socket设置成功之后,只对数据接收函数做while循环。考虑到网卡可能在短时间内接收大量的报文,所以在程序中设置了一个交换分区,网卡接收到数据之后,只存储到交换分区中,由数据分析部分访问交换分区,避免了由于分析数据时间较长导致数据的丢失。本程序设置的交换分区的大小是15个网络报文,在本程序中添加了文件书写的代码,网卡每接收15个报文,就将交换分区内的数据存储到文件中。4.4出现的其他问题及解决方案本程序中在编写调试过程中出现了如下的主要问题。1.在编写网络协议截获函数是出现了socket设置不成功的错误。2.在显示过程中出现了闪屏的现象10。3.某些连接互联网络方式不能截获到数据。 相对应的解决方案如下:1.对于socket设置不成功的错误,参考MSDN中发现,由于Windows Socket中1.x版本不支持混乱模式。导致函数setsockopt调用不成功。2.滚动显示协议的信息时,会出现闪屏现象。分析得知是由于设置的刷新的定时器时间参数过小的原因。在将参数设置修改之后仍会出现闪屏现象。在本程序中,利用了一个对比的方法,在截获的报文的总数量没有变化的情况下,禁止窗口重绘,通过这个方法解决了闪屏的现象。3.本程序测试中发现在宽带连接的网络中不能很好地截获数据。第5章 结果分析本程序可以在XP环境下运行,在安装了VC6工程的计算机下可以直接运行,在其他未安装相关编译工程的计算机上运行需要一些动态链接库文件,包括:MFC42D.DLL,mfco42d.dll,MSVCRTD.DLL,ws2_32.dll,WS2_32.LIB五个文件。本程序的试验结果如图5.1.图 5.1从图中可以看出,本程序可以基本上实现截获IP协议的功能,能对其中的协议报文进行比较全面的分析,能很好的显示出来。从图中可以看出,截获的数据包的总数和已分析的数据包总数并不相等,关于原因在2.2.5中线程的设计中有比较详细的说明,此处不再说明。从图中发现了一个问题,TCP和UDP数据包总量之和不是截获的数据包的总数,将电脑的全部网络连接断开之后,在命令提示符下ping 127.0.0.1后发现原因,结果如图 5.2.图 5.2从图 5.2中可以看出,程序接截获了4个数据包,但是这四个数据包没有协议类型,其他信息都有,图5.1中有一些数据包就是此种类型的数据包,这种类型的数据包有完整的IP报文头,但是没有协议类型,程序处理的过程中就当做是IP协议处理,但是处理的结果不是TCP或UDP中的一种。对于出现的闪屏的问题,本程序中用的两个值进行比较的方法能很好的解决这个问题,证明了对问题的分析和解决方法都是比较正确的。第6章 总结 在本程序中能基本完成网络数据的截获分析功能,本程序能对网络通信分析起到很好的作用。对于网络通信相关的研究能起到一个很好的基础性的辅助效果。通过本程序的编写可以了解MFC框架的基本运行机制,对MFC下类的继承派生等基本知识有了系统全面的了解。通过程序的调试过程能比较清晰地理解MFC下各个层次的结构关系和数据传递的基本原理,能针对不同的类进行相应的程序编写方法。设计的过程中应用到了socket编程,socket是网络通信中应用非常广泛的编程方法,通过程序的编写,对socket编程的流程有系统的了解,能熟练使用socket方法进行网络方面的编程。本程序中用到的关于socket方面的编程是网络编程方面比较详细,比较系统的例子,可以作为网络编程方面的模板。 线程的编程方法在编程中应用十分广泛,程序中是在MFC框架下调用的线程的方法进行了网络协议报文的截获处理,这样的编程思路可以引申到其他的程序上,为程序的并发运行提供了良好的解决方案。本程序中函数的处理方法是定义了两个类,这种处理方法对于程序的可移植性有良好的支持,为以后进行相似或者更深层次的编程减少了代码的编写量。网络协议的研究是进行一系列网络编程和网络分析的基础,本文具有一定的基础性研究的意义。通过对网络协议的分析可以了解网络通信的基本过程,对于网络协议的规则有比较全面的理解。网络的发展速度非常之快,对于网络通信技术的要求也是越来越高,网络协议是网络通信中重要的方面,只有对网络协议有深入的了解才能更好的研究网络。相信通过本文中的研究能对网络协议有一个全面的认识,能够熟练地分析处理网络协议报文,为后续的网络通信和网络安全的研究提供良好的技术支持。致谢在此首先感谢我的母校青岛理工大学,在我的四年大学中为我提供了良好的生活和学习环境。感谢我的导师赵京胜老师在我求职和毕业设计这段时间内给我的指导和鼓励。感谢聂廷远教授在大三期间给我提供了研究网络加密算法的项目的机会。感谢宿舍舍友肖清旺,杨亮,易昇,杨宁,于谋川的关心和支持。感谢即将就职的浪潮集团,能提供充足的时间让我完成自己的毕业设计。参考文献1 郭英,陈立潮,叶树华.基于MFC