Netstream报文和版本
NetStream输出的报文主要有5、8、9三个版本,其他的版本处于实验阶段,没有商用。所有的版本都是通过UDP协议传递统计信息的。每个数据包都包括一个Packet Header再加上一条或者几条流的记录信息。
NetStream原始流输出报文支持版本5和版本9两种报文格式,聚合流输出支持版本8和版本9两种报文格式。
版本9和以前的版本有很大的不同,它是基于模板方式的,使统计信息的输出更为灵活,而且更容易扩展新定义流的元素以及生成新的记录。版本9和版本5、版本8不兼容。
NetStream报文如图11-2所示。
版本5的报文头
版本5数据报报头各字段的说明如表11-3下表所示。
字段 |
描述 |
---|---|
version |
NetStream输出报文格式版本编号,对于V5,为0x05 |
count |
当前报文中的流记录数(1~30) |
SysUptime |
报文产生的时间,是系统启动以来的毫秒数 |
unix_secs |
从1970年1月1日0时起,到报文产生时间的整秒数 |
unix_nsecs |
报文产生时间的纳秒数,也即不足一秒的余下的纳秒数 |
flow_sequence |
输出的流记录的顺序号, 在第一个NetStream报文中,此值为0,count = c1, 在第二个NetStream报文中,此值为c1,count = c2, 在第三个NetStream报文中,此值为c2 + c1, …… 在第n – 1 个NetStream报文中,此值为fs(n - 1),count = c(n - 1) 在第n个NetStream报文中,此值为fs(n - 1) + c(n - 1)。 利用此值可以判断报文是否丢失 当流序列号溢出时,按自然溢出继续进行。 |
engine_type |
流交换引擎类型。其中填写的是设备类型。 |
engine_id |
交换引擎槽号。其中填写的是NetStream板的槽号。 |
版本8的报文头
版本8的报头格式信息如表11-4所示。
字段 |
描述 |
---|---|
version |
NetStream输出报文格式版本编号,对于V8,为0x08。 |
count |
当前报文中的流记录数,而不是流的总数 |
SysUptime |
报文产生的时间,是系统启动以来的毫秒数 |
unix_secs |
从1970年1月1日0时起,到报文产生时间的整秒数 |
unix_nsecs |
报文产生时间的纳秒数,也即不足一秒的余下的纳秒数 |
flow sequence |
输出的流记录的顺序号, 在第一个NetStream报文中,此值为0,Count=c1, 在第二个NetStream报文中,此值为c1, Count=c2, 在第一个NetStream报文中,此值为c2+c1, ... 在第n-1个NetStream报文中,此值为fs(n-1),Count=c(n-1) 在第n个NetStream报文中,此值为fs(n-1) + c(n-1)。 利用此值可以判断报文是否丢失 当流序列号溢出时,按自然溢出继续进行。 |
engine type |
流交换引擎类型。其中填写的是设备类型。 |
engine id |
交换引擎槽号。其中填写的是NetStream板的槽号。 |
aggregation |
聚合类型,分别如下: 01 as 02 protocol-port 03 source-prefix 04 destination-prefix 05 prefix 09 as-tos 0a protocol-port-tos 0b source-prefix-tos 0c destination-prefix-tos 0d prefix-tos |
aggregation version |
输出的聚合版本号,为0x02 |
sampling Interval |
采样间隔,存放的是全局采样值。 |
reserved |
保留字段,为全0。 |
版本9的报文头
报文头中各字段的含义如表11-5所示。
字段 |
描述 |
---|---|
version |
NetStream输出报文格式版本编号,对于V9,其值是0x09。 |
count |
该报文包含的FlowSet records(包括Template和Data)的数目。 |
system up time |
从系统启动到报文产生的时间,单位是毫秒。 |
unix_secs |
从1970年1月1日0时起,到报文产生时间的整秒数。 |
package sequence |
所有输出报文的顺序号。该值是累积的,利用此值可以判断报文是否丢失。 |
source id |
Source ID占4个字节,用来保证从一台中输出的所有流的唯一性(Source ID等同于V5、V8报文头中的engine type和engine ID)。该值可以由用户定义。Source ID前2字节保留用作以后的扩展,置0。第3个字节描述输出设备的路由引擎的唯一性,填写设备类型。第4个字节描述板卡号,填写NetStream板的槽号。 |
版本9的相关术语
Template FlowSet
表明Export Packet中的流信息的含义,由使能NetStream的把它的模板放到Export Packet中发给NSC,实现和NSC之间对Export Packet中流信息解释建立约定。Template FlowSet是一个集合,其中包含很多个Template Record。Template FlowSet是版本9的核心。使用模板后,NSC的程序无需预先设置好按照什么样的格式解析Export Packet,只需做成通用的方式,然后通过发过来的模板来解释流记录的信息。模板极大的增强了NetStream流记录的灵活性和可扩展性,方便了第三方软件的开发,以及后续NetStream功能的扩展。
Template Record
和Export Packet中的各个Data Record对应。Data Record中的流信息按照对应的Template Record来解释。
Template ID
用于标识不同的模板。不同的模板具有不同的ID。在Data Record中包含Template ID,根据Template ID来套用不同的模板。
Data FlowSet
是组合在一起的一个或者多个Data Record的集合。
Data Record
对应一个NetStream记录。
版本9的Export Packet
版本9的Export Packet,由Packet Header、Template FlowSet和Data FlowSet构成,格式的示意图如图11-7所示:
其中Template FlowSet和Data FlowSet是互相独立的。Data FlowSet中的Data Record由collector已知的模板解释,也就是说,NSC已经知道了Data Record中的Template ID对应的模板了。而Template FlowSet是告诉NSC一个即将被使用的模板,NSC使用这个模板的时候只能是针对后续的Export Packet。
在Export Packet中不是必须要包含Template FlowSet和Data FlowSet的。可能的组合有:
Export Packet中包含穿插着存放的Template FlowSet和Data FlowSet,对于NSC来说,Template FlowSet和Data FlowSet之间没有什么关联。NSC将收到的Template FlowSet中的模板保存下来,用于后续的Data FlowSet的模板套用。
Export Packet中仅有Data FlowSet。如果Template ID都已经定义好了,使能NetStream的传递给NSC的Export Packet一般属于这种情况。
Export Packet中仅有Template FlowSet,一般情况下,为了更好的利用网络带宽,Template FlowSet都是和Data FlowSet打包到一个Export Packet中,因此这种情况是一个特例,一般出现在已经配置好模板后重启的时候,需要尽快把所有的模板传递给NSC,此时就不用等待生成统计流后Template FlowSet和Data FlowSet一同发送了。另外,模板具有有效时间,超过有效时间NSC会删除超时的模板,因此,需要定时的发送Template FlowSet到NSC,如果需要发送的时候没有Data FlowSet生成,则此时只发送Template FlowSet。
Template FlowSet的报文格式
Template FlowSet的格式如图11-8所示。
这是一个包含两个Template Record的例子。各字段的含义如表11-6所示。
字段 |
描述 |
---|---|
FlowSet ID |
FlowSet ID用来区分模板记录(Template records)和数据记录(Data records)。对于Template FlowSet,FlowSet ID的取值是0~255,对于Data FlowSet,取值从256开始,这样collector就可以在Export Packet中识别出Template FlowSet。 |
Length |
Length指的是FlowSet的总长度。因为一个单独的Template FlowSet可能包含多种模板ID,长度值可以用来判断下一个FlowSet记录(可以是Template FlowSet或Data FlowSet)的位置。 |
Template ID |
当生成不同的Template FlowSets来匹配将要输出的NetStream数据类型时,每个模板都会分配一个唯一的ID。这个唯一性是针对生成模板ID的。因为0~255已经被FlowSet IDs使用,所以定义数据记录格式的模板ID是从256开始。 |
Field Count |
该值给出了当前模板记录的域的数目。因为一个Template Flowset可能包含多种模板记录,用户可以通过该域判断当前模板记录的结束点和下一个模板记录的开始点。 |
Field Type |
该值描述了域的类型,其取值可以由用户定义。比如如果支持按照目的IP地址、协议类型、ToS和MPLS标签进行统计,则这四种信息都有一个Type的定义。 |
Field Length |
该值给出了上面所定义域的长度,单位是字节。对于目的IP地址,取值是4,表示4个字节。 |
Data FlowSet的报文格式
Data FlowSet的报文格式如图11-9所示。
这是一个有两个记录的Data FlowSet,Data FlowSet ID就是包含的两个Data Record所套用的模板的ID。Data FlowSet报文中各字段的含义如下表所示。
Field Name |
Value |
---|---|
flowset ID = template ID |
该值对应于先前描述的Template ID。 |
length |
该值给出了Data FlowSet的长度。 |
record n –field n |
该部分是Data FlowSet的域值的集合。 |
Padding |
Padding为32位长度,插入到FlowSet列表的最后面。需要注意的是length域包括该值的长度。 |