学位论文之网络流量测量软件的设计与实现_第1页
学位论文之网络流量测量软件的设计与实现_第2页
学位论文之网络流量测量软件的设计与实现_第3页
学位论文之网络流量测量软件的设计与实现_第4页
学位论文之网络流量测量软件的设计与实现_第5页
已阅读5页,还剩20页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

密级: 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 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 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 Sockets 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. KEYKEY WORDSWORDS:TCP/IP, Winsock,RAW SOCKET, NetBIOS 目目 录录 摘 要.1 Abstract2 前 言.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.11.1 TCP/IPTCP/IP 协议及其协议分析方法协议及其协议分析方法 TCP/IP 起源于 60 年代末美国政府资助的一个分组交换网络的研究项目,到现在 90 年 代已发展成为计算机之间最常用的组网形式。它是一个真正的开放系统,因为协议组件的 定义及其多种实现可以不用花钱或花很少的钱就可以公开地得到。它成为被称作“全球互 联网”或“因特网”(Internet)的基础。 .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 模型在网络层仅有无连接的通信方式,但是在传输层却支持 两种模式,更好的面向了用户。 .2 IPIP 地址地址 互连网上的每个接口必须有一个唯一的 Internet 地址(也称作 IP 地址) 。IP 地址长 32 bit。这些 32 位的地址通常写成四个十进制的数,其中每个整数对应一个字节。这种表示方 法称作“点分十进制表示法” 。需要再次指出的是,多接口主机具有多个 IP 地址,其中每 个接口都对应一个 IP 地址。 由于互连网上的每个接口必须有一个唯一的 IP 地址,因此必须要有一个管理机构为接 入互连网的网络分配 IP 地址。这个管理机构就是互连网络信息中心(Internet Network Information Centre)称作 InterNIC。InterNIC 只分配网络号。主机号的分配由系统管理员来 负责。 .3 端口端口 网络中可以被命名和寻址的通信端口,是操作系统可分配的一种资源。按照 OSI 七层 协议的描述,传输层与网络层在功能上的最大区别是传输层提供进程通信能力。从这个意 义上讲,网络通信的最终地址就不仅仅是主机地址了,还包括可以描述进程的某种标识符。 为此,TCP/IP 协议提出了协议端口(protocol port,简称端口)的概念,用于标识通信的进 程。端口是一种抽象的软件结构,应用程序(即进程)通过系统调用与某端口建立连接后, 传输层传给该端口的数据都被相应进程所接收,相应进程发给传输层的数据都通过该端口 输出。在 TCP/IP 协议的实现中,端口操作类似于一般的 I/O 操作,进程获取一个端口,相 当于获取本地唯一的 I/O 文件,可以用一般的读写原语访问之。 类似于文件描述符,每个端口都拥有一个叫端口号(port number)的整数型标识符, 用于区别不同端口。端口号的分配是一个重要问题。端口号的分配有两种基本分配方式: 第一种叫全局分配,这是一种集中控制方式,由一个公认的中央机构根据用户需要进行统 一分配,并将结果公布于众。第二种是本地分配,又称动态连接,即进程需要访问传输层 服务时,向本地操作系统提出申请,操作系统返回一个本地唯一的端口号,进程再通过合 适的系统调用将自己与该端口号绑定起来。 .4 TCP/IPTCP/IP 协议在协议在 WindowsWindows 中的实现中的实现 对 TCP/IP 协议有了一个结构性的了解之后,就要考虑 TCP/IP 协议在 Windows 中是如 何应用的。TCP/IP 和 OSI 有一层映射关系,所以可以将 TCP/IP 通过 OSI 映射到 Windows 操作系统中去。OSI 在 Windows 中的实现:物理层就是网卡,数据链路层就是网卡驱动程 序,网络层就是 NDIS(网络驱动程序接口规范) ,传输层是 TDI(传输驱动程序接口),会 话层是 SPI(服务提供者接口),表示层是 API(应用编程接口),应用层通常就是 EXE 文 件。 1.21.2 WinsockWinsock 编程编程 Winsock 就是 Windows Socket 的简称,最简单的说,Winsock 就是 Windows 应用程序 与 TCP/IP 之间的通信界面。如图: 图 1-2 Winsock 在 TCP/IP 和 OSI 中的表示 在 Windows 中,利用 Winsock 通信需经过几个步骤:初始化 Winsock,创建套接字,建 立会话,传送数据,中止会话,中止 Winsock。Winsock 既可以提供机器间的通讯,又可提 供 Windows 进程间的通信。 1.31.3 网络流量测量的程序实现原理网络流量测量的程序实现原理 网络流量监测器也是通过对网卡的编程来实现网络通讯的,对网卡的编程也是使用通 常的套接字(socket)方式来进行。但是,通常的套接字程序只能响应与自己硬件地址相 匹配的或是以广播形式发出的数据帧,对于其他形式的数据帧比如已到达网络接口但却不 是发给此地址的数据帧,网络接口在验证投递地址并非自身地址之后将不引起响应,也就 是说应用程序无法收取到达的数据包。而网络监测器的目的恰恰在于从网卡接收所有经过 它的数据包,这些数据包即可以是发给它的也可以是发往别处的。显然,要达到此目的就 必须将其设置为混杂模式。 这种对网卡混杂模式的设置是通过原始套接字(raw socket)来实现的,这也有别于 通常经常使用的数据流套接字和数据报套接字。在创建了原始套接字后,需要通过 Setsockopt()函数来设置 IP 头操作选项,然后再通过 bind()函数将原始套接字绑定到本 地网卡。为了让原始套接字能接受所有的数据,还需要通过 ioctlsocket()来进行设置, 而且还可以指定是否亲自处理 IP 头。至此,实际就可以开始对网络数据包进行监测了,对 数据包的获取仍通过 recv()函数来完成。 第二章第二章 TCP/IPTCP/IP 协议集协议集 2.12.1 TCP/IPTCP/IP 协议简介协议简介 很多不同的厂家生产各种型号的计算机,它们运行完全不同的操作系统,但 TCP/IP 协 议组件允许它们互相进行通信。TCP/IP 模型是一种层级式(Layering)的结构,每一层都 呼叫它的下一层所提供的服务来完成自己的需求。TCP/IP 模型可以分为以下四层:应用层、 传输层、网络层、数据链路层。本章主要对 TCP/IP 协议组件进行概述。 2.22.2 IPIP 协议协议 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.32.3 TCPTCP 协议协议 TCP(传输控制协议),是专门设计用于在不可靠的 internet 上提供可靠的、端到端 的字节流通信的协议。每台支持 TCP 的机器均有一个 TCP 传输实体,或者是用户进程,或 者负责管理 TCP 流以及与 IP 层接口的核心。TCP 实体从本地进程接受用户的数据流,并将 其分为不超过 64 字节的数据片段,并将每个数据片段作为单独的 IP 数据报发送出去。当 包含有 TCP 数据的 IP 数据报到达某台相连的机器后,他们又被送给该机器内的 TCP 实体, 被重新组合为原来的数据流。IP 层并不能保证将数据报正确地传送到目的端,因此 TCP 实 体需要判定是否超时并根据需要重发数据报。到达的数据也可能是按照错误的顺序传到的, 这也需要由 TCP 实体按正确的顺序重新将这些数据报组装成报文。 .1 TCPTCP 服务模型服务模型 通过在发送方和接收方分别创建称为 Socket 的通信端点可以获得 TCP 服务。每个套接 字序号包含主机的 IP 地址以及一个主机本地的 16 位号码,称为端口。为了获得 TCP 服务, 必须在发送方的 Socket 和接收方的 Socket 之间明确的建立连接。 一个套接字可以被多个连接同时使用。序号小于 256 的端口称为通用端口。所有的 TCP 连接均是全双工的和点到点的,TCP 不支持多点播送或广播。TCP 连接是字节流而非报 文流,报文边界并不按头尾衔接方式保存。当一个应用程序把数据送给 TCP 实体时,TCP 根据自己的判断,可能会立刻将其发送出去或者将其缓存起来。 有时候用户为了立刻发送数据可以使用 PUSH 标志来通知 TCP 不能耽搁数据的发送。 TCP 服务的另一个特点就是紧急数据功能。当一个用户按下 DEL 或者 CTRLC 中断一个已 经开始的远程计算时,发送方应用程序在数据流中放入一些控制信息并将其与 URGENT 标志 一起交给 TCP,当紧急数据到达目的端之后,接受方应用程序被中断,然后去读取数据并 进而发现了紧急数据。 .2 TCPTCP 数据段头数据段头 发送和接收方 TCP 实体以数据段(segment)的形式交换数据。一个数据段包含一个固 定的 20 字节的头,后面跟着以 0 字节或多字节的数据。对于数据段的大小有两个限制条件: (1)每个数据段必须适合 IP 的载荷能力,不能超过 65535 字节。(2)要求每个数据段必 须适合最大传送单位 MTU。TCP 实体所用的基本协议是滑动窗口协议。当发送方传送一个数 据段时,它要启动计时器。当数据段到达目的地后,接受方的 TCP 实体向回发送一个数据 段,包含确认序号,希望收到下一个数据段的顺序号。如果确认号超时,则发送方将重发。 TCP 数据段每段均以固定格式的 20 字节的头开始,固定的头后面可能是头的一些可选 项。在可选项后面最多有 65535202065495 数据字节,第一个 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 位用于建立连接。在连接请求中,SYN1,ACK0,表示捎带确认字段无效。 连接响应数据段应带有确认,因此 SYN1,ACK1。 (6)FIN 位用于释放连接,它表明发送方已经没有数据发送了,然而当断开连接后, 进程还可以继续接收数据。 5、窗口大小字段表示在确认了字节之后还可以发送多个字节,由于 TCP 中的流量控制 是通过滑动窗口来处理的。窗口大小为 0 也是合法的,表示它已经收到了包括当前字段的 所有数据段,但当前接收方急需暂停,希望不要发数据。 6、校验和也是为了确保高可靠性而设置的。它校验头部,数据和伪 IP 头(如下图) 之和。当接收方对整个数据段,包括校验和字段进行运算时,结果应是 0。 图 2-3 TCP 伪头 .3 TCPTCP 协议的建立协议的建立 TCP 连接的建立使用三次握手协议,在此过程中双方要互报自己的初始序号,这样就 可以保证包的接收顺序和发送顺序相一致。 1、(B) SYN (A) 假如服务器 A 和客户机 B 通讯. 当 A 要和 B 通信时,B 首先向 A 发一个 SYN (Synchronize) 标记的包,告诉 A 请求建立连接。 2、(B) ACK (A) B 收到 SYN/ACK 包,B 发一个确认包(ACK),通知 A 连接已建立。至此,三次握手完 成,一个 TCP 连接完成。 2.42.4 UDPUDP 协议协议 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 方法来获取服务器计算机发送来的信息。 第三章第三章 WinsockWinsock 编程概述编程概述 Winsock 就是 Windows Socket 的简称。最简单地说,Winsock 就是 Windows 应用程序 与 TCP/IP 之间的通信界面。当然,Winsock 还支持其他一些网络协议栈,例如,Novell 的 IPX/SPX 协议栈。现在最新版本是 Winsock2.0 版。 3.13.1 套接字的概念套接字的概念 Socket 是网络上运行的两个程序间双向通信连接的一端。Socket 这个词的一般意义是 自然的或人工的插口,如家用电器的电源插口等。客户程序可以向 Socket 写请求,服务器将 处理此请求,然后通过 Socket 把结果返回给客户。Socket 是一种底层连接。客户机和服务器 通过写入到 Socket 的字节流进行通信。它们必须有共同的协议,也就是说,通过 Socket 相互 传送信息时所用的语言必须是协定好的。 3.23.2 套接字的种类套接字的种类 流式套接字(SOCK_STREAM):提供了一个面向连接、可靠的数据传输服务,数据无差 错、无重复地发送,且按发送顺序接收。内设流量控制,避免数据流超限;数据被看作是 字节流,无长度限制。文件传送协议(FTP)即使用流式套接字。 数据报式套接字(SOCK_DGRAM):提供了一个无连接服务。数据包以独立包形式被发 送,不提供无错保证,数据可能丢失或重复,并且接收顺序混乱。网络文件系统(NFS)使 用数据报式套接字。 原始套接字(SOCK_RAW): 该接口允许对较低层协议,如 IP、ICMP 直接访问。常用 于检验新的协议实现或访问现有服务中配置的新设备。 3.33.3 套接字的建立套接字的建立 一个人要能够收到别人打给他的电话,首先他要装上一门电话。同样,必须先建立 socket 以侦听线路。这个过程包含几个步骤。首先,要建立一个新的 socket,就像先装上 电话一样。socket() 命令就完成这个工作。 因为 sockets 有几种类型,因此要注明我们要建立什么类型的。我们要做一个选择是 socket 的地址格式。如同电话有音频和脉冲两种形式一样,socket 有两个最重要的选项是 AF_UNIX 和 AF_INET。我们这里将着重于 AF_INET 方式。AF_INET 使用 3 这样被点号隔开的四个十进制数字的地址格式。除了机器地址以外,还可以利用端口号允 许每台机器上的多个 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.14.1 网卡初始化网卡初始化 本论文在介绍对网卡初始化的过程中,主要介绍以下几项工作:获得网卡的 MAC 地址, 得到本机网卡的数目,Reset 网卡,通过 IP 地址得到机器名。在论文中把这几项工作一起 放到网卡初始化部分介绍,其中一个主要原因就是这些主要都是利用 NetBios 来完成的。 下面我们来详细介绍。 .1 NetBiosNetBios 概述概述 NetBios 是 PC 网络中用得最为广泛的网络协议之一,大多数的局域网(LAN)产品都 支持 NetBios。因此,将 NetBios 作为网络协议的优点是:基于 NetBios 网络应用程序并 不需修改便能在其它各种网络环境下运行,用户将享受到极大的灵活性,既使改用了其它 网络也能继续使用原先的应用程序,避免了重复投入。 .2 利用利用 NetBiosNetBios 来初始化网卡来初始化网卡 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.24.2 原始套接字的设置原始套接字的设置 具体设置步骤如下: 1、WSAStartup(MAKEWORD(2, 2), 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_list0; addr_in.sin_family = AF_INET; addr_in.sin_port = htons(57274);填充 SOCKADDR_IN,第一句将 IP 地址与本 机绑定,然后定义 SOCKET 类型为 AF_INET,然后设定其端口号,可以为任意值,但是最好 不要和公共端口号相同。 7、bind(sock, (PSOCKADDR)绑定原始套接字到本地网 卡上。 8、ioctlsocket(sock, SIO_RCVALL, 设置 SOCK_RAW 为 SIO_RCVALL,以 便接收所有的 IP 包。其中 SIO_RCVALL 的定义为: #define SIO_RCVALL _WSAIOW(IOC_VENDOR,1)。 在对原始套接字设置完毕后就可以通过 reiv()从网卡接收数据,接收到的原始数据包 存放在缓存 buf 中。 4.34.3 IPIP 包的协议分析包的协议分析 前面在第二章已经对 IP 头,TCP 头,UDP 头的结构进行了描述。以下我们将利用前面 所介绍的结构特点对所捕获的数据包进行分析: IP 报头是由一个_iphdr 的类来定义的,在这个类中定义了 11 项: 1、ver_len:版本,长度为 4 位; 2、type:服务类型,长度为 8 位; 3、length2:该数据报的总长,16 位; 4、id2:报文标识,16 位; 5、flag_offset2:分段偏移,16 位,包括 3 位标志,13 位分段偏移; 6、Time:生存时间,8 位; 7、Protocol:协议类型,8 位; 8、crc_val2:头校验和,16 位; 9、src_addr4:源地址,32 位 10、tar_addr4:目的地址,32 位 11、options4:选项,32 位 与 IP 头定义相同,TCP 报头的定义了一个_tcphdr 类,在这个类中定义了 TCP 头的 9 项: 1、source_port2:发送端端口号,16 位; 2、dest_port2:接收端端口号,16 位; 3、sequence_no4:顺序号,32 位; 4、ack_no4:确认号,32 位; 5、offset_reser_con2:数据偏移位,16 位; 6、window2:窗口大小,16 位; 7、checksum2:校验和,16 位; 8、urgen_pointer2:紧急指针,16 位; 9、options3:选项,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 的缓冲区,当 len0 时,说明接收到数据,开始进行数据包分析。 定义一个名为 ip 的指针,指向 IP 头的第一个位,定义一个名为 tcp 的指针指向地址 (IP 头的首地址IP 头的长度)的位置。这两个指针的定义分别定义了 IP 头和 TCP 头。 然后在 IP 头分析 Protocol,如果满足上述定义的 TCP 头,UDP 头的情况,利用函数 GetProtocolTxt()分别输出“TCP”“UDP”。 将 buf 清 0,得到一个 16 位的空栈,然后将 ip 指针分别指向 src_addr0, src_addr1, src_addr2 ,src_addr3,彼此之间用“.”间隔开,得到数据包的源 地址。同样的,将 ip 指向 tar_addr0,tar_addr1,tar_addr2,tar_addr3,用 “.”间隔开,得到数据包的目的地址。然后在分别由 src_port,dest_port,datalen 分 别读出数据包的源端口,目的端口,和数据包长度。Datalen 由 length0 length1。 3 2 最后,将该程序进行测试,该程序已经具备了网络流量测量的基本功能:捕获数据包, 对数据包进行 IP 层以上的分析。 4.44.4 结果与测试结果与测试 为了更加客观准确的显示出

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论