udp丢包和恢复

时间:2011-04-19 08:39:26

标签: network-programming udp p2p hole-punching

我正在研究基于udp / tcp的P2P文件和实时视频流应用程序。该应用程序将使用c ++为Linux和Windows平台开发。

我们正在使用ICE(TCP / UDP打孔)来实现P2P。 虽然TCP确保数据包丢失,但对于UDP,我需要一个不错的方法来确保数据包必须传递给另一个对等体。

  1. 我想知道这样做的算法或技术。
  2. 是否有任何免费的派对工具/图书馆可以做。
  3. 任何链接和建议都将受到赞赏?

3 个答案:

答案 0 :(得分:4)

您需要涵盖4个主要问题:

  1. 数据切片 - UDP数据报不能包含无限量的信息。因此,您(通常)需要将您的信息分成多个数据报,并在另一端重新连接拼图。对于给定的“切片”,您需要唯一的标识符和拼图编号。
  2. 从未达成 - UDP数据报有时会在网上丢失。如果目标对等方没有收到预期的数据报,那么应该有一种机制让他再次请求它。另一种方法是在接收时发送确认。
  3. 重播 - 有时,您可能会收到两次相同的UDP数据报(原因很复杂)。目标对等方应该检测到这一点。
  4. 无序 - 发送顺序并不总是接收顺序。目标对等方需要处理这种情况。
  5. 您可以实施一个名为slicing window的协议。我不认为你会找到第三方库(尽管有人可能在这里证明我错了),因为上述所有内容通常都是由TCP本身实现的。

答案 1 :(得分:0)

您可能会发现此问题的答案有用:What do you use when you need reliable UDP?

答案 2 :(得分:-1)

一种简单的方法是为每个数据包建立一个监控线程 -

public void run() {
    int transmissions = 0;
    do {
        sendPacket();
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {}
    } while (!acknowledged() && ++transmissions < MAX_TRANSMISSIONS);
}

如果性能很重要,可以使用单个线程来监控消息队列。