如何将 SFLOW 用于每个流的吞吐量?

网络工程 吞吐量 流量
2022-02-21 01:27:11

我的网络上有一个工作的 sFlow 收集器(vFlow,在 GitHub 上作为开源解决方案提供,非常棒)。收集器正在运行,成功从我的网络设备接收 sFlow 数据,然后将其导出到 MySQL 数据库。现在我的管道已经工作了,是时候理解数据了。

坏消息是,我真正需要的是每流网络吞吐量。对于从主机 A 到主机 B 的每个采样流,我想知道:发送了多少字节?这似乎是一个简单而合理的问题。

但是当我查看 sFlow 给我的统计数据时,没有“BytesPerSecond”或“PacketsPerSecond”或“TotalLoad”统计数据跳出来。我已经阅读了sflow.org上的文档,似乎没有适合我需要的神奇统计数据。

但是,有以下内容(来自此处):

unsigned int sample_pool :: 可以被采样的数据包总数

这似乎是采样流中的数据包总数?或者网络设备在所有流中看到的数据包总数?

我还在我的 Packet.L3 sflow 数据报中看到了“TotalLen”统计信息。在我的测试流量中,这几乎总是 1500,我假设这意味着 L3 数据包头中有 1500 字节的有效负载。这似乎是准确的。

因此,如果一个 sFlow 数据报消息报告一个流的信息,那么该流中的总字节数是:

  • (sample_pool 数据包/流) * (TotalLen 字节/数据包) = X 字节/流

在纸面上,它看起来合乎逻辑。

我一直想知道的另一件事是:我没有获得吞吐量统计信息是因为需要在我的采样网络设备上启用该特定统计信息吗?或者我的收藏家需要打开它吗?或者其他的东西?

我一直在谷歌搜索使用 sFlow 生成每个流的基本网络吞吐量统计信息的解决方案。我似乎只看到了商业 sFlow 产品的广告或似乎没有解决这个问题的白皮书。有没有人解决过这个问题?任何建议表示赞赏!

我的 sFlow 记录之一的示例如下:

{
"Header":
    {"Version":5,
     "IPVersion":1,
     "AgentSubID":1,
     "SequenceNo":416389,
     "SysUpTime":2118000,
     "SamplesNo":6,
     "IPAddress":"10.10.20.10"
    },
"ExtSWData":
    {"SrcVlan":0,
     "SrcPriority":0,
     "DstVlan":0,
     "DstPriority":0
    },
"Sample":
    {"SequenceNo":2488018,
     "SourceID":2,
     "SamplingRate":64,
     "SamplePool":159233152,
     "Drops":0,
     "Input":7004843,
     "Output":4882507,
     "RecordsNo":2
    },
"Packet":{
    "L2":{
        "SrcMAC":"52:54:00:38:43:f3",
        "DstMAC":"52:54:00:62:32:cc",
        "Vlan":0,
        "EtherType":2048
        },
    "L3":{
        "Version":4,
        "TOS":0,
        "TotalLen":1500,
        "ID":30758,
        "Flags":0,
        "FragOff":0,
        "TTL":64,
        "Protocol":6,
        "Checksum":34707,
        "Src":"10.10.10.10",
        "Dst":"10.10.10.11"
        },
    "L4":{
        "SrcPort":47346,
        "DstPort":5201,
        "DataOffset":0,
        "Reserved":0,
        "Flags":128
        }
    }
}
1个回答

在示例中,您可以看到源/目标 IP 地址、传输协议及其端口——这就是您的流程。

您应该查看https://sflow.org/developers/specifications.php,其中数据结构被分解(以及几乎所有其他内容)。