我需要计算流中数据包大小的方差。那么使用IPFIX是不可能的吗?是否有 IPFIX 的新替代方案可以让我计算该值?谢谢
ipfix - 流中数据包大小的变化
IPFIX 的目的是测量数据包流量,而不是单个数据包的大小。
但是,您可以按时间计算数据包大小的方差,将数据包的平均大小计算为总流量除以不同时间间隔内的数据包数量,并查看该值随时间的变化情况。
如果您想计算单个流中不同单个数据包的大小差异,那是不可能的 AFAIK。
RMON 可以按大小类别显示帧数,例如对于 HP Provision 交换机show rmon statistics <portno>:
Status and Counters - Port Counters for port 24
Drop events : 0 Jabbers : 0
Octets : 227,397,427 Collisions : 0
Packets : 3,714,994,853 64 oct pkts : 210,643,368
Broadcast pkts : 24,326,013 65-127 oct pkts : 1,722,528,356
Multicast pkts : 83,481,276 128-255 oct pkts : 719,535,071
CRC errors : 0 256-511 oct pkts : 243,979,239
Runts : 0 512-1023 oct pkts : 172,346,388
Giants : 0 1024-1518 oct pkts : 2,666,523,301
Fragments : 0
了解数据的特征至关重要。如果您无法使用 IPFIX 获得所需的内容,并且可以从中获取 pcap 文件,tcpdump 类型的工具加上 awk 类型的工具将很容易为您提供答案。
使用 tcpdump 或类似工具获取您感兴趣的数据包:
13:49:41.046756 IP 192.168.1.1.58465 > 192.168.1.88.17050: UDP, length 986
13:49:46.047115 ARP, Request who-has 192.168.1.88 tell 192.168.1.1, length 46
13:49:46.047165 ARP, Reply 192.168.1.88 is-at 30:65:ec:7f:3f:93, length 28
13:49:51.055195 IP 192.168.1.1.57133 > 192.168.1.88.17050: UDP, length 986
13:50:06.048098 IP 192.168.1.1.51649 > 192.168.1.88.17050: UDP, length 986
然后通过 awk 获取统计信息:
$ cat TCPDUMPOUTPUT \
| awk '{++n; l=$NF; x+=l; xx+=l*l;}\
END{m=x/n; printf("n=%d m=%.2f sd=%.2f\n", n, m, sqrt((xx/n)-(m*m)))}'
n=5 m=606.40 sd=464.95
如果您关心统计细节(稳定性、流行与样本等),请改用 R 或 python。当然,R 会给你很好的图表来了解你感兴趣的任何分类的分布。
无法直接导出 IPFIX 流记录中数据包大小的差异。有一个现已过期的 RFC 草案提出了额外的 IPFIX 字段,这些字段将提供统计方差信息 ( ipTotalLengthSampleMean, ipTotalLengthSampleVariance ),但这从未获得批准,并且附加字段未在 IANA IPFIX 注册表中列出。
然而,使用设备可能包含在导出的流记录中的一些标准 IANA 字段(octetDeltaCount、packetDeltaCount、octetDeltaSumOfSquares),可以确定方差和标准偏差。
方差 = (octetDeltaSumOfSquares/packetDeltaCount) - (octetDeltaCount/packetDeltaCount)²
Tanja Zseby、Thomas Hirsch、Benoit Claise的“数据包采样流记账:挑战和限制”论文是有关此统计计算基础理论的很好参考。