Skip to main content

NetStream报文格式

NetStream是华为公司的专利技术,是一种基于网络流信息的统计与发布技术。NetStream可以对网络中的通信量和资源使用情况进行分类和统计,实现对各种业务和不同的QoS进行管理和计费。目前Netstream输出的报文主要有5、8、9三个版本,其他的版本处于实验阶段,没有商用。

NetStream版本5

NetStream原始流输出报文支持版本5和版本9两种报文格式,聚合流输出支持版本8和版本9两种报文格式。

报文格式

图 版本5报文头格式

   0           7 8        15 16              31
  +-------------+-----------+-----------------+
  |   NS_ID   | Version |     Count     |
  +-------------+-----------+-----------------+
  |                 SysUptime               |
  +-------------------------------------------+
  |                 Unix_Secs               |
  +-------------------------------------------+
  |                 Unix_Nsecs               |
  +-------------------------------------------+
  |               Flow_Sequence             |
  +-------------+-----------+-----------------+
  | Engine_Type | Engine_Id |     Reserved   |
  +-------------+-----------+-----------------+
字段 长度 描述
NS_ID 1字节 NetStream的标识位,第7个比特位0,表示入接口统计报文,第7个比特位1,表示出接口统计报文。
Version 1字节 NetStream输出报文格式版本编号,对于V5,为0x05。
Count 2字节 当前报文中的流记录数(1-30)。
SysUptime 4字节 报文产生的时间,是系统启动以来的毫秒数。
Unix_Secs 4字节 从1970年1月1日0时起,到报文产生时间的整秒数。
Unix_Nsecs 4字节 报文产生时间的纳秒数,也即不足一秒的余下的纳秒数。
Flow_Sequence 4字节 输出的流记录的顺序号。 在第一个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 1字节 流交换引擎类型。
Engine_Id 1字节 交换引擎槽号。
Reserved 2字节 保留字段,全零。

参考标准

标准 描述
RFC 3954 NetFlow Services Export Version

协议栈结构

Netstream通过UDP协议传递统计信息,每个数据包都包括一个Packet Header再加上一条或者几条流的记录信息。

图5-120 NetStream协议栈结构

 +--------+-------+--------------------+----------------+
| IP | UDP | Netstream Header | Flow Records |
+--------+-------+--------------------+----------------+

版本5包括以下信息:

  • 时间信息:流建立的时间、流结束的时间

  • 统计信息:包计数、字节计数

  • 协议信息:协议类型

  • 路由信息:目的IP、源IP、下一跳IP、目的IP掩码长度、源IP掩码长度、源AS域编号、目的AS域编号

  • 接口信息:入接口、出接口

  • 传输层信息:源端口号、目的端口号、TCP Flags

  • 服务等级信息:ToS

 

NetStream版本8

版本8通过AS域聚合,这种聚合方式主要统计在一个路由器上从一个AS域到另一个AS域的包和字节信息。可以用以运营商之间结算。

NetStream版本8报文头

图5-121 版本8报文头格式

  0           7 8        15 16         23 24          31
+-------------+-----------+---------------------------+
| NS_ID | Version | Count |
+-------------+-----------+---------------------------+
| SysUptime |
+-----------------------------------------------------+
| Unix_Secs |
+-----------------------------------------------------+
| Unix_Nsecs |
+-----------------------------------------------------+
| Flow_Sequence |
+-------------+-----------+-------------+-------------+
| Engine_Type | Engine_Id | Aggregation | Agg_Version |
+-------------+-----------+-------------+-------------+
| Reserved |
+-----------------------------------------------------+
字段 长度 描述
NS_ID 1字节 NetStream的标识位。
Version 1字节 NetStream输出报文格式版本编号。
Count 2字节 当前报文中的流记录数,而不是流的总数。
SysUptime 4字节 报文产生的时间,是系统启动以来的毫秒数。
Unix_Secs 4字节 从1970年1月1日0时起,到报文产生时间的整秒数。
Unix_Nsecs 4字节 报文产生时间的纳秒数,也即不足一秒的余下的纳秒数。
Flow_Sequence 4字节 输出的流记录的顺序号。
Engine_Type 1字节 流交换引擎类型。
Engine_Id 1字节 交换引擎槽号。
Aggregation 1字节 聚合策略,分别如下: AS:0x01Protocol-Port:0x02rc-Prefix:0x03Dst-Prefix:0x04SPrefix:0x05
Agg_Version 1字节 聚合版本。
Reserved 4字节 保留字段,全零。

