学位论文之网络流量测量软件的设计与实现.docx

上传人:牧羊曲112 文档编号:1668084 上传时间:2022-12-13 格式:DOCX 页数:25 大小:339.30KB
返回 下载 相关 举报
学位论文之网络流量测量软件的设计与实现.docx_第1页
第1页 / 共25页
学位论文之网络流量测量软件的设计与实现.docx_第2页
第2页 / 共25页
学位论文之网络流量测量软件的设计与实现.docx_第3页
第3页 / 共25页
学位论文之网络流量测量软件的设计与实现.docx_第4页
第4页 / 共25页
学位论文之网络流量测量软件的设计与实现.docx_第5页
第5页 / 共25页
点击查看更多>>
资源描述

《学位论文之网络流量测量软件的设计与实现.docx》由会员分享,可在线阅读,更多相关《学位论文之网络流量测量软件的设计与实现.docx(25页珍藏版)》请在三一办公上搜索。

1、 密级: NANCHANG UNIVERSITY 学 士 学 位 论 文THESIS OF BACHELOR( 2002 2005 年 )题 目 网络流量测量软件的设计与实现 学 院: 信息工程学院 系 计算机 专 业: 计算机科学与技术 班 级: 新余函授站 学 号: 学生姓名: 指导教师: 起讫日期: 2005-3-22-2005-5-20 网络流量测量软件的设计与实现摘 要:为了方便网络编程,90年代初,由Microsoft联合了其他几家公司共同制定了一套WINDOWS下的网络编程接口,即Windows Sockets规范,它不是一种网络协议,而是一套开放的、支持多种协议的Windows

2、下的网络编程接口。本篇论文主要是介绍了在TCP/IP基础上利用winsock2对网卡进行编程,以达到网络流量监测的目的。论文首先介绍了TCP/IP协议,旨在介绍IP,TCP,UDP等比较重要的协议。主要是介绍IP头,TCP头,UDP头的特点,以便从IP头中可以获取源地址,目的地址,协议类型等信息。在随后的章节中提出了Socket的概念,Socket实际上提供了一个通信端口使所有拥有Socket的端口的计算机之间能够相互通信,在本论文中主要说明了socket的建立,监听和撤销的过程。具体到程序实现中,对网卡混杂模式的设置是通过原始套接字(raw socket)来实现的。为了让原始套接字能接受所有

3、的数据,还需要通过将SOCK_RAW设置成SIO_RCVALL。对数据包的获取通过recv()函数来完成。最后要完成的工作就是对所捕获的IP数据包进行分析以提取出我们所需要的信息。在论文的最后是旨在说明进一步工作的展开。关键字: TCP/IP,Winsock,原始套接字,NetBios Abstract: For convenience of network programming, in the early 1990s, a new set of network programming interface using under WINDOWS was established by some

4、 companies united by Microsoft. It is known as Windows Socket Norm. It isnt a kind of network protocol, but an open network programming interface support multiple protocols under WINDOWS. The main purpose of the thesis is to introduce how to use Winsock2 program on network adapter under the protocol

5、 of TCP/IP. This is for the purpose of measure the network discharge. At the beginning of the thesis, we introduce all important protocols of TCP/IP, like IP, TCP, and UDP. We introduce IP header, TCP header and UDP header for the most important because we need acquire the information of source addr

6、ess, destination address, and protocol type from the IP header. In the following section, we give the concept of Socket. Sockets actually provide a communication port to allow all the computers that have Socket port to communicate with each other. In the thesis, we talk on the process of the Sockets

7、 building listening and canceling. In the program, we use RAW Socket to set adapter on the mixed mode. To let the Socket receive all data, we also need to set the on SIO_RCVALL. Then we use the function recv () to get data pack. At last we need analyze the data pack to get the information we need.KE

8、Y WORDS:TCP/IP, Winsock,RAW SOCKET, NetBIOS目录摘要.1Abstract.2前言.4第一章绪论51.1TCP/IP协议及其协议分析方法.51.1.1分层.51.1.2IP地址.61.1.3端口.61.1.4TCP/IP协议在Windows中的实现.71.2Winsock编程.71.3网络流量测量的程序实现原理.8第二章TCP/IP协议集92.1TCP/IP协议简介.92.2IP协议.92.3TCP协议.102.3.1TCP服务模型.102.3.2TCP数据段头.112.3.3TCP协议的建立.122.4UDP协议.13第三章WINSOCK编程概述143

