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