我怎么知道我已经收到了哪些 UDP 数据包?

How do I know which UDP packets I have already received?

我正在使用带有 UDP 的客户端-服务器模型制作游戏。以下是我目前的实施方式:

我的困境是:如果 "important" 消息到达两次,我只想处理一次。但是,如果不在内存中保留不断扩展的列表,我怎么知道我已经收到了它?

想法

  1. 请记住收到的最后 X "important" 条消息 - 收到非常旧的消息的可能性很小(不理想,因为它不是 100% 可靠)。
  2. 将 TCP 用于 "important" 消息(由于同时管理 2 个协议所涉及的复杂性和开销,并不理想)。
  3. 为 "important" 条消息设置一个单独的序列号,并确保这些消息始终按顺序接收,因此只需要记住最近的消息(我倾向于这样做)。
  4. 还有其他想法吗?

为 "important" 条消息(从零开始)和以下变量设置单独的序列号:

  • 一个变量min_recv,表示你收到了从0到min_recv的所有"important"条消息(排除);
  • 您已经收到的 "important" 序列号列表。

在任何时候(例如在收到另一个 "important" 消息后),您将其序列号存储在列表中;然后你可以检查你是否可以压缩列表:

while list contains `min_recv`:
    remove `min_recv` from list
    increment min_recv

这样你消耗的内存最少,因为即使你收到乱序的重要消息(并且列表的大小会开始增长),最终你也会收到丢失的消息,因为它会丢失重传,清空列表

使用#3。您正在确认重要消息这一事实提供了一种确保按顺序接收它们的机制,即不要确认一个乱序的消息,只需记住您确认的最后一个消息的序列号。