我的问题与多播上的单播分层有关,有两个部分。
第 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。
人们会想到一个直截了当的回答,比如“它行不通!” 就足够了……显然在这个美丽的新世界中不再存在了。正如他们所说的“有足够的推力......”
非常感谢,
拉克什