9、.1套接字的概念.143.2套接字的种类.143.3套接字的建立.14第四章网络流量测量的程序实现.164.1网卡初始化.164.1.1NetBios概述164.1.2利用NetBios来初始化网卡.164.2原始套接字的设置.164.3IP包的协议分析174.4结果与测试.19结 论.21结束语.22参考文献23前 言随着计算机网络技术日新月异的发展,Internet的逐渐普及,网络对于人们已经不再是一个陌生的概念。可以说,网络已经在很多人的生活中占据了重要的地位。于是,各种各样的软件随之诞生,使人们能够更加方便,快捷的访问网络,了解网络以充分的利用网络。本论文就是向大家介绍网络中比较常用的

10、技术网络流量的监测。在介绍具体的程序实现之前,论文首先介绍了TCP/IP协议,可以说,任何网络技术都与TCP/IP协议有着密切的关联,TCP/IP协议给不同型号的计算机,不同的操作系统之间提供了相互通信的平台。TCP/IP起源于60年代末美国政府资助的一个分组交换网络研究项目,到现在90年代已发展成为计算机之间最常应用的组网形式。它是一个真正的开放系统,因为协议组件的定义及其多种实现可以不用花钱或花很少的钱就可以公开地得到。在进行网络流量的测量之前,我们首先要对本地机的信息有一个了解。这些信息的获取是通过Netbios来完成的。Netbios利用其网络控制快NCB来完成我们需要它去完成的对网卡

11、的初始化工作。通过ncb_command来发出命令完成对网卡的操作。通过发送NCBENUM命令获取网卡的数目和每个网卡的内部编号;对选定的网卡发送一个NCBRESET命令,以便进行初始化;接着,可以发送NCBASTAT命令以获取网卡的信息。这样,我们可以读出网卡的MAC地址以便进行进一步的工作。要实现网络流量的测量,Winsock给我们提供了一个接口,我们通过这个接口可以实现对IP层以上的层的数据包的监测。我们通过建立原始套接字,利用Winsock提供给我们的一些特定的函数就可以完成对网络数据包的捕获。首先需要建立一个socket,将它设置成为是对ip头的操作,然后利用gethostname,

12、phost获取本机名,本机ip地址。将本机地址与IP地址绑定之后,将网卡设置为混杂模式,以便对所有经过它的数据包进行接收。在这些准备工作已经做好之后,余下的就是利用recv()来捕获网络中的数据包。到现在为止,我们所作的工作都是分析工作的铺垫。我们最后所要看到的就是网络数据包的分析结果。在数据包的分析过程中,用户一般想得到的主要信息不外乎是包的协议类型,源/目的地址,发送/接收端口以及包的大小,定义指针,分别指向数据包的相对应的位置就可以得到这些信息。将得到的信息罗列并显示出来之后,我们就完成了对网络中数据包的流量监测过程。在论文的最后对整篇论文进行了总结,说明了一些不足之处,并对所有对这篇论

13、文知道并建议的老师等表示感谢。第一章绪论1.1TCP/IP协议及其协议分析方法TCP/IP起源于60年代末美国政府资助的一个分组交换网络的研究项目,到现在90年代已发展成为计算机之间最常用的组网形式。它是一个真正的开放系统,因为协议组件的定义及其多种实现可以不用花钱或花很少的钱就可以公开地得到。它成为被称作“全球互联网”或“因特网”(Internet)的基础。1.1.1分层协议分层的概念的提出是为了减少协议设计的复杂性,每一层都建立到它的下层之上,每一层的目的就是为了向上一层提供特定的服务。一台机器的第n层向另一台机器的第n层会话,通话的规则称为协议。分层和协议构成了网络体系结构。在提到了分层

14、的概念时就不能不提一下OSI参考模型。该模型基于国际化标准组织,共分为七层:w 物理层:涉及到通信在信道上传输的原始比特流。w 数据链路层:加强物理层传输原始比特流的功能,使之对网络层显现为一条无错线路w 网络层:关系到子网的运行控制,其中一个关键的问题就是路由选择。w 传输层:为用户提供端到端的数据传送服务。w 会话层:允许不同机器上的用户建立会话关系,为用户提供会话控制服务。w 表示层:为用户提供数据转换和表示服务。w 应用层:为用户提供访问OSI的接口,其中包括大量的常见的协议。TCP/IP通常被认为是一个四层协议系统,每一层负责不同的功能。w 数据链路层,通常包括操作系统中的设备驱动程

