在多播上分层单播寻址

网络工程 以太网 ipv4 通讯协议 多播 苹果电脑
2021-07-18 19:39:09

我的问题与多播上的单播分层有关,有两个部分。

第 1 部分。 IP 单播通过 MAC 多播

问题的第一部分是是否有标准禁止在以太网帧中使用 IPv4 单播地址和多播 MAC 地址?
我在 2005 年发现了关于该主题的以下讨论 。https://forums.tomshardware.com/threads/multicast-mac-and-unicast-ip-address.951449/

在阅读该电子邮件链后,我对这个问题的理解是,这并未明确禁止。(至少到 2005 年)并且有多个供应商的集群解决方案依赖于此。

我猜就标准合规性而言,情况仍然如此。我想知道的是从商用网络设备和网络堆栈的实际角度来看,如何处理这些数据包。例如,近年来对安全性的关注可能导致堆栈不能容忍任何非典型用例。

第 2 部分。 TCP over IP 多播

这可能听起来有点疯狂或毫无意义,请耐心等待。

流 (TCP) 套接字可以与多播 IP 地址一起使用吗?

从套接字应用程序的角度来看,这基本上归结为两件事。调用指定多播目标地址的 sockaddr 的“连接”API 会起作用吗?(假设目的节点被设计为使用多播 MAC 地址回复特定单播 IPv4 地址的 ARP)

我还可以期望在绑定并侦听 TCP 端口(例如 0.0.0.0:port)的流套接字上的 setsockopt(sd, IPPROTO_IP, IP_ADD_MEMBERSHIP, group address .... ) 成功吗?

我快速查看了 linux 网络堆栈的搜索,但没有看到可以防止这种情况的特定检查,https://elixir.bootlin.com/linux/latest/source/net/ipv4/ip_sockglue.c

根据我在小型 RTOS 中使用网络堆栈的有限经验,如果上述组合开箱即用,我会感到惊讶。例如,这意味着堆栈接收到一个多播以太网帧(已配置任何 MAC 层硬件过滤器以允许此操作),然后查看 IPv4 标头中的协议字段,将有效负载与 TCP 端口对象相关联而不闪烁。

一些背景。我这样做不是为了实现 1:N 或 N:M TCP 会话。很无聊,我感兴趣的是标准的点对点 TCP 会话。

不幸的是,除非我提出上述组合不起作用或不受欢迎的具体原因,否则我将不得不处理很可能拒绝转发单播以太网帧的第二层硬件(基于处理 TSN 的静态定义转发表流)并实现应用层协议,其中一些协议在这个网络上使用 TCP。

人们会想到一个直截了当的回答,比如“它行不通!” 就足够了……显然在这个美丽的新世界中不再存在了。正如他们所说的“有足够的推力......”

非常感谢,

拉克什

4个回答

问题的第一部分是是否有标准禁止在以太网帧中使用 IPv4 单播地址和多播 MAC 地址?

这里的问题是您正在处理由两个完全不同的团体定义和维护的不同网络层上的两种不同标准。以太网是 IEEE 802.3,但 IP 是由 IETF 定义的。

IEEE 标准规定多播(包括广播)地址不能是源地址。IPv4 多播的 RFC 还要求源地址是单播地址。

IEEE 协议不知道有效载荷中的内容,它可能是 IPv4、ARP、IPX、IPv6、AppleTalk 等,因此以太网不知道网络地址是单播还是多播。IP不知道承载的是什么数据链路协议,有些数据链路协议没有地址,有些没有广播或多播,所以IP不知道数据链路地址是否是多播地址,或者如果数据链路协议甚至使用任何寻址。

一个特定的主机实现在这里是题外话。

流 (TCP) 套接字可以与多播 IP 地址一起使用吗?

不可以。TCP在两台主机之间建立连接,连接需要源IP和目的IP以及TCP地址来识别连接。由于 IP 多播地址不能用作源地址,因此您将无法使用多播建立连接。发送到多播地址的 TCP SYN 需要来自多播地址的 SYN/ACK 才能建立连接,但多播地址不能是源地址,因此 SYN/ACK 将来自发送主机的单播地址。这将阻止建立连接。

不是直接的答案,但我可以向您保证,通过广播以太网的TCP over IP工作正常。

在调出网络堆栈时,我不止一次地使 ARP 模块始终返回 ethernet broadcast ff:ff:ff:ff:ff:ff它惹恼了网络人员,但帮助了操作系统人员。

我认为接收系统通常不会注意到非广播 IP 数据包到达广播帧,即使在今天也是如此。

问题的第一部分是是否有标准禁止在以太网帧中使用 IPv4 单播地址和多播 MAC 地址?

没有禁止使用 IPv4 单播和多播 MAC 的标准。从技术上讲,这是可能的,因为交换机不关心 IP 标头。正如你所说,它可以用于在同一个 layer2 网络中集群应用程序。集群节点在剥离多播以太网帧时可以理解和处理 IP 帧。

但是,如果您想通过第 3 层网络进行多播流,则它不适用于单播目标 IP 地址。存在从多播 IP 到多播 MAC 的转换,路由器遵循此标准。

路由器剥离接收到的数据包的 MAC 标头,并在发送之前推送另一个 MAC 标头。

IPv4 地址为 32 位,对于多播地址,前 4 位固定为 1110。所以 28 位可用于映射。

MAC 地址为 48 位,前 25 位固定为 01:00:5e(第 25 位为 0)用于多播。所以 23 位可用于映射。

路由器将组播组 IP 的最后 23 位映射到组播 MAC 中的可用位。由于它们将 28 位映射到 23 位,因此需要考虑重叠的可能性。

例如,如果数据包的组播 IP 为 239.1.1.1,则路由器在发送之前会推送 01:00:5e:01:01:01 的组播目标 MAC。

因此,您所说的仅在 IP 不重要的 layer2 网络中才有可能。

虽然正如 Ron 恰当地指出的那样,直接“多播地址上的单播”是不可能的,但应该可以通过多播网络进行单播隧道传输,或者从另一个角度来看,在纯多播网络上创建启用单播的覆盖网络。

您“只需要”找到一个支持多播目的地的隧道协议,而不管(单播)源地址(您可以 - 可能 - 静态 NAT)。我完全不确定它是否存在,但只要付出足够的努力,它就可以被创造出来。