最新文章专题视频专题问答1问答10问答100问答1000问答2000关键字专题1关键字专题50关键字专题500关键字专题1500TAG最新视频文章推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37视频文章20视频文章30视频文章40视频文章50视频文章60 视频文章70视频文章80视频文章90视频文章100视频文章120视频文章140 视频2关键字专题关键字专题tag2tag3文章专题文章专题2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章专题3
当前位置: 首页 - 正文

网络流量测量软件的设计与实现

来源:动视网 责编:小OO 时间:2025-09-26 17:59:02
文档

网络流量测量软件的设计与实现

密级:NANCHANGUNIVERSITY学士学位论文THESISOFBACHELOR(2002—2005年)题目网络流量测量软件的设计与实现学院:信息工程学院系计算机专业:计算机科学与技术班级:新余函授站学号:学生姓名:付小清*******起讫日期:2005-3-22-----2005-5-20网络流量测量软件的设计与实现摘要:为了方便网络编程,90年代初,由Microsoft联合了其他几家公司共同制定了一套WINDOWS下的网络编程接口,即WindowsSockets规范,它不是一种网络协
推荐度:
导读密级:NANCHANGUNIVERSITY学士学位论文THESISOFBACHELOR(2002—2005年)题目网络流量测量软件的设计与实现学院:信息工程学院系计算机专业:计算机科学与技术班级:新余函授站学号:学生姓名:付小清*******起讫日期:2005-3-22-----2005-5-20网络流量测量软件的设计与实现摘要:为了方便网络编程,90年代初,由Microsoft联合了其他几家公司共同制定了一套WINDOWS下的网络编程接口,即WindowsSockets规范,它不是一种网络协
                                         密级:       

 

NANCHANG  UNIVERSITY

 学 士 学 位 论 文

THESIS  OF  BACHELOR

( 2002 —2005 年 )

题   目    网络流量测量软件的设计与实现    

学    院:      信息工程学院     系   计算机      

专    业:         计算机科学与技术            

班    级:           新余函授站               

学    号:                                        

学生姓名:             付小清                  

****             ***                 

起讫日期:       2005-3-22-----2005-5-20         

网络流量测量软件的设计与实现

摘 要:为了方便网络编程,90年代初,由Microsoft联合了其他几家公司共同制定了一套WINDOWS下的网络编程接口,即Windows Sockets规范,它不是一种网络协议,而是一套开放的、支持多种协议的Windows下的网络编程接口。本篇论文主要是介绍了在TCP/IP基础上利用winsock2对网卡进行编程,以达到网络流量监测的目的。论文首先介绍了TCP/IP协议,旨在介绍IP,TCP,UDP等比较重要的协议。主要是介绍IP头,TCP头,UDP头的特点,以便从IP头中可以获取源地址,目的地址,协议类型等信息。在随后的章节中提出了Socket的概念,Socket实际上提供了一个通信端口使所有拥有Socket的端口的计算机之间能够相互通信,在本论文中主要说明了socket的建立,监听和撤销的过程。具体到程序实现中,对网卡混杂模式的设置是通过原始套接字(raw socket)来实现的。为了让原始套接字能接受所有的数据,还需要通过将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 companies united by Microsoft. It is known as Windows Socket Norm. It isn't 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 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 address, 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 Socket’s 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.

KEY WORDS:TCP/IP, Winsock,RAW SOCKET, NetBIOS

目  录

摘 要…………………………………………………………………….1

Abstract………………………………………………………..2

前 言…………………………………………………………………….4

第一章 绪论……………………………………………………………5

1.1 TCP/IP协议及其协议分析方法……………………………….5

1.1.1 分层…………………………………………………………..5

1.1.2 IP地址……………………………………………………….6

1.1.3 端口…………………………………………………………..6

1.1.4 TCP/IP协议在Windows中的实现………………………….7

1.2 Winsock编程…………………………………………………...7

1.3 网络流量测量的程序实现原理………………………………..8

第二章 TCP/IP协议集………………………………………………9

2.1 TCP/IP协议简介……………………………………………….9

2.2 IP协议………………………………………………………….9

2.3 TCP协议………………………………………………………..10

2.3.1 TCP服务模型………………………………………………..10

2.3.2 TCP数据段头………………………………………………..11

2.3.3 TCP协议的建立……………………………………………..12

2.4 UDP协议………………………………………………………..13

第三章 WINSOCK编程概述…………………………………………14

3.1 套接字的概念………………………………………………….14

3.2 套接字的种类………………………………………………….14

3.3 套接字的建立………………………………………………….14

