【问题标题】:Multicast data overhead?多播数据开销?
【发布时间】:2013-08-27 06:43:54
【问题描述】:

我的应用程序使用 UDP 的多播功能。

简而言之,我正在使用 java 并希望使用单个多播地址和端口传输所有数据。尽管多播侦听器将在逻辑上划分为子组,这些子组可以在运行时更改并且可能不希望处理来自其组之外的数据。

为了实现这一点,我编写了代码,以便应用程序的所有运行实例将加入相同的多播组和端口,但会仔细观察数据包的发送者以确定它是否属于它们的子组。

警告我的应用程序的最小数据包大小为 30000-60000 字节!!!!!

将使用 MulticastSocket.receive(DatagramPacket) 读取每个数据包并确定其所需数据包是否会导致过多开销(甚至缓冲区溢出)。

是否会因为每个数据包都发送给每个人而产生大量流量导致网络拥塞?

【问题讨论】:

  • 对于如此大的数据包,您更有可能超出网络设备/适配器的缓冲区大小。许多每个连接只有几 MB,并且系统上有其他流量,您可能会经常溢出缓冲区。我建议您编写应用程序来处理相当高的辍学率。
  • 另一种选择是将这些数据包拆分成更小的数据包,传输它们,然后在接收端重新组合它们!

标签: java sockets networking udp multicast


【解决方案1】:

不是每个数据包都发送给每个人,因为多播(例如 PIM)会构建一个多播树,以最佳地放置接收者和发送者。因此,网络将在需要时复制数据包。多播数据包在最后一跳广播(技术上更准确,在第 2 层泛滥)。 IGMP 在最后一跳协助多播,并确保如果最后一跳没有接收者加入,则不会进行此类泛洪。

“并且可能不希望处理来自他们组之外的数据。”接收调用将返回下一个接收到的数据报,因此几乎无法避免处理不用于子组分类的数据包。您的应用程序不能使用不同的多个组吗?

【讨论】:

  • 如果 100 个接收者加入同一个组会怎样
  • 您能否澄清您的评论。即使有大量的接收者,基本的多播片段也会继续工作,所以 100 个接收者应该还可以。
  • IGMP 在每一跳都提供帮助。如果另一端没有接收者,则不传播数据报。
【解决方案2】:

每个数据包都可能发送给每个人,但每个数据包只会在网络上出现一次。

但是,除非此应用程序完全在您控制的 LAN 中运行,包括所有路由器,否则它已经非常不可行。一旦通过不受您控制的路由器,通常接受的最大 UDP 数据报大小为 534。

【讨论】:

  • 好吧,我也许可以减少数据包的大小,是的,它全部在私有 WLAN 中,但我主要担心的是它会导致拥塞,因为实际上相同的数据将被路由器复制并发送到每个已加入群组的设备。那么如果局域网中有 100 台设备,会不会造成拥塞?
  • 不,因为每个数据包只在每个子网上出现一次,而且根本不会出现,除非其中或之外有多播侦听器。这就是多播的全部意义所在。
猜你喜欢
  • 1970-01-01
  • 2012-07-04
  • 1970-01-01
  • 2010-09-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-20
相关资源
最近更新 更多