c-重复udp数据包:发生频率



我正在开发一个UDP协议,用于本地网络,在源和目标之间只有一个交换机(cisco、3com等),两个Linux系统,相同的MTU。在这种情况下,我应该多久在目的地复制一次udp数据包(显然不是我,而是交换机或服务器)?我需要知道是否在我的代码中实现重复检查。

当使用广播或在极端条件下(完整的MAC地址表),交换机将向所有接口发送数据包。如果两个或多个交换机之间存在环路,并且不使用生成树协议,则可能导致重复。所以答案很少。

根据我20年前读到的一个故事的记忆。。。

存在复制UDP数据包的故障路由器。长话短说,人们发现一些插话的频率过高。这导致了以下情况:

  1. 路由器转到传出数据包队列
  2. 它发送了数据包,在将其标记为已发送之前
  3. 引发了一个中断
  4. 出于某种原因,在处理中断后,路由器返回检查传出的数据包队列,而不是将数据包标记为已发送(一个无关的错误?),导致它重新发送相同的数据包,直到中断之间的间隔足够长以完成步骤2

在目标主机中接收重复UDP数据包的可能性取决于从源主机接收数据包的目标接口的数量。如果目的地的三个接口(eth1、eth2、eth_int)可以同时从源获取数据包,则目的地将接收三个重复的UDP数据包。

实际上,我在应用程序上遇到了一些问题,因为我没有实现避免重复数据包的检查。

添加一个简单的增量检查有时无法按预期工作为什么?路由器甚至可以实时轻松地更改UDP数据包的入站/出站路由,这可能会导致某些数据包延迟。这可能导致下一种情况:

  • 程序A向程序B发送具有增量ID 1、2和3的3个UDP数据包
  • 程序B按顺序2、1和3接收UDP数据包。不是你所期望的

所以,相反,我在相同但不同的机制中下注:

  • 在数据包中添加一些随机值
  • 当程序收到数据包时,生成数据包的校验和
  • 保存数据包的最后N个校验和(例如:N=100)
  • 每次收到数据包时,请在列表中搜索重复的校验和如果发现,则丢弃

希望这将帮助您完全避免重复的数据包。如果你的协议是未加密的,随机值将帮助你获得唯一的校验和(希望你在最后N个数据包中不会发生校验和冲突)。

最新更新