第四章 网络流量测量的程序实现……………………………….16

4.1 网卡初始化…………………………………………………….16

4.1.1 NetBios概述…………………………………………………16

4.1.2 利用NetBios来初始化网卡………………………………..16

4.2 原始套接字的设置…………………………………………….16

4.3 IP包的协议分析………………………………………………17

4.4 结果与测试…………………………………………………….19

结  论…………………………………………………………………….21

结束语…………………………………………………………………….22

参考文献…………………………………………………………………23

前   言

随着计算机网络技术日新月异的发展,Internet的逐渐普及,网络对于人们已经不再是一个陌生的概念。可以说,网络已经在很多人的生活中占据了重要的地位。于是,各种各样的软件随之诞生,使人们能够更加方便,快捷的访问网络,了解网络以充分的利用网络。

本论文就是向大家介绍网络中比较常用的技术——网络流量的监测。在介绍具体的程序实现之前,论文首先介绍了TCP/IP协议,可以说,任何网络技术都与TCP/IP协议有着密切的关联,TCP/IP协议给不同型号的计算机,不同的操作系统之间提供了相互通信的平台。TCP/IP起源于60年代末美国资助的一个分组交换网络研究项目,到现在90年代已发展成为计算机之间最常应用的组网形式。它是一个真正的开放系统,因为协议组件的定义及其多种实现可以不用花钱或花很少的钱就可以公开地得到。

在进行网络流量的测量之前,我们首先要对本地机的信息有一个了解。这些信息的获取是通过Netbios来完成的。Netbios利用其网络控制快NCB来完成我们需要它去完成的对网卡的初始化工作。通过ncb_command来发出命令完成对网卡的操作。通过发送NCBENUM命令获取网卡的数目和每个网卡的内部编号;对选定的网卡发送一个NCBRESET命令,以便进行初始化;接着,可以发送NCBASTAT命令以获取网卡的信息。这样,我们可以读出网卡的MAC地址以便进行进一步的工作。

要实现网络流量的测量,Winsock给我们提供了一个接口,我们通过这个接口可以实现对IP层以上的层的数据包的监测。我们通过建立原始套接字,利用Winsock提供给我们的一些特定的函数就可以完成对网络数据包的捕获。首先需要建立一个socket,将它设置成为是对ip头的操作,然后利用gethostname,phost获取本机名,本机ip地址。将本机地址与IP地址绑定之后,将网卡设置为混杂模式,以便对所有经过它的数据包进行接收。在这些准备工作已经做好之后,余下的就是利用recv()来捕获网络中的数据包。

到现在为止,我们所作的工作都是分析工作的铺垫。我们最后所要看到的就是网络数据包的分析结果。在数据包的分析过程中,用户一般想得到的主要信息不外乎是包的协议类型,源/目的地址,发送/接收端口以及包的大小,定义指针,分别指向数据包的相对应的位置就可以得到这些信息。将得到的信息罗列并显示出来之后,我们就完成了对网络中数据包的流量监测过程。

在论文的最后对整篇论文进行了总结,说明了一些不足之处,并对所有对这篇论文知道并建议的老师等表示感谢。

第一章 绪论

1.1 TCP/IP协议及其协议分析方法

TCP/IP起源于60年代末美国资助的一个分组交换网络的研究项目,到现在90年代已发展成为计算机之间最常用的组网形式。它是一个真正的开放系统,因为协议组件的定义及其多种实现可以不用花钱或花很少的钱就可以公开地得到。它成为被称作“全球互联网”或“因特网”(Internet)的基础。

1.1.1 分层

协议分层的概念的提出是为了减少协议设计的复杂性,每一层都建立到它的下层之上,每一层的目的就是为了向上一层提供特定的服务。一台机器的第n层向另一台机器的第n层会话,通话的规则称为协议。分层和协议构成了网络体系结构。

在提到了分层的概念时就不能不提一下OSI参考模型。该模型基于国际化标准组织,共分为七层:

♦物理层:涉及到通信在信道上传输的原始比特流。

♦数据链路层:加强物理层传输原始比特流的功能,使之对网络层显现为一条无错线路

♦网络层:关系到子网的运行控制,其中一个关键的问题就是路由选择。

♦传输层:为用户提供端到端的数据传送服务。

♦会话层:允许不同机器上的用户建立会话关系,为用户提供会话控制服务。

♦表示层:为用户提供数据转换和表示服务。

♦应用层:为用户提供访问OSI的接口,其中包括大量的常见的协议。

TCP/IP通常被认为是一个四层协议系统,每一层负责不同的功能。

