1

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

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

  1. 我想知道执行此操作的算法或技术。
  2. 是否有任何免费的第三方工具/库可以做。

任何链接和建议将不胜感激?

4

3 回答 3

5

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

  1. 数据切片- UDP 数据报不能包含无限量的信息。因此,您将(经常)需要将您的信息分割成多个数据报,并在另一端重新连接拼图。对于给定的“切片”,您需要唯一标识符和拼图编号。
  2. Never Reached - UDP 数据报有时会在网络上丢失。如果目标对等方没有收到预期的数据报,则应该有一种机制让他再次请求它。另一种方法是在接收时发送确认。
  3. 重播- 有时,您可能会收到两次相同的 UDP 数据报(出于复杂的原因)。目标对等体应该检测到这一点。
  4. 乱序- 发送的顺序并不总是接收的顺序。目标对等体需要处理这种情况。

您可以实现一个称为切片窗口的协议。我认为您不会为此找到第 3 方库(尽管有人可能在这里证明我错了),因为上述所有内容通常都是由 TCP 本身实现的。

于 2011-04-19T11:03:33.063 回答
0

您可能会发现这个问题的答案很有帮助:当您需要可靠的 UDP 时,您使用什么?

于 2011-04-19T12:27:25.027 回答
-1

一个简单的方法是为每个数据包设置一个监控线程——

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

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

于 2011-04-19T08:50:29.340 回答