参考标准

标准 描述
RFC 3954 NetFlow Services Export Version

协议栈结构

Netstream通过UDP协议传递统计信息,每个数据包都包括一个Packet Header再加上一条或者几条流的记录信息。

图5-122 NetStream协议栈结构

 +--------+-------+--------------------+----------------+
| IP | UDP | Netstream Header | Flow Records |
+--------+-------+--------------------+----------------+

NetStream版本8每个记录包括以下信息:

  • 时间信息:流建立时间、流结束时间

  • 统计信息:包计数、字节计数

  • 接口信息:入接口、出接口

  • AS自治域信息:源AS域编号、目的AS域编号

  • 构成聚合流的流总数:聚合流的总数

通过协议类型聚合,这种方式针对四层的协议类型(对于TCP和UDP,还包括源和目的端口号)进行聚合。每个记录包括:

  • 时间信息:流建立时间、流结束时间

  • 统计信息:包计数、字节计数

  • 协议信息:协议类型、源端口号、目的端口号

  • 构成聚合流的流总数:聚合流的总数

根据源IP和目的IP的前缀进行聚合,这种方式下,源IP地址的前缀部分和目的IP地址的前缀部分都参与聚合。每个记录包括:

  • 时间信息:流建立时间、流结束时间

  • 统计信息:包计数、字节计数

  • 接口信息:入接口、出接口

  • IP地址信息:源IP前缀、源AS域编号、目的IP前缀、目的AS域编号

  • 构成聚合流的流总数:聚合流的总数

TOS+AS域的方式进行流聚合,每个记录包括:

  • 时间信息:流建立时间、流结束时间

  • 统计信息:包计数、字节计数

  • 接口信息:入接口、出接口

  • ToS + AS信息:IP头的Tos、源AS域编号、目的AS域编号

  • 构成聚合流的流总数:聚合流的总数

按照TOS加协议类型的聚合,每个记录包括:

  • 时间信息:流建立时间、流结束时间

  • 统计信息:包计数、字节计数

  • 接口信息:入接口、出接口

  • ToS + 协议信息:IP头的Tos、协议类型、源端口号、目的端口号

  • 构成聚合流的流总数:聚合流的总数

IP地址前缀+TOS+协议类型的聚合,每个记录包括:

  • 时间信息:流建立时间、流结束时间

  • 统计信息:包计数、字节计数

  • 接口信息:入接口、出接口

  • IP信息:IP头的Tos、源前缀、目的前缀

  • 协议信息:协议类型、源端口号、目的端口号

  • 构成聚合流的流总数:聚合流的总数

TOS+源IP前缀的聚合,每个记录包括:

  • 时间信息:流建立时间、流结束时间

  • 统计信息:包计数、字节计数

  • ToS + 源IP信息:IP头的Tos、源前缀、源AS域编号、入接口

  • 构成聚合流的流总数:聚合流的总数

TOS+目的IP前缀的聚合(和TOS+源IP前缀的聚合方式的方式类似),每个记录包括:

  • 时间信息:流建立时间、流结束时间

  • 统计信息:包计数、字节计数

  • 接口信息:入接口、出接口

  • ToS + 目的IP信息:IP头的Tos、目的前缀、源前缀

  • 构成聚合流的流总数:聚合流的总数

 

NetStream版本9

版本9最显著的特点是基于模板的方式,使统计信息的输出更为灵活,而且更容易扩展新的定义流的元素以及生成新的记录。使用版本9可以实现NAT、组播、MPLS、BGP下一跳的统计。

报文格式

图5-123 版本9报头格式

 0           7 8        15 16              31
+-------------+-----------+-----------------+
| NS_ID | Version | Count |
+-------------+-----------+-----------------+
| SysUptime |
+-------------------------------------------+
| Unix_Secs |
+-------------------------------------------+
| Flow_Sequence |
+-------------------------------------------+
| Source ID |
+-------------------------------------------+
字段 长度 描述
NS_ID 1字节 NetStream的标识位
Version 1字节 NetStream输出报文格式版本编号
Count 2字节 该报文包含的FlowSet records(包括Template和Data)数目
SysUptime 4字节 报文产生的时间,是系统启动以来的毫秒数
Unix_Secs 4字节 从1970年1月1日0时起,到报文产生时间的整秒数
Flow_Sequence 4字节 所有输出报文的顺序号
Source ID 4字节 用来保证从一台路由器中输出的所有流的唯一性(Source ID等同于V5、V8报文头中的engine type和engine ID)。该值可以由用户定义。

