摘要

  • IPFIX 的 字段定义编号 必须连同传输会话和 Observation Domain 使用。观察域编号只要求在导出进程内唯一,不是设备、租户、站点或客户的全球身份。
  • 成功解码只能说明采集器套用了哪份字段契约,不能证明所有包都被观察、所有流都形成记录、所有记录都送达,也不能证明计数、时间和中间变换准确。

缓存不该跨过会话边界

第一条 TCP 连接里,导出器用 256 表示一组有序的地址、端口和计数器。连接结束后,第二条连接可以合法地把 256 分配给另一份定义。若采集器把旧定义带过去,就可能给新字节贴上旧名称和旧单位。有些组合立即报错,另一些却可能输出足以骗过范围检查的数字。

这是一个合成控制案例,不指控某个厂商存在缺陷。它关注的是一种安静的错误:记录先进入流量报告、滥用调查或账单,直到很久以后才有人追问,解释它的定义究竟来自哪条会话。

RFC 7011 明确禁止这种捷径。字段定义编号 按传输会话和观察域分配、维护;即使还是同一个导出进程,采集器也不能拿旧会话的定义去解码后续新会话的数据集。

观察域不是一个全球地点

IPFIX 把测量链拆开:Observation Point 是能看见包的位置;Metering Process 负责分类、抽样、时间戳与流记录维护;Exporting Process 发送消息;Collecting Process 接收消息并可继续处理或保存。

Observation Domain 是一个计量进程能够汇聚流信息的最大观察点集合。它的 32 位编号只在导出进程内局部唯一。标准建议同一 IPFIX 设备内也保持唯一,却没有给它全球唯一性。因此两台导出器都报告观察域 17,并不意味着同一地点、网络、组织或用户。

最小解码键不能只有 字段定义编号,还要保留导出器身份、导出进程、传输会话、观察域和定义编号。SCTP 的序列状态还要区分流。数据仓库一旦把这些维度压平,就把局部控制信息误升格为全局身份。

字段定义解释字节,不替字节担保

字段定义 是一串按顺序排列的信息元素与长度说明。Data Set 的 Set ID 指向对应 字段定义编号,让采集器知道如何切分字段、选择数据类型、单位和语义。

信息元素本身也有命名空间。标准元素由 IANA 注册表定义;企业专有元素的身份还包含企业编号。只保留一个低位数字,同样可能把不同企业的字段合并。RFC 5610 允许在带内导出类型信息,RFC 7013 则要求元素定义和注册审查保持清楚。它们都不是对测量事实的独立认证。

八个字节可以被正确读成字节计数,但采集器仍不知道传感点是不是预定接口、Flow Keys 是否符合配置、计数器是否准确。格式正确和事实正确是两种证据。

撤回、复用和过期必须有时间

在面向连接的传输上,导出器可以撤回一份定义,再复用其编号。采集器收到撤回后,不能继续用它解释后续数据集。消息顺序和旧记录获得处理的时间都很重要。

UDP 的生命周期不同:没有关闭连接来清空状态,定义消息又可能丢失或乱序,因此需要刷新、替换与过期规则。数据集先于定义到达,不是借用其他会话或观察域定义的许可。采集器必须记录它是暂存、丢弃,还是稍后用某一明确版本解码。

RFC 6313 的列表和嵌套记录让 IPFIX 能表达更复杂的数据,但不会让来源更可信。一份结构完整的列表仍可包含抽样、汇聚、过时或错误的值。

序列号数的是记录,不是现实

IPFIX Sequence Number 按当前观察域、当前流已发送的 Data Records 数量递增,并以 2^32 为模。字段定义记录 和 选项定义记录 不使它递增。SCTP 各流分别计数;TCP 连接或 UDP 会话采用其相应范围。

不连续可以帮助发现记录丢失、重复或乱序,却不是精确丢包数。它看不见从未到达观察点的包、被前置抽样排除的包,或根本没有形成流记录的流量。

可靠 TCP 也不是端到端完整性证明。网络拥塞或采集器过慢可以填满导出缓冲区,导出进程可能为避免阻塞而丢弃记录;标准要求对这种丢弃计账。可辩护的结论是“这个作用域内未观察到记录序列缺口”,不是“没有流量证据丢失”。

报头 Export Time 也常被过度使用。它表示消息离开导出进程的时间,不是每条流的开始或结束时间。观测时钟、导出延迟、汇聚窗口和时间精度仍要分开。

分母可能在到达仪表盘前已改变

包选择可以发生在流记录形成之前,流选择又可以发生在之后。RFC 7014 描述过滤、哈希选择、系统抽样和随机抽样。没有选择参数、计数器和分母,就不知道这些记录代表哪一群流量。

“完整流”尤其容易误导。在某一阶段完整,可能只是包含所有通过上一轮抽样的包,而不是物理链路上的所有包。完整性必须带着阶段边界。

汇聚继续改变证据。RFC 7015 允许按汇聚函数合并流记录;Mediator 可以接收、选择、变换、汇聚,再以新的导出上下文发送。下游必须保留其业务所需的原始导出器、观察域和变换链。中介的一份有效定义,不会让派生记录变回原始观测。

认证通道只认证到导出进程

正确部署的 TLS 或 DTLS 可以保护传输机密性、完整性和通信进程身份。这非常重要:伪造定义可能污染后续大量记录,流信息本身也能暴露敏感通信模式。

但认证不会证明传感器位置正确、配置经过批准、计数没有错误,或中介诚实保留了来源。一个真实导出器完全可能忠实发送错误接口映射下的测量或未声明抽样后的结果。密码学来源与测量真实性仍然分离。

让每个作用域主动失败

重连后把 256 改成另一份字段定义,采集器必须等待新定义;从两台导出器、两个观察域同时发送相同编号,存储不能合并。测试撤回与复用、UDP 首份定义丢失、迟到数据、序列缺口和导出缓冲耗尽。

再分别开启包抽样、流选择、汇聚与中介,要求每一步留下新的来源状态。最后,在已认证通道中故意导出错误计数,系统应给出“来源已认证、测量不一致”这两个结论,而不是让前者替后者背书。