NetStream报文格式
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字节 | 保留字段,全零。 |
参考标准
| 标准 | 描述 |
|---|---|
| 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字节 | 保留字段,全零。 |
参考标准
| 标准 | 描述 |
|---|---|
| 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个字节。 |
参考标准
| 标准 | 描述 |
|---|---|
| NetFlow Services Export Version |
协议栈结构
Netstream通过UDP协议传递统计信息,每个数据包都包括一个Packet Header再加上一条或者几条流的记录信息。
图5-126 NetStream协议栈结构
+--------+-------+--------------------+----------------+
| IP | UDP | Netstream Header | Flow Records |
+--------+-------+--------------------+----------------+
No comments to display
No comments to display