15、序和计算机中对应的网络接口卡。它们一起处理与电缆(或其他任何传输媒介)的物理接口细节。w 网络层,处理分组在网络中的活动,例如分组的路由选择。在TCP/IP协议组件中,网络层协议包括IP协议(网际协议),ICMP协议(Internet互连网控制报文协议),以及IGMP协议(Internet组管理协议)。w 运输层,主要为两台主机上的应用程序提供端到端的通信。在TCP/IP协议组件中,有两个互不相同的传输协议:TCP(传输控制协议)和UDP(用户数据报协议)。TCP为两台主机提供高可靠性的数据通信。而另一方面,UDP则为应用层提供一种非常简单的服务。它只是把称作数据报的分组从一台主机发送到另一台

16、主机,但并不保证该数据报能到达另一端。w 应用层,负责处理特定的应用程序细节。几乎各种不同的TCP/IP实现都会提供下面这些通用的应用程序: Telnet 远程登录,FTP 文件传输协议,SMTP 用于电子邮件的简单邮件传输协议,SNMP 简单网络管理协议。图1-1 OSI模型与TCP/IP模型的比较如图所示,OSI模型有七层,而TCP/IP模型只有4层。OSI模型在网络层支持无连接和面向连接的通信,而TCP/IP模型在网络层仅有无连接的通信方式,但是在传输层却支持两种模式,更好的面向了用户。1.1.2IP地址互连网上的每个接口必须有一个唯一的Internet地址(也称作IP地址)。IP地址长

17、32 bit。这些32位的地址通常写成四个十进制的数,其中每个整数对应一个字节。这种表示方法称作“点分十进制表示法”。需要再次指出的是,多接口主机具有多个IP地址,其中每个接口都对应一个IP地址。由于互连网上的每个接口必须有一个唯一的IP地址,因此必须要有一个管理机构为接入互连网的网络分配IP地址。这个管理机构就是互连网络信息中心(Internet Network Information Centre)称作InterNIC。InterNIC只分配网络号。主机号的分配由系统管理员来负责。1.1.3端口网络中可以被命名和寻址的通信端口,是操作系统可分配的一种资源。按照OSI七层协议的描述,传输层与

18、网络层在功能上的最大区别是传输层提供进程通信能力。从这个意义上讲,网络通信的最终地址就不仅仅是主机地址了,还包括可以描述进程的某种标识符。为此,TCP/IP协议提出了协议端口(protocol port,简称端口)的概念,用于标识通信的进程。端口是一种抽象的软件结构,应用程序(即进程)通过系统调用与某端口建立连接后,传输层传给该端口的数据都被相应进程所接收,相应进程发给传输层的数据都通过该端口输出。在TCP/IP协议的实现中,端口操作类似于一般的I/O操作,进程获取一个端口,相当于获取本地唯一的I/O文件,可以用一般的读写原语访问之。类似于文件描述符,每个端口都拥有一个叫端口号(port nu

19、mber)的整数型标识符,用于区别不同端口。端口号的分配是一个重要问题。端口号的分配有两种基本分配方式:第一种叫全局分配,这是一种集中控制方式,由一个公认的中央机构根据用户需要进行统一分配,并将结果公布于众。第二种是本地分配,又称动态连接,即进程需要访问传输层服务时,向本地操作系统提出申请,操作系统返回一个本地唯一的端口号,进程再通过合适的系统调用将自己与该端口号绑定起来。1.1.4TCP/IP协议在Windows中的实现对TCP/IP协议有了一个结构性的了解之后,就要考虑TCP/IP协议在Windows中是如何应用的。TCP/IP和OSI有一层映射关系,所以可以将TCP/IP通过OSI映射到

20、Windows操作系统中去。OSI在Windows中的实现:物理层就是网卡,数据链路层就是网卡驱动程序,网络层就是NDIS(网络驱动程序接口规范),传输层是TDI(传输驱动程序接口),会话层是SPI(服务提供者接口),表示层是API(应用编程接口),应用层通常就是EXE文件。1.2Winsock编程Winsock就是Windows Socket的简称,最简单的说,Winsock就是Windows应用程序与TCP/IP之间的通信界面。如图:图1-2 Winsock在TCP/IP和OSI中的表示在Windows中,利用Winsock通信需经过几个步骤:初始化Winsock,创建套接字,建立会话,传

