1、获取网络数据的技术,网络测量是通过收集数据或分组的踪迹定量分析不同的网络应用在网络中的分组活动情况的技术。 通过网络测量,可以更加有效地认识和了解网络的性能,进行高效的网络性能管理;可以发现网络故障并对其进行迅速定位;可以检测拥塞链路,预警拒绝服务攻击,实施流量工程,满足服务等级合同的高效QOS策略设计及实现多种形式科学计费。此外,网络测量还是建立网络流量模型的重要手段。因此,网络测量对于网络管理、流量模型的建立、网络行为的理解、网络规划等方面都有重要意义。,一、 网络测量的基本方式,1. 主动测量 通过向网络中注入测试流量数据,并从其响应结果数据中测量网络状态参数。由于在测量过程中引入了附加
2、流量,所以这种方法不可避免地要影响网络的正常运行;而且视其引入额外流量的多少,其测量结果也需要进行一定的修正以反映实际网络运行情况。如路由信息测量工具Traceroute、Skitter等就是通过向目的地址发送探测性数据包并记录其返回数据来测量路由信息的。,2. 被动测量 主要是通过对网络流量及状态参数的监视和收集来完成测量任务,其测量机制尽量避免干涉网络的正常运行,所以对网络性能的影响很小。例如OCXmon监测器通过光分器(light splitter)在光纤上搭线采集包头数据。对网络而言仅仅损失了一些能量,几乎没有影响到网络的正常运行。,测试仪在网络中的配置,ConsoleOV/PE,WA
3、N Analyzer,Protocol Inspector/Additional Console,Workgroup Agent,Workgroup Analyzer,Link Analyzer(w/Taps),WAN,NIS-OPV &OPV-PE,Cisco5500,Cisco5500,Cisco5500,Cisco5500,Cisco5500,Cisco6500,OPV-WGA/PRO,OPV-LA,TAP-12,OPV-WGA/PRO,OPV-WGA/PRO,二、 网络流量测量的基本方法,1. 基于监听方式1) 基本原理 虽然许多单位的主干网络采用高速非共享介质的网络结构,如ATM、F
4、DDI、交换式以太网,但与外界的互联绝大部分仍然依赖于共享介质网络(如以太网),在共享介质网络中,流经这一网络的任何一个数据包,均可以由这一网段的任何一台机器截获,因此,把用作网络流量采集的计算机安装在与外界互联的网段中,将该机网卡设置成“混杂”模式,就可以抓获进出网络的所有IP数据包,并对IP数据包进行解析重组后可以得到源地址、目的地址、数据量、应用协议等所需信息。,ConsoleOV/PE,WAN Analyzer,Protocol Inspector/Additional Console,Workgroup Agent,Workgroup Analyzer,Link Analyzer(w
5、/Taps),2) 特点 该方法的优点是:构建筒单,实现较为方便,不改变原来网络的结构,不增加网络的负载,不占用网络资源,不影响用户对网络的使用。,3) * 案 例(Japcap),(1)报文采集,报文采集核心程序如下:String devices = Jpcap.getDeviceList();String deviceName = devices0;Jpcap jpcap = Jpcap.openDevice(deviceName, 1028, true, 100); jpcap.loopPacket(-1, new JpcapTip();, 获取设备列表 由于实施流量测量的计算机可能安装
6、多块网卡,获取设备列表就是获得这些网卡的设备号。API提供了Jpcap.getDeviceList()方法以满足这一目标,该方法返回结果为一字符串。, 打开指定设备 一旦有了一个设备名称的目录,必须选取一个用来监听,并通过Jpcap.openDevice()方法打开它。openDevice()方法需要四个参数:即将打开的设备名、从设备上一次读取的最大字节数、说明是否将设备设为混杂模式的Boolean值和以后调用processPacket()方法要使用到的超时值。openDevice()方法将一个参数返回到用以捕获的Jpcap对象。如果调用processPacket(),那么Jpcap将一直捕获
7、包,直到超过openDevice中规定的时限或达到了规定的最大包数。,有了Jpcap实例,就可以调用loopPacket()方法开始监听了。loopPacket()带有两个参数:捕获的最大包数及执行JpcapHandler的一个类的实例。最大包数如果是-1,说明没有限制最大值。 Jpcap使用一个事件模型来处理包,一般创建一个jpcap.JpcapHandler类的子类作执行接口。,(2) 暂 存方式, Hash暂存方式Hash暂存方式是利用哈希表来暂存报文信息, 哈希表也称散列表,是线性表中一种重要的存储方式和检索方法,哈希表算法的基本思想是:由结点的关键码值决定结点的存储地址,即以关键码值
8、k为自变量,通过一定的函数关系h(称为哈希函数)计算出对应的函数值h(k),将这个值解释为结点的存储地址,将结点存入该地址中。检索时,根据要检索的关键码值,用同样的哈希函数计算出地址,然后到相应的地址中去获取要找的结点数据。因此, 哈希表平均检索的长度不直接依赖于表中元素的个数,利用哈希表可以对节点进行快速检索。,在Java中,Hashtable类为我们提供了哈希表的完整功能,可以让我们很方便地构造和使用哈希表来存储和查询数据。Hashtable( )方法用来创建Hashtable对象; Put( )方法完成把报文信息放到缓冲区。同时哈希表在它需要更多的存储空间时会自动增大容量。,import
9、 java.io.*;import jpcap.*;import java.util.*;public class JpcapTip implements JpcapHandler static long count=0;static long n; String s,s1;IPPacket ip;static Hashtable hashtable=new Hashtable(); / 创建Hashtable对象static String strange = 0000000000000000;DecimalFormat myFormatter = new DecimalFormat(stra
10、nge);public void handlePacket(Packet packet) if(packet instanceof IPPacket) ip=(IPPacket)packet; if(ip.length()=40 /把报文信息存放到Hash表中 , 缓冲区暂存方式 缓冲区暂存方式是在内存中开辟一块存储区来暂时存放报文信息,缓冲区的大小与内存的容量有关。如果抽样掩码与IP报文标识字段匹配成功,将报文信息以字符串形式追加到缓冲区中。,在Java中, StringBuffer类提供了丰富的字符串操作,用于发生变化的字符串的处理。常用的主要方法有:StringBuffer()方法用来创
11、建一个可变字符串;Append()方法用来把字符串加到当前字符串之后,形成一个新的可变字符串;Delete()方法用来清除当前缓冲区内容。,基于缓冲区暂存方式的抽样层核心程序如下(采用定制格式补零):import java.io.*;import jpcap.*;import java.util.*;public class JpcapTip implements JpcapHandler static long count=0; static long n;String s,s1;IPPacket ip;static StringBuffer sting=new StringBuffer()
12、;static String strange = 0000000000000000;DecimalFormat myFormatter = new DecimalFormat(strange); public void handlePacket(Packet packet) if(packet instanceof IPPacket) ip=(IPPacket)packet; if(ip.length()=40 把报文信息存放到缓冲区中 ,(3) 报文信息保存,有三种写外存文件的方法,在Hash暂存方式中,信息是以报文为单位存取的,因此,要想把所有报文信息写入外存,必须逐一遍历整个Hash表,
13、也就是说,如果一个Hash表中有k个报文要写入外存(txt文件),必须分k次写入。缓冲区暂存方式写外存是把缓冲区内的所有报文信息一次写入到外存中,该方法的核心是把缓冲区中的所有信息看成一个字符流,它比hash方式要好。直接写入外存的过程比较简单,但打开和关闭文件太频繁。,基于缓冲区暂存方式的信息保存层核心程序如下: public static void save() try RandomAccessFile rf = new RandomAccessFile(packet.txt, rw); rf.seek(rf.length(); rf.writeBytes(sting.toString()
14、; rf.close(); catch (Exception e) e.printStackTrace(); /打印出错的地方,基于Hash暂存方式的信息保存层核心程序如下:public static void save() Enumeration enum=hashtable.elements();/创建Enumeration对象 while(enum.hasMoreElements()/遍历当前散列表 IPPacket ip=(IPPacket)enum.nextElement(); try RandomAccessFile rf = new RandomAccessFile(packet
15、.txt, rw); rf.seek(rf.length(); rf.writeBytes(ip.src_ip+t+ip.dst_ip+t+ip.protocol+t+ ip.length+t+ip.version+t+ip.ident+t+ ip.rsv_frag+t+ip.offset+t+ip.hop_limit+t+ ip.rsv_tos+t +rn); rf.close(); catch (Exception e) e.printStackTrace();/打印出错的地方 ,2. 利用SNMP查询网络设备(如路由器、 交换机)的MIB 该方法可以得到有关网络流量大小信息,如网络接口输
16、入输出的报文数、字节数等,但无法提供流量中的详细信息。用这种方法采集流量数据要求采集周期很短,数据变量如不及时读取就会溢出,造成数据丢失。这样,越是流量大的网络设备就越频繁地传递数据,更重要的是频繁查询MIB会加重网络设备工作负载,造成网络性能下降,使网络带宽更为拥挤.,3. 安插网络探针(PROBE) PROBE技术是依靠传统的以太网(Ethernet)总线结构的通信原理,在靠近出口路由器的网段上安插网络探针以监听网络通信,并记录通过该网段的每一次通信进而整理成IP流量数据。其最大的优点就是不需要路由器的参与,对路由器的影响很小,且占用很少的带宽,不需要额外的网络开销。但是,要实现这种基于P
17、ROBE技术的流量采集,就必须要有很大的缓存器(Cache),以便记录下所有的网络通信,这对流量采集主机的性能和硬件配置提出了很高的要求。,示例一,4. 利用IP Flow技术实现基于流级的流量采集 这种方法采用流作为网络数据传输单位。路由器和带三层交换的交换机等网络设备为其提供一个专有的缓存器,在数据转发期间,对属于同一个数据流的数据包,交换机只处理其第一个包并根据第一个包的情况在netflow cache中建立一个记录,属于同一个流的数据包将根据netflow cache中的记录直接作二层转发而不再作三层处理,这样便可以大大加快网络设备的数据处理速度。原本cisco公司为了提高网络的传输速率而特地创立了netflow技术。而今,可以利用netflow技术进行网络流量数据的采集与统计。该方法可以有效地节省网络带宽,减少网络设备的额外负担,但对网络设备的要求较高,并且不适用于某个精确时段的IP网络流量采集与统计。,