组播环回
Loopback in multicast
这个问题是关于在同一主机内发送和接收多播,同时将其发送到其他主机。
即使经过几个小时的谷歌搜索,我仍然无法弄清楚多播数据报是如何在同一主机内路由的……!
问题的详细描述来了:
Linux 盒子 "A" 通过电缆连接到 switch/router(让我们称 switch/router 为 "R")。
在 linux 框 A 中,我有一个进程 (A0) 将 UDP 数据包发送到多播地址“224.0.0.0”,端口 5000。
同样,在同一个盒子 A 中,我有两个进程(A1 和 A2),都连接到 224.0.0.0,端口 5000 并使用 UDP 数据包。
现在,盒子A中的内核是如何管理路由的?
因此,A0 发送了一个数据报,供 A1 和 A2 使用。这样的数据报执行往返 A --> R --> A 吗?
.. 或者 "A" 中的内核路由是否足够聪明,可以避免这种不必要的往返? (即数据报由 A0 发送并立即由 A1 和 A2 使用,永远不会离开 A)。
当然,可以通过为多播创建并执行环回设备来确保多播数据报永远不会离开A:
sudo ifconfig lo multicast
sudo route add -net 224.0.0.0 netmask 240.0.0.0 dev lo
但是现在,如果我想在另一个 linux 盒子中同时使用 UDP 数据报,比如 "B",它们无法到达那里。
因此,理想情况下,(1) 在 A 中使用的数据报永远不会离开 A(即没有往返 A --> R --> A),而 (2) 在 B 中使用的数据报应该像 A 一样正常传输 - -> R --> B。我想同时实现这两件事。
有什么方法可以实现这一点,例如,使用 "route" 命令?
套接字是进程 A1 和 A2 设置了以下标志:
SO_REUSEADDR
SO_REUSEPORT
虽然我检查了进程 A0(发送多播数据报的进程)有以下标志:
IP_MULTICAST_LOOP
循环回本地进程(本地套接字)应该可以在不添加到 lo 的多播路由的情况下工作。只要确保你有一个有用的路由设置到一些外部接口。数据包仍将在内部路由。 (Linux 在幕后做了很多路由。)
你需要IP_MULTICAST_LOOP,这个看起来不错。
您是否在所有进程中正确加入了组播组? IP_ADD_MEMBERSHIP?没有这个你就会得到各种虚假行为。
您可以查看本地路由 table 以了解 Linux 在本地对数据包做了什么。它通常远非微不足道:
sudo ip route show table local
您还可以查看当前的多播组成员:
netstat -g
输出和引用计数对你的情况有意义吗?
首先配置您的网络适配器:
ifconfig lo 127.0.0.1 netmask 224.0.0.0 up
然后按照下面的代码:
/发送/
gst-launch-1.0 -v imxv4l2videosrc device=/dev/video0 ! imxvpuenc_h264 bitrate=10000 ! rtph264pay ! udpsink host=224.0.0.0 port=5000 auto-multicast=true multicast-iface=lo force-ipv4=true sync=false &
/接收/
gst-launch-1.0 udpsrc multicast-group=224.0.0.0 port=5000 auto-multicast=true multicast-iface=lo ! application/x-rtp ! rtph264depay ! h264parse ! imxvpudec ! imxipuvideosink framebuffer=/dev/fb0 sync=false &
gst-launch-1.0 udpsrc multicast-group=224.0.0.0 port=5000 auto-multicast=true multicast-iface=lo ! application/x-rtp ! rtph264depay ! h264parse ! imxvpudec ! imxipuvideosink framebuffer=/dev/fb2 sync=false &
这个问题是关于在同一主机内发送和接收多播,同时将其发送到其他主机。
即使经过几个小时的谷歌搜索,我仍然无法弄清楚多播数据报是如何在同一主机内路由的……!
问题的详细描述来了:
Linux 盒子 "A" 通过电缆连接到 switch/router(让我们称 switch/router 为 "R")。
在 linux 框 A 中,我有一个进程 (A0) 将 UDP 数据包发送到多播地址“224.0.0.0”,端口 5000。
同样,在同一个盒子 A 中,我有两个进程(A1 和 A2),都连接到 224.0.0.0,端口 5000 并使用 UDP 数据包。
现在,盒子A中的内核是如何管理路由的?
因此,A0 发送了一个数据报,供 A1 和 A2 使用。这样的数据报执行往返 A --> R --> A 吗?
.. 或者 "A" 中的内核路由是否足够聪明,可以避免这种不必要的往返? (即数据报由 A0 发送并立即由 A1 和 A2 使用,永远不会离开 A)。
当然,可以通过为多播创建并执行环回设备来确保多播数据报永远不会离开A:
sudo ifconfig lo multicast
sudo route add -net 224.0.0.0 netmask 240.0.0.0 dev lo
但是现在,如果我想在另一个 linux 盒子中同时使用 UDP 数据报,比如 "B",它们无法到达那里。
因此,理想情况下,(1) 在 A 中使用的数据报永远不会离开 A(即没有往返 A --> R --> A),而 (2) 在 B 中使用的数据报应该像 A 一样正常传输 - -> R --> B。我想同时实现这两件事。
有什么方法可以实现这一点,例如,使用 "route" 命令?
套接字是进程 A1 和 A2 设置了以下标志:
SO_REUSEADDR
SO_REUSEPORT
虽然我检查了进程 A0(发送多播数据报的进程)有以下标志:
IP_MULTICAST_LOOP
循环回本地进程(本地套接字)应该可以在不添加到 lo 的多播路由的情况下工作。只要确保你有一个有用的路由设置到一些外部接口。数据包仍将在内部路由。 (Linux 在幕后做了很多路由。)
你需要IP_MULTICAST_LOOP,这个看起来不错。
您是否在所有进程中正确加入了组播组? IP_ADD_MEMBERSHIP?没有这个你就会得到各种虚假行为。
您可以查看本地路由 table 以了解 Linux 在本地对数据包做了什么。它通常远非微不足道:
sudo ip route show table local
您还可以查看当前的多播组成员:
netstat -g
输出和引用计数对你的情况有意义吗?
首先配置您的网络适配器:
ifconfig lo 127.0.0.1 netmask 224.0.0.0 up
然后按照下面的代码: /发送/
gst-launch-1.0 -v imxv4l2videosrc device=/dev/video0 ! imxvpuenc_h264 bitrate=10000 ! rtph264pay ! udpsink host=224.0.0.0 port=5000 auto-multicast=true multicast-iface=lo force-ipv4=true sync=false &
/接收/
gst-launch-1.0 udpsrc multicast-group=224.0.0.0 port=5000 auto-multicast=true multicast-iface=lo ! application/x-rtp ! rtph264depay ! h264parse ! imxvpudec ! imxipuvideosink framebuffer=/dev/fb0 sync=false &
gst-launch-1.0 udpsrc multicast-group=224.0.0.0 port=5000 auto-multicast=true multicast-iface=lo ! application/x-rtp ! rtph264depay ! h264parse ! imxvpudec ! imxipuvideosink framebuffer=/dev/fb2 sync=false &