♦数据链路层,通常包括操作系统中的设备驱动程序和计算机中对应的网络接口卡。它们一起处理与电缆(或其他任何传输媒介)的物理接口细节。

♦网络层,处理分组在网络中的活动,例如分组的路由选择。在TCP/IP协议组件中,网络层协议包括IP协议(网际协议),ICMP协议(Internet互连网控制报文协议),以及IGMP协议(Internet组管理协议)。

♦运输层,主要为两台主机上的应用程序提供端到端的通信。在TCP/IP协议组件中,有两个互不相同的传输协议:TCP(传输控制协议)和UDP(用户数据报协议)。TCP为两台主机提供高可靠性的数据通信。而另一方面,UDP则为应用层提供一种非常简单的服务。它只是把称作数据报的分组从一台主机发送到另一台主机,但并不保证该数据报能到达另一端。

♦应用层,负责处理特定的应用程序细节。几乎各种不同的TCP/IP实现都会提供下面这些通用的应用程序: Telnet 远程登录,FTP 文件传输协议,SMTP 用于电子邮件的简单邮件传输协议,SNMP 简单网络管理协议。

图1-1 OSI模型与TCP/IP模型的比较

如图所示,OSI模型有七层,而TCP/IP模型只有4层。OSI模型在网络层支持无连接和面向连接的通信,而TCP/IP模型在网络层仅有无连接的通信方式,但是在传输层却支持两种模式,更好的面向了用户。

1.1.2 IP地址

互连网上的每个接口必须有一个唯一的Internet地址(也称作IP地址)。IP地址长32 bit。这些32位的地址通常写成四个十进制的数,其中每个整数对应一个字节。这种表示方法称作“点分十进制表示法”。需要再次指出的是,多接口主机具有多个IP地址,其中每个接口都对应一个IP地址。

由于互连网上的每个接口必须有一个唯一的IP地址,因此必须要有一个管理机构为接入互连网的网络分配IP地址。这个管理机构就是互连网络信息中心(Internet Network Information Centre)称作InterNIC。InterNIC只分配网络号。主机号的分配由系统管理员来负责。

1.1.3 端口

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

类似于文件描述符,每个端口都拥有一个叫端口号(port number)的整数型标识符,用于区别不同端口。端口号的分配是一个重要问题。端口号的分配有两种基本分配方式:第一种叫全局分配,这是一种集中控制方式,由一个公认的机构根据用户需要进行统一分配,并将结果公布于众。第二种是本地分配,又称动态连接,即进程需要访问传输层服务时,向本地操作系统提出申请,操作系统返回一个本地唯一的端口号,进程再通过合适的系统调用将自己与该端口号绑定起来。

1.1.4 TCP/IP协议在Windows中的实现

对TCP/IP协议有了一个结构性的了解之后,就要考虑TCP/IP协议在Windows中是如何应用的。TCP/IP和OSI有一层映射关系,所以可以将TCP/IP通过OSI映射到Windows操作系统中去。OSI在Windows中的实现:物理层就是网卡,数据链路层就是网卡驱动程序,网络层就是NDIS(网络驱动程序接口规范),传输层是TDI(传输驱动程序接口),会话层是SPI(服务提供者接口),表示层是API(应用编程接口),应用层通常就是EXE文件。

1.2 Winsock编程

Winsock就是Windows Socket的简称,最简单的说,Winsock就是Windows应用程序与TCP/IP之间的通信界面。如图:

图1-2 Winsock在TCP/IP和OSI中的表示

在Windows中,利用Winsock通信需经过几个步骤:初始化Winsock,创建套接字,建立会话,传送数据,中止会话,中止Winsock。Winsock既可以提供机器间的通讯,又可提供Windows进程间的通信。

1.3 网络流量测量的程序实现原理

网络流量监测器也是通过对网卡的编程来实现网络通讯的,对网卡的编程也是使用通常的套接字(socket)方式来进行。但是,通常的套接字程序只能响应与自己硬件地址相匹配的或是以广播形式发出的数据帧,对于其他形式的数据帧比如已到达网络接口但却不是发给此地址的数据帧,网络接口在验证投递地址并非自身地址之后将不引起响应,也就是说应用程序无法收取到达的数据包。而网络监测器的目的恰恰在于从网卡接收所有经过它的数据包,这些数据包即可以是发给它的也可以是发往别处的。显然,要达到此目的就必须将其设置为混杂模式。

