假设我有一个具有组 ID 的多播组,并且我只想将数据包发送给其中一个组成员(就像我们在任播中所做的那样)。这可能吗?如果可以,那么怎么做?
答案1
根据定义,发送到多播组的所有数据包都将被多播组的所有成员接收。向多播组传送数据的设备不必知道接收者是谁。发送者将数据包发送到多播 ID,任何感兴趣的接收者都会监听它们。在现代网络中,路由器会跟踪哪些终端节点参与了特定的多播组,并且只向这些节点发送多播流量,无需向没有订阅者的子网发送多播流量。网络上任何东西跟踪的唯一状态是路由器,因为它们确定哪些子网/端点在多播组中/不在多播组中。
在应用程序级别,可以跟踪哪些终端节点正在参与组,尽管这确实取决于具体应用程序。当节点宣布它们想要参与多播组时,流量不会传送到所有节点。但是,某些应用协议需要向多播组发出公告,能被传送到所有节点,从而可以粗略地跟踪谁属于某个组。该流量看起来类似于:
192.168.231.18:33411 -> 224.0.0.1:80
数据包的形成如下:
224.0.0.1:80 -> 192.168.231.18:33411
被认为格式不正确,将被大多数 TCP/IP 堆栈删除。
通过多播将内容传送到特定节点的唯一方法是让路由器执行必要的数据包路由。这可能是可行的,但它将用于多播协议,这些协议出于某种原因需要它,并将嵌入到路由器操作系统中。此功能将是规则的决定性例外。
更新:多播中的任播
多播的通讯方向是一个主机向一组所有订阅者发送。
任播是指一个主机向组中最近的一个节点发送消息。
两者在定义上几乎是对立的,根本无法融合在一起。
但是,你可以这样做模型。多播数据包可以传输多远由路由器限制,互联网边缘路由器通常不允许多播数据包通过自身。这将多播限制在站点内部。为了将多个站点连接到单个多播组,站点内的节点需要获得单播来自某个主服务器的数据,然后将其转发到本地多播组。它看起来如下:
弯曲的虚线表示阻止多播的边缘路由器。长虚线表示发送到本地主服务器的单播流。该过程如下:
- 本地主节点连接到主节点(单播)。
- 客户端订阅其本地多播组(多播)。
- 主机开始向本地主机发送数据(单播)。
- 本地主机将数据中继到多播组(多播)。
- 客户端接收多播数据包。
可以将其想象为无线电中的中继站。中继器从带外(卫星下行链路、微波中继、地下电线等)接收广播内容,然后通过无线电天线进行广播。本地主站是中继器,带外链路是主站的单播流,实际的无线电广播本身是向订阅客户端发送的多播。
答案2
某些网络设备可能能够提供该信息,但我不知道有任何标准方法可以做到这一点。当节点加入多播组时,不会向源发送任何公告。