21、送数据,中止会话,中止Winsock。Winsock既可以提供机器间的通讯,又可提供Windows进程间的通信。1.3网络流量测量的程序实现原理网络流量监测器也是通过对网卡的编程来实现网络通讯的,对网卡的编程也是使用通常的套接字(socket)方式来进行。但是,通常的套接字程序只能响应与自己硬件地址相匹配的或是以广播形式发出的数据帧,对于其他形式的数据帧比如已到达网络接口但却不是发给此地址的数据帧,网络接口在验证投递地址并非自身地址之后将不引起响应,也就是说应用程序无法收取到达的数据包。而网络监测器的目的恰恰在于从网卡接收所有经过它的数据包,这些数据包即可以是发给它的也可以是发往别处的。显然,

22、要达到此目的就必须将其设置为混杂模式。这种对网卡混杂模式的设置是通过原始套接字(raw socket)来实现的,这也有别于通常经常使用的数据流套接字和数据报套接字。在创建了原始套接字后,需要通过Setsockopt()函数来设置IP头操作选项,然后再通过bind()函数将原始套接字绑定到本地网卡。为了让原始套接字能接受所有的数据,还需要通过ioctlsocket()来进行设置,而且还可以指定是否亲自处理IP头。至此,实际就可以开始对网络数据包进行监测了,对数据包的获取仍通过recv()函数来完成。第二章TCP/IP协议集2.1TCP/IP协议简介很多不同的厂家生产各种型号的计算机,它们运行完全

23、不同的操作系统,但TCP/IP协议组件允许它们互相进行通信。TCP/IP模型是一种层级式(Layering)的结构,每一层都呼叫它的下一层所提供的服务来完成自己的需求。TCP/IP模型可以分为以下四层:应用层、传输层、网络层、数据链路层。本章主要对TCP/IP协议组件进行概述。2.2IP协议IP是TCP/IP协议族中最为核心的协议。所有的TCP,UDP,ICMP,及IGMP数据都以IP数据报格式传输。与大多数网络层协议不同,IP协议一开始就是为了网络互连的目的而设计的,它的工作是提供一种从源端到目的端传输数据报的最佳尝试方法,不管这些机器是否在同一网络中。我们可以通过分析IP数据报的头部来更好

24、的了解IP协议:图2-1 IP包头1、版本(version):记录了数据报属于哪一个版本的协议。2、IHL字段:用来告诉头部有多长,以32字节长度为一个单位,最小值为5。3、服务类型(type of service):使主机告诉子网它想要什么样的服务。3个标志位D,T,R主机能说明它最关心组合Delay,Throughput,Reliability中的哪一项。还有两位未用。D,T,R的优先级从0到7。4、总长(total length):包括数据报中的所有信息包括头部和数据。总长65535字节。5、标识(identification): 让目的主机判断新来的分段属于哪个分组,所有属于同一分组的

25、字段包含同样的标识值。6、分段偏移(fragment offset):说明分段在当前数据报的什么位置。除了数据报的最后一个分段外,所有分段都要乘以8字节。因为在分段位移前有3位,其中两位是未用的位,然后是两个1位字段,DF表示不要分段,MF表示还有进一步的分段。这样表示分段位移的位只有13位,因此每个数据报最长是8192个分组,这样最大的数据报长度是65536字节。7、生命期(time to life):是同一个用来限制分组生命周期的计数器,最长生命周期255s,它必须在每个节点都递减,而且当一个路由器中排队时间过长可以十倍数递减。8、协议(protocol):说明将它送给哪个传输进程的,协议

26、的编号在整个因特网上是全球通用的,它定义于RFC 1700中。9、头部校验和(header checksum):这种算法用来校验头部。该算法将头部所有16位半字数据累加起来,采用补运算,再取其结果的补码。网由于该算法的原理,当数据报到达时其头部校验和应该为0。10、源地址(source)和目的地址(destination address):指明了网络号和主机号。2.3TCP协议TCP(传输控制协议),是专门设计用于在不可靠的internet上提供可靠的、端到端的字节流通信的协议。每台支持TCP的机器均有一个TCP传输实体,或者是用户进程,或者负责管理TCP流以及与IP层接口的核心。TCP实体从