这种对网卡混杂模式的设置是通过原始套接字(raw socket)来实现的,这也有别于通常经常使用的数据流套接字和数据报套接字。在创建了原始套接字后,需要通过Setsockopt()函数来设置IP头操作选项,然后再通过bind()函数将原始套接字绑定到本地网卡。为了让原始套接字能接受所有的数据,还需要通过ioctlsocket()来进行设置,而且还可以指定是否亲自处理IP头。至此,实际就可以开始对网络数据包进行监测了,对数据包的获取仍通过recv()函数来完成。

第二章 TCP/IP协议集

2.1 TCP/IP协议简介

很多不同的厂家生产各种型号的计算机,它们运行完全不同的操作系统,但TCP/IP协议组件允许它们互相进行通信。TCP/IP模型是一种层级式(Layering)的结构,每一层都呼叫它的下一层所提供的服务来完成自己的需求。TCP/IP模型可以分为以下四层:应用层、传输层、网络层、数据链路层。本章主要对TCP/IP协议组件进行概述。

2.2 IP协议

IP是TCP/IP协议族中最为核心的协议。所有的TCP,UDP,ICMP,及IGMP数据都以IP数据报格式传输。与大多数网络层协议不同,IP协议一开始就是为了网络互连的目的而设计的,它的工作是提供一种从源端到目的端传输数据报的最佳尝试方法,不管这些机器是否在同一网络中。我们可以通过分析IP数据报的头部来更好的了解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): 让目的主机判断新来的分段属于哪个分组,所有属于同一分组的字段包含同样的标识值。

6、分段偏移(fragment offset):说明分段在当前数据报的什么位置。除了数据报的最后一个分段外,所有分段都要乘以8字节。因为在分段位移前有3位,其中两位是未用的位,然后是两个1位字段,DF表示不要分段,MF表示还有进一步的分段。这样表示分段位移的位只有13位,因此每个数据报最长是8192个分组,这样最大的数据报长度是65536字节。

7、生命期(time to life):是同一个用来分组生命周期的计数器,最长生命周期255s,它必须在每个节点都递减,而且当一个路由器中排队时间过长可以十倍数递减。

8、协议(protocol):说明将它送给哪个传输进程的,协议的编号在整个因特网上是全球通用的,它定义于RFC 1700中。

9、头部校验和(header checksum):这种算法用来校验头部。该算法将头部所有16位半字数据累加起来,采用补运算,再取其结果的补码。网由于该算法的原理,当数据报到达时其头部校验和应该为0。

10、源地址(source)和目的地址(destination address):指明了网络号和主机号。

2.3 TCP协议

TCP(传输控制协议),是专门设计用于在不可靠的internet上提供可靠的、端到端的字节流通信的协议。每台支持TCP的机器均有一个TCP传输实体,或者是用户进程,或者负责管理TCP流以及与IP层接口的核心。TCP实体从本地进程接受用户的数据流,并将其分为不超过字节的数据片段,并将每个数据片段作为单独的IP数据报发送出去。当包含有TCP数据的IP数据报到达某台相连的机器后,他们又被送给该机器内的TCP实体,被重新组合为原来的数据流。IP层并不能保证将数据报正确地传送到目的端,因此TCP实体需要判定是否超时并根据需要重发数据报。到达的数据也可能是按照错误的顺序传到的,这也需要由TCP实体按正确的顺序重新将这些数据报组装成报文。

2.3.1 TCP服务模型

通过在发送方和接收方分别创建称为Socket的通信端点可以获得TCP服务。每个套接字序号包含主机的IP地址以及一个主机本地的16位号码,称为端口。为了获得TCP服务,必须在发送方的Socket和接收方的Socket之间明确的建立连接。

一个套接字可以被多个连接同时使用。序号小于256的端口称为通用端口。所有的TCP连接均是全双工的和点到点的,TCP不支持多点播送或广播。TCP连接是字节流而非报文流,报文边界并不按头尾衔接方式保存。当一个应用程序把数据送给TCP实体时,TCP根据自己的判断,可能会立刻将其发送出去或者将其缓存起来。

有时候用户为了立刻发送数据可以使用PUSH标志来通知TCP不能耽搁数据的发送。TCP服务的另一个特点就是紧急数据功能。当一个用户按下DEL或者CTRL+C中断一个已经开始的远程计算时,发送方应用程序在数据流中放入一些控制信息并将其与URGENT标志一起交给TCP,当紧急数据到达目的端之后,接受方应用程序被中断,然后去读取数据并进而发现了紧急数据。

2.3.2 TCP数据段头

