处理多个UDP流

时间:2015-07-22 11:06:38

标签: c sockets networking linux-kernel udp

假设我有一些id {(例如RTP SSRC)唯一标识的m个UDP流。我需要在n关联的线程中处理它们,关联是1-N,即一个或多个线程处理一个UDP流。

如果我:

,内核的网络堆栈性能有何不同?
  1. 在不同的端口上启动m UDP服务器。每个服务器处理一个流并将其数据推送到一个或多个关联的线程。

  2. 只启动一台服务器。所有流都由它的单个端口处理,该线程将每个流数据推送到一个或多个相关线程旁边。

  3. 我认为可以归结为这样一个问题:打开一个或多个端口是否更好,每个端口的数据会按比例减少?

    单个套接字是否有可能被传入数据量淹没?或者也许套接字,这在Linux内核中比在物理上更合乎逻辑,与数据本身没什么关系,所以没有真正的区别?

    单个UDP套接字(扩展缓冲区)可以处理的最大比特率是多少?

    我相信我最好通过浏览内核的网络代码找到答案,但也许有人可以直接给出答案。谢谢。

2 个答案:

答案 0 :(得分:2)

没有简单的回答这个问题,因为这一切都归结为你的线程的处理速度以及你如何委托他们的工作。
如果您认为udp套接字不堪重负,您可以在udp套接字后面创建一个队列。此队列可以增长到允许它增长的大小。当然你会使用更多的内存。

您将拥有的是消费者/生产者范例。一个线程将东西放入队列,其他线程从队列中取出。

如果线程的处理比填充队列的线程慢,并且这种情况持续很长时间。无论如何你的队列都会被超限。

有专门用于多媒体处理任务的框架。你可能想看看gstreamer。 http://gstreamer.freedesktop.org/documentation/ 它支持RTP,基本上是一个允许创建数据流管道的系统,这正是你在这里所做的。

你会发现gstreamer有现成的队列,允许在管道中的某个地方排队一些数据。无论如何,这证明了当你高速处理时需要这样的东西。虽然我不是一个gstreamer专家。 Gstreamer具有构建块,因此您可以尝试管道并轻松添加排队,删除它并比较整个管道的结果。它需要一些学习来了解api。它是用C语言编写的。

答案 1 :(得分:1)

您拥有的套接字越多,您拥有的套接字接收缓冲区就越多,因此可用于传入数据的空间就越多。

这表明多插槽可能是更好的选择。

然而,数据报可能在任何地方丢失,而不仅仅是在目标主机上。