27、本地进程接受用户的数据流,并将其分为不超过64字节的数据片段,并将每个数据片段作为单独的IP数据报发送出去。当包含有TCP数据的IP数据报到达某台相连的机器后,他们又被送给该机器内的TCP实体,被重新组合为原来的数据流。IP层并不能保证将数据报正确地传送到目的端,因此TCP实体需要判定是否超时并根据需要重发数据报。到达的数据也可能是按照错误的顺序传到的,这也需要由TCP实体按正确的顺序重新将这些数据报组装成报文。2.3.1TCP服务模型通过在发送方和接收方分别创建称为Socket的通信端点可以获得TCP服务。每个套接字序号包含主机的IP地址以及一个主机本地的16位号码,称为端口。为了获得TCP

28、服务,必须在发送方的Socket和接收方的Socket之间明确的建立连接。一个套接字可以被多个连接同时使用。序号小于256的端口称为通用端口。所有的TCP连接均是全双工的和点到点的,TCP不支持多点播送或广播。TCP连接是字节流而非报文流,报文边界并不按头尾衔接方式保存。当一个应用程序把数据送给TCP实体时,TCP根据自己的判断,可能会立刻将其发送出去或者将其缓存起来。有时候用户为了立刻发送数据可以使用PUSH标志来通知TCP不能耽搁数据的发送。TCP服务的另一个特点就是紧急数据功能。当一个用户按下DEL或者CTRLC中断一个已经开始的远程计算时,发送方应用程序在数据流中放入一些控制信息并将其

29、与URGENT标志一起交给TCP,当紧急数据到达目的端之后,接受方应用程序被中断,然后去读取数据并进而发现了紧急数据。2.3.2TCP数据段头发送和接收方TCP实体以数据段(segment)的形式交换数据。一个数据段包含一个固定的20字节的头,后面跟着以0字节或多字节的数据。对于数据段的大小有两个限制条件:(1)每个数据段必须适合IP的载荷能力,不能超过65535字节。(2)要求每个数据段必须适合最大传送单位MTU。TCP实体所用的基本协议是滑动窗口协议。当发送方传送一个数据段时,它要启动计时器。当数据段到达目的地后,接受方的TCP实体向回发送一个数据段,包含确认序号,希望收到下一个数据段的顺

30、序号。如果确认号超时,则发送方将重发。TCP数据段每段均以固定格式的20字节的头开始,固定的头后面可能是头的一些可选项。在可选项后面最多有65535202065495数据字节,第一个20指IP头,第二个20指TCP头。不带任何数据的数据段也是合法的,一般用于确认报文和控制报文。以下介绍一下TCP数据段头中每个字段的含义:图2-2 TCP头1、源端口和目的端口字段标识出本地和远端的连接点。每个主机都可以自行决定如何分配自己的端口(从256开始)。2、顺序号和确认号字段执行它的通用功能。确认号指希望接收下一个字节而不是前面已经正确接收的字节。3、TCP头长表明在TCP头中包含多少个32位字。由于可

31、选项字段是变长的,因此TCP头也是变长的,它实际上是指明了数据在数据段中的开始位置。接下来有6个未用的位。4、接下来是六个1位的标志:(1)URG位是应急指针标志,当用到了应急指针,则URG置1。应急指针指从当前顺序号到紧急数据位置的偏移量。(2)ACK位置1表明确认号是合法的。ACK为0表示数据段不包括确认信息。(3)PSH伪表示是带有PUSH位标志的数据。(4)RST位用于复位由于主机崩溃或其他原因而出现错误的连接。(5)SYN位用于建立连接。在连接请求中,SYN1,ACK0,表示捎带确认字段无效。连接响应数据段应带有确认,因此SYN1,ACK1。(6)FIN位用于释放连接,它表明发送方已

32、经没有数据发送了,然而当断开连接后,进程还可以继续接收数据。5、窗口大小字段表示在确认了字节之后还可以发送多个字节,由于TCP中的流量控制是通过滑动窗口来处理的。窗口大小为0也是合法的,表示它已经收到了包括当前字段的所有数据段,但当前接收方急需暂停,希望不要发数据。6、校验和也是为了确保高可靠性而设置的。它校验头部,数据和伪IP头(如下图)之和。当接收方对整个数据段,包括校验和字段进行运算时,结果应是0。图2-3 TCP伪头2.3.3TCP协议的建立TCP连接的建立使用三次握手协议,在此过程中双方要互报自己的初始序号,这样就可以保证包的接收顺序和发送顺序相一致。1、(B) - SYN - (A

33、)假如服务器A和客户机B通讯. 当A要和B通信时,B首先向A发一个SYN (Synchronize) 标记的包,告诉A请求建立连接。2、(B) - SYN/ACK ACK - (A)B收到SYN/ACK 包,B发一个确认包(ACK),通知A连接已建立。至此,三次握手完成,一个TCP连接完成。2.4UDP协议Internet协议组同样支持无连接的传输协议UDP。RFC 768定义的UDP协议是个无连接的、不可靠的协议,它能够以最小的控制开销为应用层协议提供最基本的传输服务。UDP向应用程序提供了一种发送封装的原始IP数据报的方法,并且发送时无需建立连接。很多有一个请求和一个响应的客户服务器应用程