发送和接收方TCP实体以数据段(segment)的形式交换数据。一个数据段包含一个固定的20字节的头,后面跟着以0字节或多字节的数据。对于数据段的大小有两个条件:(1)每个数据段必须适合IP的载荷能力,不能超过65535字节。(2)要求每个数据段必须适合最大传送单位MTU。TCP实体所用的基本协议是滑动窗口协议。当发送方传送一个数据段时,它要启动计时器。当数据段到达目的地后,接受方的TCP实体向回发送一个数据段,包含确认序号,希望收到下一个数据段的顺序号。如果确认号超时,则发送方将重发。

TCP数据段每段均以固定格式的20字节的头开始,固定的头后面可能是头的一些可选项。在可选项后面最多有65535-20-20=65495数据字节,第一个20指IP头,第二个20指TCP头。不带任何数据的数据段也是合法的,一般用于确认报文和控制报文。

以下介绍一下TCP数据段头中每个字段的含义:

图2-2 TCP头

1、源端口和目的端口字段标识出本地和远端的连接点。每个主机都可以自行决定如何分配自己的端口(从256开始)。

2、顺序号和确认号字段执行它的通用功能。确认号指希望接收下一个字节而不是前面已经正确接收的字节。

3、TCP头长表明在TCP头中包含多少个32位字。由于可选项字段是变长的,因此TCP头也是变长的,它实际上是指明了数据在数据段中的开始位置。接下来有6个未用的位。

4、接下来是六个1位的标志:

(1)URG位是应急指针标志,当用到了应急指针,则URG置1。应急指针指从当前顺序号到紧急数据位置的偏移量。

(2)ACK位置1表明确认号是合法的。ACK为0表示数据段不包括确认信息。

(3)PSH伪表示是带有PUSH位标志的数据。

(4)RST位用于复位由于主机崩溃或其他原因而出现错误的连接。

(5)SYN位用于建立连接。在连接请求中,SYN=1,ACK=0,表示捎带确认字段无效。连接响应数据段应带有确认,因此SYN=1,ACK=1。

(6)FIN位用于释放连接,它表明发送方已经没有数据发送了,然而当断开连接后,进程还可以继续接收数据。

5、窗口大小字段表示在确认了字节之后还可以发送多个字节,由于TCP中的流量控制是通过滑动窗口来处理的。窗口大小为0也是合法的,表示它已经收到了包括当前字段的所有数据段,但当前接收方急需暂停,希望不要发数据。

6、校验和也是为了确保高可靠性而设置的。它校验头部,数据和伪IP头(如下图)之和。当接收方对整个数据段,包括校验和字段进行运算时,结果应是0。

图2-3 TCP伪头

2.3.3 TCP协议的建立

TCP连接的建立使用三次握手协议,在此过程中双方要互报自己的初始序号,这样就可以保证包的接收顺序和发送顺序相一致。

1、(B) --> [SYN] --> (A)

假如服务器A和客户机B通讯. 当A要和B通信时,B首先向A发一个SYN (Synchronize) 标记的包,告诉A请求建立连接。

2、(B) <-- [SYN/ACK] <--(A)

接着,A收到后会发一个对SYN包的确认包(SYN/ACK)回去,表示对第一个SYN包的确认,并继续握手操作。SYN/ACK包是仅SYN 和 ACK 标记为1的包。

3、(B) --> [ACK] --> (A)

B收到SYN/ACK 包,B发一个确认包(ACK),通知A连接已建立。至此,三次握手完成,一个TCP连接完成。

2.4 UDP协议

Internet协议组同样支持无连接的传输协议UDP。RFC 768定义的UDP协议是个无连接的、不可靠的协议,它能够以最小的控制开销为应用层协议提供最基本的传输服务。UDP向应用程序提供了一种发送封装的原始IP数据报的方法,并且发送时无需建立连接。很多有一个请求和一个响应的客户-服务器应用程序采用UDP,这样可以避免建立和释放连接的麻烦。

一个UDP数据段包括一个8字节的头和数据部分。头的格式如下:

图2.4 UDP头

源端口和目的端口的作用与TCP中完全相同。UDP长度字段指明包括8字节的头和数据在内的数据段长度。UDP校验和字段包括伪UDP头,UDP头,UDP数据,如果有必要再补充为偶数个字节。该字段是可选的,而且在不用于运算时记为0。

使用UDP协议时,为了传输数据,首先要设置客户计算机的LocalPort属性。然后服务器计算机只需将RemoteHost设置为客户计算机的IP地址,并将RemotePort属性设置为与客户计算机LocalPort属性相同的端口,最后调用SendData方法来发送信息,而客户计算机则使用DataArrival事件内的GetData方法来获取服务器计算机发送来的信息。

第三章 Winsock编程概述

