Netstream报文版本
NetStream输出的报文主要有5、8、9、IPFIX这些版本。所有的版本都是通过UDP协议传递统计信息的。每个数据包都包括一个Packet Header再加上一条或者几条流的记录信息。
NetStream原始流输出报文格式支持版本5、IPFIX和版本9,聚合流输出报文格式支持版本8、IPFIX和版本9。
版本9及IPFIX和以前的版本有很大的不同,它是基于模板方式的,使统计信息的输出更为灵活,而且更容易扩展新定义流的元素以及生成新的记录。
NetStream报文如图3-3所示。
版本5数据报头各字段的说明如表3-3所示。
字段 |
描述 |
---|---|
version |
NetStream输出报文格式版本编号,对于V5,为0x05。 |
count |
当前报文中的流记录数(1~30)。 |
system up time |
报文产生的时间,是系统启动以来的毫秒数。 |
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板的槽号。 |
reserved |
保留字段,为全0。 |
版本8的报文头
版本8的报头格式信息如表3-4所示。
字段 |
描述 |
---|---|
version |
NetStream 输出报文格式版本编号,对于V8,为0x08。 |
count |
当前报文中的流记录数,而不是流的总数。 |
system up time |
报文产生的时间,是系统启动以来的毫秒数。 |
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 |
采样间隔(为0)。 |
reserved |
保留字段,为全0。 |
版本8的报文包含的信息
从版本8开始,具备了对流进行简单加工的能力即聚合。所谓聚合,就是把流按照某些信息进行归类统计。流聚合的最大好处是可以减少对网络带宽的占用。而在此之前的版本,聚合的工作是通过NSC来实现的。
根据AS域进行聚合
图3-7 根据AS域进行聚合示意图这种聚合方式主要用于统计在一个路由器上从一个AS域到另一个AS域的包和字节信息。运营商之间可以根据统计到的AS域报文的流量进行付费结算。其中对于源AS:
- 如果为Origin,则源AS编号为源地址所属的AS;
- 如果为Peer,则源AS编号为源地址的AS PATH的上一个AS;
- 对于属于本自治域的源地址,或从路由表中不能获取AS号的,该值为0。
对于目的AS:- 如果为Origin,则目的AS编号为目的地址所属的AS;
- 如果为Peer,则目的AS编号为目的地址的AS PATH的上一个AS;
- 对于属于本自治域的目的地址,或从路由表中不能获取AS号的,该值为0。
源AS编号和目的AS编号这两个字段是根据AS进行聚合的关键值。
根据协议类型进行聚合
图3-8 根据协议类型聚合示意图这种方式针对传输层的协议类型(对于TCP和UDP,还包括源和目的端口号)进行聚合。 协议类型字段取值为6,表示是TCP协议;取值是17,表示是UDP协议。
对于非TCP或UDP的报文,源端口号取值为0。 对于ICMP,目的端口号取值是ICMP报文的Type与Code字段。
对于非TCP或UDP报文,目的端口号取值是0。
根据目的IP地址的前缀进行聚合
图3-9 根据目的IP地址的前缀聚合示意图这种方式针对目的IP地址的前缀进行聚合。
根据源IP地址的前缀进行聚合
图3-10 根据源IP地址的前缀聚合示意图
根据源IP地址的前缀和目的IP地址的前缀进行聚合
图3-11 根据源IP地址的前缀和目的IP地址的前缀进行聚合示意图这种方式下,源IP地址的前缀部分和目的IP地址的前缀部分都参与聚合。
根据ToS+AS域进行聚合
图3-12 根据ToS+AS域进行聚合示意图其中ToS(Type of Service)是IP报文头中的一个字段,用来设置报文的优先级。
根据ToS+协议类型进行聚合
图3-13 根据ToS+协议类型进行聚合示意图根据IP地址前缀+ToS+协议类型进行聚合
图3-14 根据IP地址前缀+ToS+协议类型进行聚合根据ToS+源IP地址前缀进行聚合
图3-15 根据ToS+源IP地址前缀进行聚合示意图根据ToS+目的IP地址前缀进行聚合
图3-16 根据ToS+目的IP地址前缀进行聚合根据ToS+IP地址前缀进行聚合
图3-17 根据ToS+IP地址前缀进行聚合示意图
版本9的报文头
报文头中各字段的含义如下表所示。
字段 |
描述 |
---|---|
version |
NetStream输出报文格式版本编号,对于V9,其值是0x09。 |
count |
该报文包含的FlowSet records(包括Template和Data)的数目。 |
system up time |
从系统启动到报文产生的时间,单位是毫秒。 |
unix_secs |
从1970年1月1日0时起,到报文产生时间的整秒数。 |
package sequence |
所有输出报文的顺序号。该值是累积的,利用此值可以判断报文是否丢失。 说明:
该值和V5、V8报文头有所不同的是:在V5和V8中该值描述的是“所有的流”。 |
source id |
Source ID占4个字节,用来保证从用来保证输出流的设备唯一性(Source ID等同于V5、V8报文头中的engine type和engine ID)。该值可以由用户定义。 |
版本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构成,格式的示意图如图3-19所示:
其中Template flowdet和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的报文格式如图3-20所示。
这是一个包含两个Template Record的例子。各字段的含义如下表所示。
字段 |
描述 |
---|---|
FlowSet ID |
FlowSet ID用来区分模板记录(Template records)和数据记录(Data records)。对于Template FlowSet,FlowSet ID的取值是0~255,对于Data FlowSet,取值是256~511,这样collector就可以在Export Packet中识别出Template FlowSet。 |
Length |
Length指的是FlowSet的总长度。因为一个单独的Template FlowSet可能包含多种模板ID,长度值可以用来判断下一个FlowSet记录(可以是Template FlowSet或Data FlowSet)的位置。 Length是用type/length/value(TLV)格式描述的,这也意味着该值包括了FlowSet ID和它自己的字节长度,也包括了当前FlowSet的所有Template记录的长度。 |
Template ID |
当路由器生成不同的Template FlowSets来匹配将要输出的NetStream 数据类型时,每个模板都会分配一个唯一的ID。这个唯一性是针对生成模板ID的路由器的。因为0~255已经被FlowSet IDs使用,所以定义数据记录格式的模板ID是从256开始到511结束。 |
Field Count |
该值给出了当前模板记录的域的数目。因为一个Template Flowset可能包含多种模板记录,用户可以通过该域判断当前模板记录的结束点和下一个模板记录的开始点。 |
Field Type |
该值描述了域的类型,其取值可以由用户定义。比如如果支持按照目的IP地址、协议类型、ToS和MPLS标签进行统计,则这四种信息都有一个Type的定义。 |
Field Length |
该值给出了上面所定义域的长度,单位是字节。对于目的IP地址,取值是4,表示4个字节。 |
Data FlowSet的报文格式
Data FlowSet的报文格式如图3-21所示。
这是一个有两个记录的Data FlowSet,Data FlowSet ID就是包含的两个Data Record所套用的模板的ID。Data FlowSet报文中各字段的含义如下表所示。
字段 |
描述 |
---|---|
FlowSet ID = Template ID |
该值对应于先前描述的Template ID。采集器和显示程序通过FlowSet ID来对应其后面的域的类型和长度。 |
Length |
该值给出了Data FlowSet的长度。Length是用type/length/value(TLV)格式描述的,这也意味着该值包括了FlowSet ID和它自己的字节长度,也包括了当前数据记录的所有长度。 |
record n –field n |
该部分是Data FlowSet的域值的集合。 |
Padding |
Padding长度为32位,插入到FlowSet列表的最后面。需要注意的是length域包括该值的长度。 |
版本9流数据模板与流数据的关系
版本9流数据模板与流数据的关系如下图所示。
IPFIX的报文头格式
IPFIX的报文头格式如图3-23所示。
各字段的含义如表3-6所示。
字段 |
描述 |
---|---|
Version Number |
NetStream输出报文格式版本编号。 |
Length |
IPFIX的报文长度,以字节为单位,包括消息头。 |
Export Time |
UTC标准时间,从1970年1月1日算起,以秒为单位。时间取自流记录自Exporter的发出时间。 |
Sequence Number |
所有输出报文的顺序号;该值是累积的,利用此值可以判断报文是否丢失。模板与选项模板不增加序列号。 |
Observation Domain ID |
观察域ID,以32数为标识,保证从一台路由器中输出的所有流的唯一性。 |