34、序采用UDP,这样可以避免建立和释放连接的麻烦。一个UDP数据段包括一个8字节的头和数据部分。头的格式如下:图2.4 UDP头源端口和目的端口的作用与TCP中完全相同。UDP长度字段指明包括8字节的头和数据在内的数据段长度。UDP校验和字段包括伪UDP头,UDP头,UDP数据,如果有必要再补充为偶数个字节。该字段是可选的,而且在不用于运算时记为0。使用UDP协议时,为了传输数据,首先要设置客户计算机的LocalPort属性。然后服务器计算机只需将RemoteHost设置为客户计算机的IP地址,并将RemotePort属性设置为与客户计算机LocalPort属性相同的端口,最后调用SendDat

35、a方法来发送信息,而客户计算机则使用DataArrival事件内的GetData方法来获取服务器计算机发送来的信息。第三章Winsock编程概述Winsock就是Windows Socket的简称。最简单地说,Winsock就是Windows应用程序与TCP/IP之间的通信界面。当然,Winsock还支持其他一些网络协议栈,例如,Novell的IPX/SPX协议栈。现在最新版本是Winsock2.0版。3.1套接字的概念Socket是网络上运行的两个程序间双向通信连接的一端。Socket这个词的一般意义是自然的或人工的插口,如家用电器的电源插口等。客户程序可以向Socket写请求,服务器将处理

36、此请求,然后通过Socket把结果返回给客户。Socket是一种底层连接。客户机和服务器通过写入到Socket的字节流进行通信。它们必须有共同的协议,也就是说,通过Socket相互传送信息时所用的语言必须是协定好的。3.2套接字的种类流式套接字(SOCK_STREAM):提供了一个面向连接、可靠的数据传输服务,数据无差错、无重复地发送,且按发送顺序接收。内设流量控制,避免数据流超限;数据被看作是字节流,无长度限制。文件传送协议(FTP)即使用流式套接字。数据报式套接字(SOCK_DGRAM):提供了一个无连接服务。数据包以独立包形式被发送,不提供无错保证,数据可能丢失或重复,并且接收顺序混乱。

37、网络文件系统(NFS)使用数据报式套接字。原始套接字(SOCK_RAW): 该接口允许对较低层协议,如IP、ICMP直接访问。常用于检验新的协议实现或访问现有服务中配置的新设备。3.3套接字的建立一个人要能够收到别人打给他的电话,首先他要装上一门电话。同样,必须先建立 socket 以侦听线路。这个过程包含几个步骤。首先,要建立一个新的 socket,就像先装上电话一样。socket() 命令就完成这个工作。 因为 sockets 有几种类型,因此要注明我们要建立什么类型的。我们要做一个选择是 socket 的地址格式。如同电话有音频和脉冲两种形式一样,socket 有两个最重要的选项是 AF

38、_UNIX 和 AF_INET。我们这里将着重于 AF_INET 方式。AF_INET 使用202.117.1.13 这样被点号隔开的四个十进制数字的地址格式。除了机器地址以外,还可以利用端口号允许每台机器上的多个 AF_INET socket。另外一个必须提供的参数是 socket 的类型。流式套接字提供了双向、有序的、无重复的以及无记录边界的数据流服务,适合处理大量数据。它是面向联结的,必须建立数据传输链路,同时还必须对传输的数据进行验证,确保数据的准确性。因此,系统开销较大。而数据报套接字也支持双向的数据流,但不保证传输数据的准确性,但保留了记录边界。由于数据报套接字是无联接的,例如广播