Winsock就是Windows Socket的简称。最简单地说,Winsock就是Windows应用程序与TCP/IP之间的通信界面。当然,Winsock还支持其他一些网络协议栈,例如,Novell的IPX/SPX协议栈。现在最新版本是Winsock2.0版。

3.1 套接字的概念

Socket是网络上运行的两个程序间双向通信连接的一端。Socket这个词的一般意义是自然的或人工的插口,如家用电器的电源插口等。客户程序可以向Socket写请求,服务器将处理此请求,然后通过Socket把结果返回给客户。Socket是一种底层连接。客户机和服务器通过写入到Socket的字节流进行通信。它们必须有共同的协议,也就是说,通过Socket相互传送信息时所用的语言必须是协定好的。

3.2 套接字的种类

流式套接字(SOCK_STREAM):提供了一个面向连接、可靠的数据传输服务,数据无差错、无重复地发送,且按发送顺序接收。内设流量控制,避免数据流超限;数据被看作是字节流,无长度。文件传送协议(FTP)即使用流式套接字。

数据报式套接字(SOCK_DGRAM):提供了一个无连接服务。数据包以包形式被发送,不提供无错保证,数据可能丢失或重复,并且接收顺序混乱。网络文件系统(NFS)使用数据报式套接字。

原始套接字(SOCK_RAW): 该接口允许对较低层协议,如IP、ICMP直接访问。常用于检验新的协议实现或访问现有服务中配置的新设备。

3.3 套接字的建立

一个人要能够收到别人打给他的电话,首先他要装上一门电话。同样,必须先建立 socket 以侦听线路。这个过程包含几个步骤。首先,要建立一个新的 socket,就像先装上电话一样。socket() 命令就完成这个工作。 

因为 sockets 有几种类型,因此要注明我们要建立什么类型的。我们要做一个选择是 socket 的地址格式。如同电话有音频和脉冲两种形式一样,socket 有两个最重要的选项是 AF_UNIX 和 AF_INET。我们这里将着重于 AF_INET 方式。AF_INET 使用202.117.1.13 这样被点号隔开的四个十进制数字的地址格式。除了机器地址以外,还可以利用端口号允许每台机器上的多个 AF_INET socket。

另外一个必须提供的参数是 socket 的类型。流式套接字提供了双向、有序的、无重复的以及无记录边界的数据流服务,适合处理大量数据。它是面向联结的,必须建立数据传输链路,同时还必须对传输的数据进行验证,确保数据的准确性。因此,系统开销较大。而数据报套接字也支持双向的数据流,但不保证传输数据的准确性,但保留了记录边界。由于数据报套接字是无联接的,例如广播时的联接,所以并不保证接收端是否正在侦听。数据报套接字传输效率比较高。SOCK_RAW是将套接字定义为原始套接字。原始套接字保存了数据包中的完整IP头,前面两种套接字只能收到用户数据。因此可以通过原始套接字对数据进行分析。

在建立 socket 后,我们就要提供 socket 侦听的地址了。bind() 函数来处理这件事情,将本地地址绑定到所创建的套接字上。然后我们要做的就是设置 SOCK_RAW 为SIO_RCVALL,以便接收所有的IP包。这里的SIO_RCVALL是指示SOCK_RAW接收所有的数据包。

前面的工作基本上都是对原始套接字进行设置,在将原始套接字设置完毕,使其能按预期目的工作时,就可以通过recv()函数从网卡接收数据了,接收到的原始数据包存放在缓存RecvBuf[]中,缓冲区长度BUFFER_SIZE定义为65535。然后就可以根据前面对IP数据段头、TCP数据段头的结构描述而对捕获的数据包进行分析。

第四章 网络流量测量的程序实现

4.1 网卡初始化

本论文在介绍对网卡初始化的过程中,主要介绍以下几项工作:获得网卡的MAC地址,得到本机网卡的数目,Reset网卡,通过IP地址得到机器名。在论文中把这几项工作一起放到网卡初始化部分介绍,其中一个主要原因就是这些主要都是利用NetBios来完成的。下面我们来详细介绍。

4.1.1 NetBios概述

NetBios是PC网络中用得最为广泛的网络协议之一,大多数的局域网(LAN)产品都支持NetBios。因此,将NetBios作为网络协议的优点是:基于NetBios网络应用程序并不需修改便能在其它各种网络环境下运行,用户将享受到极大的灵活性,既使改用了其它网络也能继续使用原先的应用程序,避免了重复投入。

4.1.2 利用NetBios来初始化网卡