报文输出情况说明

版本9报文有两种输出情况:

  • Export Packet中仅有Template FlowSet。在用户使能NetStream功能,对流量进行采集时,为了使网管能够正确的解析流量,系统会向NSC发送模板。为了保证网管可靠的对接收到流量统计信息进行解析,设备会定时重新发送模板给NSC。另外,模板具有有效时间,超过有效时间NSC会删除超时的模板,因此,需要定时的发送Template FlowSet到NSC,如果需要发送的时候没有Data FlowSet生成,则此时只发送Template FlowSet。报文格式如下:

     +----------+------------+------------+------------+------------------+
    | Packet | Template | ... | Template | Options |
    | Header | FlowSet | | FlowSet | Template FlowSet |
    +----------+------------+------------+------------+------------------+
  • Export Packet中仅有Data FlowSet。如果Template ID都已经定义好了,使能NetStream的路由器传递给NSC的Export Packet一般属于这种情况。报文格式如下:

     +----------+-----------+-----------+---------+-----------+
    | Packet | Data | Data | ... | Data |
    | Header | FlowSet | FlowSet | | FlowSet |
    +----------+-----------+-----------+---------+-----------+

Template FlowSet和Data FlowSet是独立的。Data FlowSet中的Data Record由collector已知的模板解释(换句话说,NSC已经知道了Data Record中的Template ID对应的模板了)。而Template FlowSet是告诉NSC一个即将被使用的模板,NSC使用这个模板的时候只能是针对后续的Export Packet。

Template FlowSet是版本9的灵魂。使用模板后,NSC的程序无需预先设置好按照什么样的格式解析Export Packet,只需做成通用的方式,然后通过路由器发过来的模板来解释流记录的信息。模板极大的增强了NetStream流记录的灵活性和可扩展性,方便了第三方软件的开发,和后续NetStream功能的增强。

Template FlowSet格式

图5-124 Template FlowSet的格式

 +-----------------+
| FlowSet ID |
+-----------------+
| Length |
+-----------------+
| Template ID |
+-----------------+
| Field Count |
+-----------------+
| Type 1 |
+-----------------+
| Length 1 |
+-----------------+
| .... |
+-----------------+
| Type N |
+-----------------+
| Length N |
+-----------------+
| Template ID |
+-----------------+
| Field Count |
+-----------------+
| Type 1 |
+-----------------+
| Length 1 |
+-----------------+
| .... |
+-----------------+
| Type M |
+-----------------+
| Length M |
+-----------------+

图5-125 Data FlowSet的格式

  +--------------------+
  |     FlowSet ID     |
  +--------------------+
  |       Length       |
  +--------------------+
  | Record 1 Field 1 |
  +--------------------+
  | Record 1 Field 2 |
  +--------------------+
  |       ....       |
  +--------------------+
  | Record 1 Field N |
  +--------------------+
  | Record 2 Field 1 |
  +--------------------+
  | Record 2 Field 2 |
  +--------------------+
  |       ....       |
  +--------------------+
  | Record 2 Field N |
  +--------------------+
字段 长度 含义
FlowSet ID 2字节 用于在Export Packet中对Template FlowSet进行编号,同时区分出Template FlowSet和Data FlowSet。对于Template FlowSet,FlowSet ID的取值是0~255,对于Data FlowSet,取值从256开始,这样collector就可以在Export Packet中识别出Template FlowSet。
Length 2字节 用于决定下一个FlowSet的其实位置,取值是上面图中全部的字节数(包括FlowSet ID和Length自身)。
Template ID 2字节 为模板定义一个编号,取值从256开始,原因是0~255被FlowSet ID所用。注意一个Data FlowSet对应一个Template ID Field count表示模板中type的总个数。
Field type 2字节 表示类型的名称,这个字段的解释router和collector必须约定好。比如如果支持按照目的IP地址、协议类型、TOS和MPLS标签进行统计,则这四种信息都有一个type的定义。
Field length 2字节 对应的type的长度,对于目的IP地址,取值是4,表示4个字节。

参考标准

标准 描述
RFC 3954 NetFlow Services Export Version

协议栈结构

Netstream通过UDP协议传递统计信息,每个数据包都包括一个Packet Header再加上一条或者几条流的记录信息。

图5-126 NetStream协议栈结构

  +--------+-------+--------------------+----------------+
  |   IP   | UDP | Netstream Header | Flow Records |
  +--------+-------+--------------------+----------------+