您可能知道,IP 地址范围根据 32 位 IP 地址的高位被划分为“类”
Bit --> 0 31 Address Range: +-+----------------------------+ |0| Class A Address | 0.0.0.0 - 127.255.255.255 +-+----------------------------+ +-+-+--------------------------+ |1 0| Class B Address | 128.0.0.0 - 191.255.255.255 +-+-+--------------------------+ +-+-+-+------------------------+ |1 1 0| Class C Address | 192.0.0.0 - 223.255.255.255 +-+-+-+------------------------+ +-+-+-+-+----------------------+ |1 1 1 0| MULTICAST Address | 224.0.0.0 - 239.255.255.255 +-+-+-+-+----------------------+ +-+-+-+-+-+--------------------+ |1 1 1 1 0| Reserved | 240.0.0.0 - 247.255.255.255 +-+-+-+-+-+--------------------+
与我们相关的是“D 类地址”。每个目标地址以“1110”开头的 IP 数据报都是 IP 组播数据报。
剩余的 28 位标识数据报发送到的组播“组”。 沿用之前的类比,您必须调谐收音机才能收听在特定频率传输的节目,同样,您必须“调谐”您的内核以接收发送到特定组播组的数据包。 当您这样做时,就说主机已在您指定的接口中加入了该组。 稍后会详细介绍。
有一些特殊的组播组,例如“众所周知的组播组”,由于它们的特殊用途,您不应在您的特定应用程序中使用它们
所有这些特殊的组播组都定期在“分配号码”RFC 中发布。
在任何情况下,224.0.0.0 到 224.0.0.255 的范围都保留用于本地目的(如管理和维护任务),并且发往它们的数据报永远不会被组播路由器转发。 同样,239.0.0.0 到 239.255.255.255 的范围已保留用于“管理作用域”(有关管理作用域的信息,请参阅 2.3.1 节)。
根据主机满足的要求,主机可以处于组播规范的三个不同的一致性级别。
级别 0 是“不支持 IP 组播”级别。 互联网上的许多主机和路由器都处于这种状态,因为组播支持在 IPv4 中不是强制性的(但在 IPv6 中是强制性的)。 这里不需要太多解释:此级别的主机既不能发送也不能接收组播数据包。 它们必须忽略其他支持组播的主机发送的数据包。
级别 1 是“支持发送但不接收组播 IP 数据报”级别。 因此,请注意,不需要加入组播组即可向其发送数据报。 正如 2.3 节所示,IP 模块中只需要很少的添加即可使“级别 0”主机“符合级别 1 标准”。
级别 2 是“完全支持 IP 组播”级别。 级别 2 主机必须能够发送和接收组播流量。 它们必须知道加入和离开组播组以及将此信息传播到组播路由器的方法。 因此,它们必须在其 TCP/IP 协议栈中包含互联网组管理协议 (IGMP) 实现。
到目前为止,应该很明显,组播流量是在传输层使用 UDP 处理的,因为 TCP 提供点对点连接,这对于组播流量是不可行的。(正在进行大量研究以定义和实施新的面向组播的传输协议。 有关详细信息,请参阅 组播传输协议 部分)。
原则上,应用程序只需要打开一个 UDP 套接字,并用 D 类组播地址填充它想要发送数据的目标地址。 但是,发送过程必须能够控制一些操作。
IP 报头中的 TTL(生存时间)字段在组播中具有双重意义。 与往常一样,它控制数据报的生存时间,以避免由于路由错误而永远循环。 路由器在数据报从一个网络传输到另一个网络时会递减每个数据报的 TTL,当其值达到 0 时,数据包将被丢弃。
IPv4 组播中的 TTL 也具有“阈值”的含义。 通过一个示例可以清楚地了解其用途:假设您在部门的所有主机之间设置一个长时间、消耗带宽的视频会议。 您希望大量流量保留在您的 LAN 中。 也许您的部门足够大,有多个 LAN。 在这种情况下,您希望属于您每个 LAN 的主机参加会议,但在任何情况下,您都不希望组播流量使整个互联网崩溃。 需要限制组播流量在路由器之间扩展的“长度”。 这就是 TTL 的用途。 路由器为其每个接口分配了一个 TTL 阈值,只有 TTL 大于接口阈值的数据报才会被转发。 请注意,当数据报通过分配了特定阈值的路由器时,数据报的 TTL 不会按阈值的值递减。 仅进行比较。 (与之前一样,TTL 在数据报每次通过路由器时递减 1)。
TTL 阈值及其相关范围的列表如下
TTL Scope ---------------------------------------------------------------------- 0 Restricted to the same host. Won't be output by any interface. 1 Restricted to the same subnet. Won't be forwarded by a router. <32 Restricted to the same site, organization or department. <64 Restricted to the same region. <128 Restricted to the same continent. <255 Unrestricted in scope. Global.
没有人确切知道“站点”或“区域”是什么意思。 这取决于管理员决定这些限制适用于什么。
TTL 技巧并非总是足够灵活以满足所有需求,尤其是在处理重叠区域或尝试同时建立地理、拓扑和带宽限制时。 为了解决这些问题,管理作用域 IPv4 组播区域于 1994 年建立。 (请参阅 D. Meyer 的“管理作用域 IP 组播”互联网草案)。 它基于组播地址而不是 TTL 进行作用域划分。 239.0.0.0 到 239.255.255.255 的范围保留用于此管理作用域。
当发送主机符合级别 2 标准并且也是数据报要发送到的组的成员时,默认情况下会环回副本。 这并不意味着网卡读取自己的传输,将其识别为属于网卡所属的组,并从网络读取它。 相反,IP 层默认情况下会识别要发送的数据报,并在发送之前将其复制并排队到 IP 输入队列中。
此功能在某些情况下是需要的,但在其他情况下则不需要。 因此,发送过程可以随意打开和关闭它。
连接到多个网络的主机应为应用程序提供一种方法来决定将使用哪个网络接口来输出传输。 如果未指定,内核会根据系统管理员的配置选择默认接口。
(相比之下)广播比组播更容易实现。 它不需要进程为内核提供一些关于如何处理广播数据包的规则。 内核只知道该怎么做:读取并将所有数据包传递给适当的应用程序。
但是,对于组播,有必要告知内核我们对哪些组播组感兴趣。 也就是说,我们必须要求内核“加入”这些组播组。 根据底层硬件,组播数据报由硬件或 IP 层(在某些情况下,两者都)过滤。 只有那些通过加入先前注册了目标组的数据报才会被接受。
本质上,当我们加入一个组时,我们是在告诉内核:“好的。 我知道,默认情况下,您会忽略组播数据报,但请记住,我对这个组播组感兴趣。 因此,请读取并传递(给任何对它们感兴趣的进程,而不仅仅是我)您在此网络接口中看到的任何目标字段中带有此组播组的数据报”。
一些考虑事项:首先,请注意,您不仅仅是加入一个组。 您是在特定网络接口上加入一个组。 当然,可以在多个接口上加入同一个组。 如果您未指定具体接口,则内核将在发送数据报时根据其路由表选择接口。 多个进程也可能在同一接口上加入同一组播组。 它们都将通过该接口接收发送到该组的数据报。
如前所述,任何支持组播的主机在启动时都会加入所有主机组,因此“ping”224.0.0.1 会返回网络中所有已启用组播的主机。
最后,请考虑,为了使进程接收组播数据报,它必须请求内核加入该组并绑定那些数据报要发送到的端口。 UDP 层同时使用目标地址和端口来解复用数据包,并决定将它们传递到哪个或哪些套接字。
当进程不再对组播组感兴趣时,它会通知内核它想要离开该组。 重要的是要理解,这并不意味着内核将不再接受发往该组播组的组播数据报。 如果有更多进程为此组发出了“组播加入”请求并且仍然感兴趣,它仍然会这样做。 在这种情况下,主机仍然是该组的成员,直到所有进程都决定离开该组。
更重要的是:如果您离开该组,但仍绑定到您正在接收组播流量的端口,并且有更多进程加入了该组,您仍然会收到组播传输。
其思想是,加入组播组只是告诉 IP 和数据链路层(在某些情况下,它明确地告诉硬件)接受发往该组的组播数据报。 它不是每个进程的成员资格,而是每个主机的成员资格。
以太网和 FDDI 帧都有一个 48 位目标地址字段。 为了避免使用组播 ARP 将组播 IP 地址映射到以太网/FDDI 地址,IANA 为组播保留了一系列地址:每个目标地址在 01-00-5e-00-00-00 到 01-00-5e-ff-ff-ff (hex) 范围内的以太网/FDDI 帧都包含组播组的数据。 前缀 01-00-5e 将帧标识为组播,下一位始终为 0,因此仅剩下 23 位用于组播地址。 由于 IP 组播组长 28 位,因此映射不可能是一对一的。 只有 IP 组播组的 23 个最低有效位放置在帧中。 剩余的 5 个高位被忽略,导致 32 个不同的组播组被映射到同一个以太网/FDDI 地址。 这意味着以太网层充当不完善的过滤器,IP 层将不得不决定是否接受数据链路层传递给它的数据报。 IP 层充当最终的完美过滤器。
有关通过 FDDI 进行 IP 组播的完整详细信息,请参见 RFC 1390:“通过 FDDI 网络传输 IP 和 ARP”。 有关将 IP 组播地址映射到以太网地址的更多信息,您可以查阅 draft-ietf-mboned-intro-multicast-03.txt
:“IP 组播路由简介”。
如果您对通过令牌环局域网进行 IP 组播感兴趣,请参阅 RFC 1469 了解详细信息。