我将尽力在此提供关于 TCP/IP 网络上组播的最广泛、最新和准确的信息。 欢迎任何反馈。 如果您发现本文档中有任何错误,对内容有任何意见或更新或补充,请将它们发送到本文档顶部列出的我的地址。
组播是... 一种需求。 至少在某些情况下是这样。 如果您有信息(通常是大量信息)需要通过互联网传输到多个(但通常不是所有)主机,那么组播就是答案。 常见的使用场景是将实时音频和视频分发给加入分布式会议的主机集合。
组播很像无线电或电视,只有那些调谐了接收器(通过选择他们感兴趣的特定频率)的人才能接收到信息。 也就是说:您听到您感兴趣的频道,但听不到其他频道。
单播是指既不是广播也不是组播的任何事物。 好了,这个定义不是很明确…… 当您发送一个数据包,并且只有一个发送进程(您的)和一个接收进程(您要发送数据包的那个)时,这就是单播。 TCP 本质上是面向单播的。 UDP 支持更多范例,但如果您发送 UDP 数据包并且只有一个进程应该接收它们,这也是单播。
多年来,单播传输被证明足以满足互联网的需求。 直到 1993 年,组播的第一个实现才在 4.4 BSD 版本中问世。 似乎在那之前没有人需要它。 组播解决了哪些新问题呢?
毋庸置疑,自“早期”以来,互联网已经发生了很大变化。 特别是,Web 的出现极大地改变了局面:人们不再仅仅想要连接到远程主机、邮件和 FTP。 首先,他们想看到人们放在他们主页上的图片,但后来他们也想看和听到那些人。
以今天的技术,可以负担得起与每个想看您的网页的人建立单播连接的“成本”。 但是,如果您要发送音频和视频,与 Web 应用程序相比,这需要巨大的带宽,那么您有(或者说曾经有,直到组播出现)两种选择:与每个接收者建立单独的单播连接,或者使用广播。 第一种解决方案是不可负担的:如果我们说一个单独的发送音频/视频的连接消耗了巨大的带宽,想象一下必须建立数百甚至可能数千个这样的连接。 发送计算机和您的网络都会崩溃。
广播似乎是一个解决方案,但肯定不是最好的解决方案。 如果您希望 LAN 中的所有主机都参加会议,则可以使用广播。 数据包将只发送一次,并且每个主机都将在数据包发送到广播地址时接收它们。 问题是,可能只有少数主机而不是所有主机对这些数据包感兴趣。 此外:可能有些主机真的对您的会议感兴趣,但它们在您的 LAN 之外,距离几个路由器。 而且您知道广播在 LAN 内部运行良好,但是当您希望广播数据包跨不同的 LAN 路由时,问题就出现了。
最好的解决方案似乎是您将数据包发送到某个特殊地址(无线电/电视传输中的某个频率)。 然后,所有已决定加入会议的主机都将意识到具有该目标地址的数据包,在它们穿过网络时读取它们,并将它们传递到 IP 层以进行解复用。 这类似于广播,因为您只发送一个广播数据包,并且网络中的所有主机都识别并读取它; 然而,不同之处在于,并非所有组播数据包都被读取和处理,而仅读取和处理那些先前在内核中注册为“感兴趣”的数据包。
这些特殊数据包在内核级别像任何数据包一样路由,因为它们是 IP 数据包。 唯一的区别可能在于路由算法,该算法告诉内核在哪里路由或不路由它们。