散列数据包/帧的一部分以识别重复的数据包

网络工程 监控 包分析
2021-07-14 19:11:23

考虑一个应用程序(主要是 TCP/UDP,但并非严格如此),其中数据包大小不同,并且可能很长。用例/问题陈述是识别在网络中多个点收集的重复帧。(意思是,如果我们从路由器 X 收集一个帧,从路由器 Y 收集一个帧,我们如何以高概率确定它们是或不是同一帧)......进一步假设我们可以创建一个(好的)散列在帧的第一个 NNN 字节上相对便宜。在我看来,我认为可以在前 100-200 字节附近的某个地方生成散列。这当然足以获得 {L2, IP, TCP|UDP} 标头,以及最常见的应用协议,其中这些标头直接位于 L4 标头之后(HTTP、VOIP、流视频等)。

任何人都可以想到特定的应用程序,其中仅在帧的早期部分的散列不能很好地指示唯一性吗?关于散列需要多深,有人有令人信服的论据吗?(即 128B 对于大多数情况是否足够?)

1个回答

除非您真正捕获同一以太网段上的帧,否则在您的路由器重写 mac 地址、递减 IP TTL 并重新计算校验和后,帧将有所不同。并且使用 VLAN 标记,帧大小可能会根据它们在网络中被拉出的确切位置而有所不同。

忽略 NAT/PAT 重写 IP 地址和端口的影响,或防火墙更改 TCP 序列号的影响,我建议使用以下字段来导出最大 LAN 直径的规范帧:

  • 五元组(src ip & port、dst ip & port、proto)
  • tcp序列号
  • tcp 确认号
  • ip总长度

理想情况下,要忽略重传中的重复数据包,将使用ip 时间戳选项并可以添加以形成规范。可以在流中引入其他自定义标头选项,以对帧进行真正的指纹识别。