NetBios API只包括了一个函数,就叫做NetBios。这个函数使用网络控制块NCB(network control block)结构作为参数,这个结构告诉函数要做什么。这个结构中包括多个成员,如ncb_command,ncb_num,ncb_length等。

我们着重介绍一下ncb_command。每一个发往NetBios的NCB都代表一项要执行的动作,具体执行哪项动作,由ncb_command字段的取值决定。我们使用三个命令来探测MAC地址:NCBENUM,NCBRESET,NCBASTAT。NCBENUM列举系统中网卡的数量。NCBRESET重置网卡。NCBASTAT 接受本地或远程接口卡的状态。使用此命令后,ncb_buffer成员指向由ADAPTER_STATUS结构填充的缓冲区,随后是NAME_BUFFER结构的数组。

具体在程序实现的时候我们首先利用NCBTRSRT重置网卡,以便我们可以查询。接着,可以发送NCBASTAT命令以获取网卡的信息。向网卡发送NCBENUM命令,以获取当前机器的网卡信息,如网卡的个数,网卡的编号等。最后对于每张网卡以其网卡编号为输入编号,获取其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((char*)LocalName, sizeof(LocalName)-1);获取本机名。

5、pHost = gethostbyname((char*)LocalName))获取本地IP地址。

6、addr_in.sin_addr=*(in_addr *)phost->h_addr_list[0]; 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包的协议分析

前面在第二章已经对IP头,TCP头,UDP头的结构进行了描述。以下我们将利用前面所介绍的结构特点对所捕获的数据包进行分析:

IP报头是由一个_iphdr的类来定义的,在这个类中定义了11项:

1、ver_len:版本,长度为4位;

2、type:服务类型,长度为8位;

3、length[2]:该数据报的总长,16位;

4、id[2]:报文标识,16位;

5、flag_offset[2]:分段偏移,16位,包括3位标志,13位分段偏移;

6、Time:生存时间,8位;

7、Protocol:协议类型,8位;

8、crc_val[2]:头校验和,16位;

9、src_addr[4]:源地址,32位

10、tar_addr[4]:目的地址,32位

11、options[4]:选项,32位

与IP头定义相同,TCP报头的定义了一个_tcphdr类,在这个类中定义了TCP头的9项:

1、source_port[2]:发送端端口号,16位;

2、dest_port[2]:接收端端口号,16位;

3、sequence_no[4]:顺序号,32位;

4、ack_no[4]:确认号,32位;

5、offset_reser_con[2]:数据偏移位,16位;

6、window[2]:窗口大小,16位;

7、checksum[2]:校验和,16位;

8、urgen_pointer[2]:紧急指针,16位;

9、options[3]:选项,32位;

对UDP头的定义,与TCP头的定义基本一致,这里就不再重复

我们利用RFC1700的协议定义,分别给IP协议,TCP协议和UDP协议进行定义:

1、#define PROTOCOL_IP 4,当IP头中Protocol为4时,这是一个IP数据包。

2、PROTOCOL_TCP 6,当IP头中Protocol为6时,这是一个TCP数据包。

3、#define PROTOCOL_UDP 17,当IP头中Protocol为17时,这是一个UDP数据包。

当函数recv()执行时,开始捕获网络中的数据包,定义一个名为len的缓冲区,当len>0时,说明接收到数据,开始进行数据包分析。

定义一个名为ip的指针,指向IP头的第一个位,定义一个名为tcp的指针指向地址=(IP头的首地址+IP头的长度)的位置。这两个指针的定义分别定义了IP头和TCP头。然后在IP头分析Protocol,如果满足上述定义的TCP头,UDP头的情况,利用函数GetProtocolTxt()分别输出“TCP”“UDP”。

将buf清0,得到一个16位的空栈,然后将ip指针分别指向src_addr[0],src_addr[1], src_addr[2] ,src_addr[3],彼此之间用“.”间隔开,得到数据包的源地址。同样的,将ip指向tar_addr[0],tar_addr[1],tar_addr[2],tar_addr[3],用“.”间隔开,得到数据包的目的地址。然后在分别由src_port,dest_port,datalen分别读出数据包的源端口,目的端口,和数据包长度。Datalen由length[0]×+length[1]。

最后,将该程序进行测试,该程序已经具备了网络流量测量的基本功能:捕获数据包,对数据包进行IP层以上的分析。

4.4 结果与测试

为了更加客观准确的显示出测量的数据包,我们首先直接将所截获的TCP包和UDP包的不经过加工直接显示出来:

首先截获UDP包,以下是在本机上运行一个利用UDP传输的程序时,运行数据包捕获程序所显示的数据包:

图5-1 截获的UDP包

