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

时间:2015-04-26 22:13:12

标签: networking udp client-server

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

  • 所有数据包都包含一个序列号和一个标志,指明它们是否重要"。
  • 重要的消息类型需要确认,如果没有收到确认,将在延迟后重新发送。
  • 大多数消息类型都是"不重要的" - 也就是说,它们不需要确认,如果收到的序列号比最新的序列号短,则会被删除。

我的困境是:如果一个"重要的"消息到达两次,我只想处理一次。但我怎么知道我已经收到了它,而没有在记忆中保留一个不断扩大的名单?

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

2 个答案:

答案 0 :(得分:1)

为“重要”消息(从零开始)有一个单独的序列号,以及以下变量:

  • 变量min_recv,表示您收到了从0到min_recv的所有“重要”消息(已排除);
  • 您已收到的“重要”序列号列表。

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

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

通过这种方式,您消耗的内存最少,因为即使您收到无序的重要消息(并且列表的大小也会开始增长),最终您将收到丢失的消息,因为如果它将被重新传输,丢了,你就会清空这个清单。

答案 1 :(得分:1)

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