1、目 录1 引言 11.1 课题背景 11.2 网络流量监控的引入 11.3 课程设计的目的与任务 12 相关的概念与技术 22.1 TCP/IP 体系结 构 .22.2 原始套接字 33 网络数据的采集技术分析 43.1 Windows 下原始数据包捕获的实现 .43.2 原始数据包捕获的关键函数 54 网络流量监控系统各模块的设计与实现 64.1 总体结构设计 64.2 流程图设计 74.3 各模块功能概述与实现 84.3.1 数据包采集中各类的关系 84.3.2 数据包捕获与分析模块 94.3.3 流量获取模块 104.3.4 数据统计模块 135 分析工具测试 135.1 测试环境 13
2、5.2 测试步骤 135.3 测试结果评价 136 结束语 13参考文献: 14网络工程课程设计11 引言1.1 课题背景随着构建网络基础技术和网络应用的迅速发展以及用户对网络性能要求的提高,使得网络管理成为迫切需要解决的问题,有效的网络管理能够保证网络的稳定运行和持续发展,更重要的是,随着网络规模的扩大和黑客技术的发展,入侵和攻击的案例日益增多,对稳定的网络服务、信息安全、互联网秩序都提出了严峻的挑战,网络安全管理在整个网络管理系统里扮演起更为重要的角色。1.2 网络流量监控的引入网络安全管理体系中,流量监控和统计分析是整个管理的基础。流量检测主要目的是通过对网络数据进行实时连续的采集监测网
3、络流量,对获得的流量数据进行统计计算,从而得到网络主要成分的性能指标。网络管理员根据流量数据就可以对网络主要成分进行性能分析管理,发现性能变化趋势,并分析出影响网络性能的因素及问题所在。此外,在网络流量异常的情况下,通过扩展的流量检测报警系统还可以向管理人员报警,及时发现故障加以处理。在网络流量检测的基础上,管理员还可对感兴趣的网络管理对象设置审查值范围及配置网络性能对象,监控实时轮询网络获取定义对象的当前值,若超出审查值的正常预定值则报警,协助管理员发现网络瓶颈,这样就能实现一定程度上的故障管理。而网络流量检测本身也涉及到安全管理方面的内容。由此可见,对于一个有效的网络安全管理系统来说,功能
4、的实现都或多或少的依赖于流量信息的获取。因此网络流量信息的采集可以说是网络安全管理系统得以实现的核心基石。它的应用可以在一定程度上检测到入侵攻击,可以有效地帮助管理人员进行网络性能管理,并利用报警机制协助网管人员采取对应的安全策略与防护措施,从而减少入侵攻击所造成的损失。1.3 课程设计的目的与任务该网络流量监控及分析工具主要用途是通过实时连续地采集网络数据并对其进行统计,网络工程课程设计2得到主要成分性能指标,结合网络流量的理论,通过统计出的性能指数观察网络状态,分析出网络变化趋势,找出影响网络性能的因素。课程设计开发的工具实现以下功能:(1)采用 Winsock 编写原始套接字 Socke
5、t-Raw 对数据包进行采集捕获,并可实现分类及自定义范围进行捕获;(2)对捕获的数据包进行一定的解析;(3)访问操作系统提供的网络性能参数接口,得到网卡总流量、输入流量和输出流量;(4)系统提供了多种方式显示结果,如曲线图、列表等;(5)使用 IP 帮助 API 获取网络统计信息;(6)实现对部分常见威胁的预警,可继续开发扩展其报警功能。2 相关的概念与技术2.1 TCP/IP 体系结构由于 TCP/IP 比其之前的 OSI 模型更具体实现,随着互联网的不断发展,遵循 TCP/IP结构的网络不断普及,因此现在通常采用 TCP/IP 代表 Internet 体系结构。TCP/IP 的目的是在网
6、络标准不同的情况下解决互联问题,可以说,网络互联是 TCP/IP 的核心。TCP/IP 的体系结构如图 1 所示。图 1网络工程课程设计3TCP/IP 在设计时重点并没有放在具体通信的实现上,所以对最后两层没有做出具体规定,同时表明它允许不同类型的通信网络参与通信。它的四个层次功能如下。(1)应用层,提供常用的应用程序及自定义的应用程序,数据传输时用 TCP/IP 协议来进行;(2)传输层,提供端到端的应用程序之间的通信,可以使用传输控制协议TCP(Transmission Control Protocol)或用户数据报协议 UDP(User Datagram Protocol)协议,前者提供
7、可靠传输,传送单位是报文段,后者提供不可靠服务,传输单位是数据报,即分组。此外,传输层另外一个功能就是区别应用程序;(3)网际层,负责计算机之间的通信,采用的协议是 IP 协议,数据传送单位是分组,向上提供不可靠的传输服务;(4)网络接口层,负责接收数据报,并实现发送,或者接收帧,提取 IP 数据报,交给互联网层。2.2 原始套接字从用户的角度来看,标准的流式套接字和数据报套接字这两类套接字似乎涵盖了TCP/IP 应用的全部,因为基于 TCP/IP 的应用,从协议栈的层次(如图 2.2.1 所示)上讲,在传输层的确只可能建立于 TCP 或 UDP 协议之上,而流式套接字和数据报套接字又分别对应
8、于 TCP 和 UDP,所以几乎所有的应用都可以用这两类套接字实现。但是,当需要自定义数据包发送时或者需要分析所有经过网络的数据包的时候,就必须面临一种不同于前两者的方式Raw Socket,即原始套接字,程序员可以用它来发送和接收 IP 层以上的原始数据包, 如 ICMP,TCP, UDP 等,不仅这样,它还可以实现如伪装本地 IP、发送 ICMP 包等功能。图 2.2.1 协议栈层次网络工程课程设计4Raw Socket 广泛应用于高级网络编程,也是一种广泛的黑客手段。著名的网络sniffer、拒绝服务攻击(DOS) 、IP 欺骗等都可以以 Raw Socket 实现。Raw Socket
9、 与标准套接字(SOCK_STREAM、SOCK_DGRAM)的区别在于前者直接置“根“于操作系统网络核心(Network Core) ,而 SOCK_STREAM、SOCK_DGRAM 则“悬浮”于 TCP 和 UDP 协议外围,如图2.2.2 所示。3 网络数据的采集技术分析3.1 Windows 下原始数据包捕获的实现网络上的数据包捕获机制主要依赖于所使用的操作系统,不同的操作系统下有不同的实现途径。在 Windows 环境下,可通过网络驱动程序接口规范(NDIS ) ,WinSock 的SOCK_RAW 或虚拟设备驱动技术(VxD)等技术实现网络数据包的捕获功能。前面已经介绍到了,使用
10、原始套接字可以绕过 Socket 提供的功能,对底层的协议进行使用与开发,可以根据自己的需要生成想要的数据报文等,下面开始介绍使用原始套接字对数据包捕获进行开发的相关技术知识。第一,使用套接字前,需要了解网卡接收数据的工作原理:在正常情况下,网络接口只响应两种数据帧,一种是与自己的硬件相匹配的数据帧,另一种四向所有计算机广播的数据帧。在系统中,数据帧的收发由网卡完成,网卡程序接图 2.2.2 标准套接与原始套接字的关系网络工程课程设计5收从网络发来的数据包,根据其硬件地址去判断是否与本机的硬件地址匹配,若匹配就通知 CPU 产生中断进行响应,然后调用驱动程序设置的网卡中断程序地址调用驱动程序接
11、收数据,然后放入堆栈进行系统相关处理,若不匹配则直接丢弃该数据包3。对于网络接口,它一般具有 4 种数据接收模式:广播、组播、直接和混杂模式,只有当把接口设置为混杂模式时,网络接口才能接收所有的数据,无论地址是否匹配,所以在做本设计的时候一定要设置为混杂模式才能实现数据的采集。第二,需要了解套接字的工作程序和使用方法:一般来说,采用套接字开发网络程序需要经历以下几个基本步骤:启动、创建、绑定、监听(接受连接) 、连接、发送/ 接收数据、关闭、卸载等。第三,具体到 Windows 下利用原始套接字捕获网络数据可以这样设计:(1)启动套接字;(2)创建一个原始套接字;(3)将套接字与本地地址绑定;
12、(4)设置操作参数;(5)设置网络接口为混杂模式;(6)启动监听线程,开始接收数据;(7)退出关闭套接字。3.2 原始数据包捕获的关键函数(1)启动函数 WSAStartupint PASCAL FAR WSAStartup (DWORD wVersionRequested , LPWSADATA lpWSAData);每一个套接字应用程序都必须调用该函数进行一系列初始化工作,并且只有调用成功返回后,才能开始使用套接字,其中参数 wVersionRequested 是版本号,高字节是次版本号、低字节是主版本号,参数 lpWSAData 是指向 WSADATA 结构的指针。(2)套接字创建函数
13、socketSOCKET socket (int af , int type , int protocol);所有的通信在建立之前都必须创建一个套接字,socket 函数的功能就是创建套接字,其中参数 af 指协议地址族(address family) ,当建立的套接字是依赖于 UDP 或 TCP 的话,需要设置 af 为 AF_INET,表示采用 IP 协议。参数 type 是指协议的套接字类型,采用流式套网络工程课程设计6接字时用 SOCK_STREAM,采用数据报套接字时用 SOCK_DGRAM,采用原始套接字时用 SOCK_RAW。参数 protocol 是协议字段,默认情况下可直接设
14、置为 0。(3)绑定函数 bindint bind ( SOCKET s , struct sockaddr_in* name , int namelen);成功创建套接字后的下一步工作就是将本地网络接口与套接字进行绑定,其中参数 s是创建的套接字,参数 name 是需要绑定的通信对象的信息结构体指针,namelen 是该结构的长度。需要注意的是 sockaddr_in 结构:struct sockaddr_inshort sin_family; /地址族,设置为 AF_INETunsigned short sin_port; /指定的端口号struct in_addr sin_addr; /
15、IP 地址char sin_zero8;由于主机序列与网络序列的关系,在程序中需要使用 htons 等函数进行转换工作。(4)设置接口模式函数 WSAIoctlint WSAAPI WSAIoctl(SOCKET s, DWORDdwIoControlCode, LPVOID lpvInBuffer, DWORDcbInBuffer, LPVOID lpvOutBuffer, DWORDcbOutBuffer, LPDWORD lpcbBytesReturned,LPWSAOVERLAPPED lpOverlapped,LPWSAOVERLAPPED_COMPLETION_ROUTINElpC
16、ompletionRoutine);其中,s 为一个套接口的句柄,dwIoControlCode 为操作控制代码,lpvInBuffer 为输入缓冲区的地址,cbInBuffer 为输入缓冲区的大小,lpvOutBuffer 为输出缓冲区的地址,cbOutBuffer 为输出缓冲区的大小,lpcbBytesReturned 为输出实际字节数的地址,lpOverlapped 为 WSAOVERLAPPED 结构的地址,lpCompletionRoutine 为一个指向操作结束后调用的例程指针。调用成功后,WSAIoctl 函数返回 0,否则的话,将返回 INVALID_SOCKET 错误,应用程
17、序可通过 WSAGetLastError 来获取错误代码。(5)数据接收函数 recvint recv (SOCKET s , char* buf ,int len , int flags);网络工程课程设计74 网络流量监控系统各模块的设计与实现4.1 总体结构设计通过收集与分析简单网络流量监控软件的需求,总结出以下特征:(1)需要实现对网络接口数据包的尽可能多的捕获,将网卡设置为混杂模式,然后进行数据包的采集;(2)数据包的内容要进行一定的解析,对数据包的协议类型、源目地址、数据包截获时间、数据包内容需要进行分析;(3)监视结果输出有实时流量图、列表等显示;(4)实现日志记录,便于日后分析
18、;(5)对某些常见的攻击进行发现分析。总合以上要求与综合分析,分析工具总体设计如下,采用 VC+6.0 编写,分析工具具有三个主要功能部分:数据捕获与显示模块、流量信息统计模块、流量绘制模块,如图4.1_1 所示。数据采集模块:完成网络接口数据的捕获、解析和显示,可以根据用户定义条件组合来进行捕获,如只监视采用 TCP 或 UDP 协议的数据包,也可以监视用户希望关注的相关 IP地址的数据包,同时完成数据封包日志记录,提高了系统的灵活性。同时,在对数据包的解析过程中对一些常见入侵攻击特征进行判断,发出预警。该模块采用编写原始套接字开发。信息统计模块:完成统计功能,如统计 IP 要实现统计接收到
19、的数据报数量、接收到的数据中协议出错的数量、正在请求传输的数量、路由表中可用路由数量、丢弃的数量、需要重组/成功重组的数量等,统计 ICMP 需要完成发送/接收的消息数量、满足超过 TTL 的数量、重定向数量、时间戳请求/应答数量等;采用 IP 助手函数完成。流量绘制模块:完成总流量、输入流量、输出流量、瞬时流量值、最高流量值的显示;采用访问注册表网络性能数据完成有关数据的获取,通过流量图显示。4.2 流程图设计根据上面对各个功能模块的划分,进行更进一步的分析和设计,得到数据采集、注册表网络性能块访问大致的工作流程图,如 4.2_1 与图 4.2_2 所示。图 4.1_1 系统总体设计结构图流
20、量监控分析系统数据采集模块 信息统计模块 流量绘制模块网络工程课程设计84.3 各模块功能概述与实现4.3.1 数据包采集中各类的关系经过上面的分析与设计,得到该系统的总体功能结构、工作流程,也确定了从编写套接字到最后捕获数据,要经过创建、绑定、设置工作模式、启动线程、接收数据等一系列的处理操作。为了实现处理中的每一步操作,设计了数据捕获的类关系,如图 4.3.1 所示。图 4.2_1 数据捕获处理流程图 4.2_2 网络性能数据块访问流程网络工程课程设计9在上图中 CSockSupport,CSockHelper ,CPackInterDlg,CBinDataDlg 等是封装了各部分主要处理
21、功能的类。且这些类中封装了和这些类的操作相关的方法。将在后面对这些类的功能和实现进行详细介绍。4.3.2 数据包捕获与分析模块功能实现说明该功能模块主要由封装的 CSockSupport,CsockHelper ,CpackInterDlg ,CbinDataDlg 四个类完成,下面将对这些类进行详细说明。CsockSupport 类:主要负责检查 Socket 是否支持 2.0 版本,在该类中封装了 WSAStartup 完成 Socket 的启动;CsockHelper 类:主要实现了从获取本机信息结构、Socket 创建、绑定、设置、启动线程、数据接收到协议分析的全部方法,详细处理流程见
22、图 4.3.2 所示。GetLocalIP 实现获取本机地址操作的方法,LPHOSTENT lphp 是定义一个主机信息结构,获取过程由gethostname(szLocname,MAX_HOSTNAME_LAN)与gethostbyname(szLocname)完成;第一个参数是用于放置本机名称的缓冲,第二个参数是缓冲区长度,最后利用inet_ntoa 将 IP 地址转化为“.”式地址。StartCapture 方法完成套接字的创建、绑定、设置操作方式和启动线程;具体完成如下:m_sockCap = socket(AF_INET , SOCK_RAW , IPPROTO_IP);/创建套接字
23、bind(m_sockCap, (PSOCKADDR)/绑定setsockopt(m_sockCap, SOL_SOCKET, SO_REUSEADDR, (char*)/设置操作setsockopt(m_sockCap, IPPROTO_IP, IP_HDRINCL, (char*)/设置操作WSAIoctl(m_sockCap,SIO_RCVALL,/混杂模式m_hCapThread = CreateThread(NULL, 0, CaptureThread, this, 0, NULL);/启动线程线程函数 CaptureThread 主要完成数据的接收。数据接收后,将缓冲区数据转化为
24、IP数据格式后即可以开始解析过程,协议名称获取如下:for(int i=0; ih_lenver /中断进程CloseHandle(m_hCapThread); /关闭句柄m_hCapThread = NULL;if(m_sockCap)closesocket(m_sockCap); /关闭套接字CbinDataDlg 类主要完成对已捕获数据的存储和显示方法;CpackInterDlg 类通过建立CbinDataDlg 类和 CsockHelper 类对象实现数据捕获、解析、显示、存储等,同时它完成对捕获条件设置控件、日志记录控件的编写,在这里就不做详细介绍了。4.3.3 流量获取模块设计说明
25、设计思路:实际编程时,Windows 系统内提供了一个系统性能的接口,只需要访问这个接口就可以得到网络性能相关的数据,如流量;根据这个想法,设计出了本功能模块的子功能模块如下:访问性能数据子模块:负责对注册表进行访问,获取流量数据;显示子模块:负责将数据绘制在窗口中;框架子模块:负责消息映射和消息处理;本模块中,将使用到一个注册表访问函数 RegQueryValueEx,它根据开放的注册表键值与名字查找相关的类型和数据。它的函数原型如下:LONG RegQueryValueEx(HKEY hKey , LPCTSTR lpValueName , LPDWORD lpReserved , LPD
26、WORD lpType , LPBYTE lpData , LPDWORD lpcbData);参数说明:hKey 为预定的注册表系统键值;lpValueName 为需要查询的目标键值的名字;lpReserved 保留,但是必须为 NULL;网络工程课程设计11lpType 为键值类型;lpData 输入/输出接收键值的数据;lpcbData 输入/输出接收键值的缓冲大小标志。在 WindowsNT 下,当调用 RegQueryValueEx 时,若 hKey 被设置为HKEY_PERFORMANCE_DATA 返回的数据并不是直接显示被请求的数据对象。所以程序需要遍历整个数据块,数据块中的逻
27、辑结构如图 4.3.3 所示。从数据块的性能数据结构 PERF_DATA_BLOCK 开始,然后索引到PERF_OBJECT_TYPE 结构,而 PERF_COUNTER_DEFINITION 结构可以通过PERF_OBJECT_TYPE 的成员 HeaderByteLength 找到位置偏移,每一个PERF_OBJECT_TYPE 的成员 DefinitionLength 都能确定一个对应的PERF_INSTANCE_DEFINITION 结构,PERF_INSTANCE_DEFINITION 结构决定着PERF_COUNTER_BLOCK 结构 3。下面列出了获得网络接口流量的部分关键代码
28、:/得到当前的接口名字InterfaceName = Interfaces.GetAt(pos);/开辟性能数据缓冲unsigned char *data = new unsigned char DEFAULT_BUFFER_SIZE;/从 RegQueryValueEx 返回的值:本例中忽略改变量/从网络对象(索引是 510)查询性能数据RegQueryValueEx(HKEY_PERFORMANCE_DATA, “510“, NULL, 下面详细说明,注册表数据性能块访问过程的实现:/枚举链表中第一个对象PERF_OBJECT_TYPE *objectPtr = FirstObject(d
29、ataBlockPtr);/遍历链表 for(int a=0 ; aNumObjectTypes ; a+) char nameBuffer255;/判断是否是网络对象索引号是 510if(objectPtr-ObjectNameTitleIndex = 510) /偏移变量DWORD processIdOffset = ULONG_MAX;图 4.3.3 注册表网络性能数据块逻辑结构网络工程课程设计12/找到第一个计数器PERF_COUNTER_DEFINITION *counterPtr = FirstCounter(objectPtr);/遍历链表for(int b=0 ; bNumCo
30、unters ; b+) /判断接收的数据类型是否是我们需要的if(int)counterPtr-CounterNameTitleIndex= CurrentTrafficType)processIdOffset = counterPtr-CounterOffset;/下一个计数器counterPtr = NextCounter(counterPtr);/数据类型不是我们需要的if(processIdOffset = ULONG_MAX) delete data;return 1;/找到第一个实例(instance)PERF_INSTANCE_DEFINITION *instancePtr =
31、 FirstInstance(objectPtr);/遍历整个实例for(b=0 ; bNumInstances ; b+) wchar_t *namePtr = (wchar_t *) (BYTE *)instancePtr + instancePtr-NameOffset);/得到这个实例的 PERF_COUNTER_BLOCKPERF_COUNTER_BLOCK *counterBlockPtr = GetCounterBlock(instancePtr);/现在得到了接口的名字char *pName = WideToMulti(namePtr, nameBuffer, sizeof(n
32、ameBuffer);POSITION pos = TotalTraffics.FindIndex(b);if(pos!=NULL)fullTraffic = *(DWORD *) (BYTE *)counterBlockPtr + processIdOffset);TotalTraffics.SetAt(pos,fullTraffic);/如果当前的接口就是我们选择的接口if(InterfaceName = iName)traffic = *(DWORD *) (BYTE *)counterBlockPtr + processIdOffset);/判断处理的接口是否是新的if(Current
33、Interface != interfaceNumber) lasttraffic = acttraffic;trafficdelta = 0.0;CurrentInterface = interfaceNumber;else trafficdelta = acttraffic - lasttraffic;lasttraffic = acttraffic;delete data;return(trafficdelta);网络工程课程设计13/下一个实例instancePtr = NextInstance(instancePtr);/下一个对象objectPtr = NextObject(obj
34、ectPtr);delete data;return 0;catch(.)return 0;4.3.4 数据统计模块可以利用微软的 IP 助手中的 API 函数实现 IP 的统计,通过统计的数据可以在一定程度上发现网络性能瓶颈。涉及到的函数有GetUdpStatistic,GetTcpStatistic,GetIcmpStatistic,GetIStatistic,需要注意的是工程中要加载IPHelpapi.lib 库。函数调用结果通过列表可以直观显示出来,网络管理人员可以通过其中统计数量的变化监视网络性能。5 分析工具测试5.1 测试环境(1) 处理器 P4 2.0 G Mhz 以上;(2)
35、 内存 512M 以上;(3) 多台普通搭载网卡的 PC、经过路由器或交换机互联。(4) 操作系统 Win2000/NT/xp/win7/server2003 等;(5) VC+6.0。5.2 测试步骤(1) 首先,用多台 PC 搭建局域网络。(2) 其次,选定一台 PC 进行测试:数据包捕获(含设定条件) 、封包日志保存、流量峰值、数据统计。(3) 确定每个功能模块的测试要求。网络工程课程设计14(4) 对每个功能模块进行数据合法性检查、数据一致性检查。(5) 进行各模块的功能测试后,对关键模块进行回归测试。5.3 测试结果评价1. 界面设计(见图 5.3.1)图 5.3.1源 IP:监控网
36、络流量的起始 IP;目的 IP:监控网络流量的终止 IP;设置类:监控网络数据包的协议类型,包括:http,ftp,udp 等协议类型的数据包;2. 统计与分析界面(见图 5.3.2)网络工程课程设计15图 5.3.26 结束语经过两周的课程设计,我不仅在技术上取得了长足的进步,更在心态上发生了根本的改变。技术上,我以前从来没有深入接触过编程,从安装软件到环境配置再到程序调试,无疑是一个痛苦又快乐的过程。在这期间,因为自己能力有限,寻找了多方人士的帮助。和班级同学一起,我们常常因为一个简单的调试熬到半夜,程序虽然没有成功,但是在此期间,我对于编程的认识有了很大的提高。从完全依赖帮助文档及网络资
37、料,到自己亲手编写代码、分析代码并调试最后,在老师的帮助和指导下,我学会了如何去逐断调试代码,并发现问题所在。最后程序终于调试成功,一场程序编写下来,我明显感觉自己巩固、深化了理论知识,提高动手能力,培养了严谨的科学态度和良好的工作作风,形成良好的系统设计和分析能力,很好的达到了课程设计的目的。心态上,之前一直对编程存在一种恐惧感,觉得反正以后不走编程路,何必浪费时间。是老师让我明白,既然身为网络专业的学生,就必须具备网络专业应具备的能力,否则就没有达到学生的标准。两周下来,从一个路都不会走的小菜蛋到蹒跚学步的小菜鸟,信心在摧毁、重建,又摧毁又重建的过程中,坚实起来,而老师认真负责的工作态度、
38、严谨的治学精神、深厚的理论知识和实践经验都使我受益匪浅。在程序成功那一刻,再回想起之前无数的努力,觉得一切都是值得的,那种快乐与成就感溢于言表。世上无难事,只怕有心人,在这段有限的时间里,我真正领悟到了设计的乐趣并积极参与到里面,从更深的层网络工程课程设计16面了解到了编程的意义。最后,这次设计虽然已经结束了,但是我也很清楚的知道这次程序设计中仍存在很多不足处,主要是因为经验能力有限,不能有效的发现问题,解决问题,这些都是我以后要注意的。在今后,我将会继续锻炼自己的动手能力,以期全面的提高自己,完善自己。再次深深的感谢帮助过我的老师、同学,今后我将会继续努力。参考文献:1 陈伯成,范闽,李英杰. 利用网络监听维护子网系统安全的一种方法J.计算机工程与应用.2000,(10):133-135。2 李凌. Winsock 网络编程实用教程M. 北京:清华大学出版社,2003.11:9-35。3 曹衍龙,刘海英. Visual C+网络通信编程实用案例精选(第二版)M. 北京:人民邮电出版社,2006.5:425-437。4 孙贤淑. IP 网络流量测量的研究与应用D. 北京:北京邮电大学硕士论文, 2005。5 刘欣然. 支持高精度告警的网络入侵检测系统的设计与实现D. 北京:北京邮电大学硕士论文, 2005。