39、时的联接,所以并不保证接收端是否正在侦听。数据报套接字传输效率比较高。SOCK_RAW是将套接字定义为原始套接字。原始套接字保存了数据包中的完整IP头,前面两种套接字只能收到用户数据。因此可以通过原始套接字对数据进行分析。在建立 socket 后,我们就要提供 socket 侦听的地址了。bind() 函数来处理这件事情,将本地地址绑定到所创建的套接字上。然后我们要做的就是设置 SOCK_RAW 为SIO_RCVALL,以便接收所有的IP包。这里的SIO_RCVALL是指示SOCK_RAW接收所有的数据包。前面的工作基本上都是对原始套接字进行设置,在将原始套接字设置完毕,使其能按预期目的工作时

40、,就可以通过recv()函数从网卡接收数据了,接收到的原始数据包存放在缓存RecvBuf中,缓冲区长度BUFFER_SIZE定义为65535。然后就可以根据前面对IP数据段头、TCP数据段头的结构描述而对捕获的数据包进行分析。第四章网络流量测量的程序实现4.1 网卡初始化本论文在介绍对网卡初始化的过程中,主要介绍以下几项工作:获得网卡的MAC地址,得到本机网卡的数目,Reset网卡,通过IP地址得到机器名。在论文中把这几项工作一起放到网卡初始化部分介绍,其中一个主要原因就是这些主要都是利用NetBios来完成的。下面我们来详细介绍。4.1.1 NetBios概述NetBios是PC网络中用得最

41、为广泛的网络协议之一,大多数的局域网(LAN)产品都支持NetBios。因此,将NetBios作为网络协议的优点是:基于NetBios网络应用程序并不需修改便能在其它各种网络环境下运行,用户将享受到极大的灵活性,既使改用了其它网络也能继续使用原先的应用程序,避免了重复投入。4.1.2 利用NetBios来初始化网卡NetBios API只包括了一个函数,就叫做NetBios。这个函数使用网络控制块NCB(network control block)结构作为参数,这个结构告诉函数要做什么。这个结构中包括多个成员,如ncb_command,ncb_num,ncb_length等。我们着重介绍一下n

42、cb_command。每一个发往NetBios的NCB都代表一项要执行的动作,具体执行哪项动作,由ncb_command字段的取值决定。我们使用三个命令来探测MAC地址:NCBENUM,NCBRESET,NCBASTAT。NCBENUM列举系统中网卡的数量。NCBRESET重置网卡。NCBASTAT 接受本地或远程接口卡的状态。使用此命令后,ncb_buffer成员指向由ADAPTER_STATUS结构填充的缓冲区,随后是NAME_BUFFER结构的数组。具体在程序实现的时候我们首先利用NCBTRSRT重置网卡,以便我们可以查询。接着,可以发送NCBASTAT命令以获取网卡的信息。向网卡发送N

43、CBENUM命令,以获取当前机器的网卡信息,如网卡的个数,网卡的编号等。最后对于每张网卡以其网卡编号为输入编号,获取其MAC地址。4.2 原始套接字的设置具体设置步骤如下:1、WSAStartup(MAKEWORD(2, 2), &WSAData)查看Winsock的版本号。2、s=socket(AF_INET,SOCK_RAW,IPPROTO_RAW)创建原始套接字3、setsockopt(sock, IPPROTO_IP, IP_HDRINCL, (char*)&flag, sizeof(flag);IP头操作选项,将flag设置成TRUE,亲自对IP头进行处理。4、gethostname

44、(char*)LocalName, sizeof(LocalName)-1);获取本机名。5、pHost = gethostbyname(char*)LocalName)获取本地IP地址。6、addr_in.sin_addr=*(in_addr *)phost-h_addr_list0; addr_in.sin_family = AF_INET; addr_in.sin_port = htons(57274);填充SOCKADDR_IN,第一句将IP地址与本机绑定,然后定义SOCKET类型为AF_INET,然后设定其端口号,可以为任意值,但是最好不要和公共端口号相同。7、bind(sock, (PSOCKADDR)&addr_in, sizeof(addr_in);绑定原始套接字到本地网卡上。8、ioctlsocket(sock, SIO_RCVALL, &dwValue); 设置 SOCK_RAW 为SIO_RCVALL,以便接收所有的IP包。其中SIO_RCVALL的定义为: #define SIO_RCVALL _WSAIOW(IOC_VENDOR,1)。在对原始套接字设置完毕后就可以通过reiv()从网卡接收数据,接收到的原始数据包存放在缓存buf中。4.3 IP包的协议分析前面在

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号