sFlow sampled flow协议解析

sflow是一种用来统计网络流量的采样方案。

采样方式

按照包数采样

比如采样率是1000,每经过一个包,计数器减一,如果计数器为0,采样当前的数据包,然后计数器重置。

随机采样

由于按照固定包数采样,有可能会采到有规律的包,影响采样有效性。比如采样率是1000,每1000个包中,999个都是从A->B的数据,就只有一个是从C->D的数据,并且是有规律的,每1000出现一次,也就是与采样率匹配。这样会一直采到C->D的数据包,认为网络中都是C->D的流量。为了解决这个问题,就出现了随机数采样。就是指定一个数值范围,比如[0, 10),每次数据包过滤都产生一个[0, 10000)的随机数,如果在[0, 10)以内,就采样,不在就丢弃。这样既满足了1/1000的采样率,又避免了上面的问题。

按照时间间隔采样

还有一种就是固定多少时间采样一次。

原理

sflow的原理就是当满足采样条件时,做一些简单的分析,发送出去。接收者就可以根据信息进行分析。

sflow有Flow sample、Expanded Flow sample、Counter sample、Expanded Counter sample。目前使用的sflow是v5版本,也就是Expanded Flow sample和Expanded Counter sample,对v4版本做了扩展,不兼容v4。其中Flow sample会统计详细信息,并且把采样包的L2~L7层包头截取出来,发送出去;Counter sample只统计概览信息,比如接口总的进出流量等。

sflow并不是采样一个数据包就发送,为了性能,sflow采集器有缓冲区,缓冲区满或者超时时间(一般是1秒)到,才会发送。并且数据会进行部分整合,也就是同一个udp数据包中,可能包含多个sample采样信息,并且可以是不同的sample采样信息。
同一个sample中,也会包含多块数据,比如原始包头信息,针对ethernet的统计信息等,需要根据长度类型挨个遍历解析。

接收消息

sflow使用udp协议发送数据,默认使用6343端口。sflow agent就是采样并且发送数据端,一般是嵌入在路由器中,配置好就可以发送。sflow collector就是接收数据端,接收数据后进行处理分析展示,一般是我们需要开发的模块。

协议解析

sflow的协议描述不如tcp等直观,它是使用了类似伪代码的方式,可以看 https://sflow.org/sflow_version_5.txt[4.3 Definitions] ,或者看 https://www.rfc-editor.org/rfc/rfc3176[3.2 Definitions] 。但是抓取sflow包,用wireshakr分析,发现与官方定义的字段不匹配,最后在 https://infocenter.nokia.com/public/7750SR2110R1A/index.jsp?topic=%2Fcom.sr.system.mgmt%2Fhtml%2Fsflow-intro.html 找到了开头部分字段对应的解释,在 https://sflow.org/developers/diagrams/sFlowV5Sample.pdf 中找到了后面字段对应的解释。这里只讨论Expanded Flow Sample中的原始数据包头。

字段 意思 长度
Datagram version 版本 现在数值是5 4字节
Agent Address Type agent IP地址类型 1-IPv4 2-IPv6 4字节
Agent Address agent IP地址 4字节(IPv4) 16字节(IPv6)
Sub-agent ID 常见数值是0 4字节
SysUptime 毫秒 4字节
NumSamples 4字节
--- --- ---
enterprise 公司 0-标准flow 20位
formats sflow类型 1-Flow Sample 2-Counter Sample 3-Expanded Flow Sample 4-Expanded Counter Sample 12位(与上面正好是4字节)
sample length byte 当前sample长度,表示多少个字节,因为一个udp包中可以有多个sample 4字节
sample sequence number sample序号,每一个加一 4字节
source id type 4字节
source id index 4字节
sampling rate 采样频率,数值是N,就表示1/N采样 4字节
sample pool total number of packets that could have been sampled 4字节
drops packets dropped due to a lack of resources 4字节
input interface format 4字节
input interface value 4字节
output interface forma 4字节
output interface value 4字节
int n * flow records 4字节
--- --- ---
enterprise 公司 0-标准flow 20位
formats 什么类型的数据 1-原始数据包头信息 2-ethernet相关统计信息 12位(与上面正好是4字节)
flow data length 当前统计数据长度 4字节
--- --- ---
heeader protocol 协议类型 1-以太网 4字节
frame length 采样数据的原始长度 多少个字节 4字节
payload stripped payload长度,如果比上面少,就表示最后有padding 4字节
sampled header length 数据包header长度 4字节
剩下的都是采样数据包的原始包头信息 -- --

https://sflow.org/
https://sflow.org/sflow_version_5.txt
https://en.wikipedia.org/wiki/SFlow
https://www.rfc-editor.org/rfc/rfc3176
https://www.rfc-editor.org/rfc/rfc1014
https://sflow.org/developers/diagrams/sFlowV5Sample.pdf
https://infocenter.nokia.com/public/7750SR2110R1A/index.jsp?topic=%2Fcom.sr.system.mgmt%2Fhtml%2Fsflow-intro.html

posted @ 2023-07-06 15:07  秋来叶黄  阅读(923)  评论(0编辑  收藏  举报