图中所标记的11转化为10进制数后为17(UDP协议号),在两个字节后的部分ca 75 01 65表示源地址,e0 02 f3 47表示目的地址。05 98表示该数据包长度为1432(注意长度从版本位+IHL开始计算,从图中显示为第一行45)。

下图是在本机上运行FTP软件所截获的TCP包:

图5-2 运行FTP程序所截获的TCP数据包

与UDP相同,图中第二行所显示的ca c8 ee e0表示的源地址,随后ca c8 ee 50所表示的是数据包的目的地址。不同的是在源地址前两个字节处的06表示该数据包是利用TCP协议进行传输的。05 dc表示该TCP数据包的大小为1500,起始位为版本+IHL,在图中显示为第一行的45。

将以上所得到的数据包信息解析出来,用文字形式显示出来就可以让使用者能够清楚明白的了解所在局域网络的基本状态了。如图所示:

图5-3 当前网络基本状态示意图

结  论

通过网络流量监测统计的程序我们基本上可以了解到网络数据包中所包含的一般信息,该程序提取出数据包中比较有代表性的信息:协议,源/目的地址,源/目的端口以及数据包长度。通过这些信息,我们就可以对网络状态有一个大体上的了解。通过源/目的地址可以知道在网络上有哪些活动的主机,通过数据包长度的累加可以了解到当前网络的流量。

本论文介绍的以原始套接字的方式对网络数据进行捕获的方法实现起来比较简单,尤其是不需要编写VxD虚拟设备驱动程序就可以实现抓包,使得其编写过程变的比较简便。但由于捕获到的数据包头不包含有帧信息,因此不能接收到与 IP 同属网络层的其它数据包, 如ARP数据包、RARP数据包等。由于所学知识有限,没有对数据包做进一步的分析,而是仅仅给出了对一般信息的分析方法。通过本论文的介绍,可对原始套接字的使用方法以及TCP/IP协议结构原理等知识有一个基本的认识。

如果对TCP包/UDP包进行进一步的分析,就可以得到一些应用层的分析结果。这是通过对TCP/UDP协议的源端口和目的端口进行分析得到的。常用的一些协议的端口号有:

1、SMTP(simple mail transfer protocol):简单邮件传输协议,端口号25

2、POP3(post office protocol):电子邮局协议,端口号110

3、FTP:文件传输协议,端口号21,

4、HTTP:超文本传输协议,端口号80,

5、Telnet:远程终端会话协议,端口号23。

这些进一步的分析工作由于开始阶段的设计疏忽,没有在最终的程序部分显示出来。

结 束 语

应该说,在时间紧工作忙的情况下,在职完成毕业论文存在一定的困难,但通过老师的辅导及自己较好地处理工学矛盾,经过一个多月的努力之后,我总算完成了这次毕业设计,虽然说还算顺利,但是程序的编写过程中遇到了不少的问题,像Socket,Netbios以前在程序中基本上没有使用过。

在这里我要特别感谢伍军云老师和高专函授站的杨老师,在我挑选毕业设计题目和相关书籍过程中,他们给予了悉心的指导,使我能够按照规定完成自己的毕业设计任务。

在这里,我还要感谢我的哥哥,当我在程序中遇到问题时,常常能够得到他耐心的讲解,并在论文的完成过程中为我提出了很多的建议。

参考文献

[1]熊桂喜,王小虎著,计算机网络原理,北京:清华大学出版社,1998

[2]李增智,陈妍,计算机网络原理.西安:西安交通大学出版社,2003

[3]朱雁辉,Windows防火墙与网络封包截获技术,北京:电子工业出版社,2002

[4]李凌,Winsock 2网络编程实用教程,北京:清华大学出版社,2003

[5]肖文龙,最新TCP/IP实用教程,北京:中国铁道出版社,2001

[6]胡峪,VC++编程技巧与示例,西安:西安电子科技大学出版社,2000

文档

网络流量测量软件的设计与实现

密级:NANCHANGUNIVERSITY学士学位论文THESISOFBACHELOR(2002—2005年)题目网络流量测量软件的设计与实现学院:信息工程学院系计算机专业:计算机科学与技术班级:新余函授站学号:学生姓名:付小清*******起讫日期:2005-3-22-----2005-5-20网络流量测量软件的设计与实现摘要:为了方便网络编程,90年代初,由Microsoft联合了其他几家公司共同制定了一套WINDOWS下的网络编程接口,即WindowsSockets规范,它不是一种网络协
推荐度:
  • 热门焦点

最新推荐

猜你喜欢

热门推荐

专题
Top