树莓派上的多播UDP
我还没有缩小范围,无法知道我的问题是否是由于 debian、特别是 raspbian,或者我是否完全错过了某些东西。
我有一个 python 应用程序,它使用多播 UDP 来让网络上的其他设备知道我的应用程序已启动并正在运行,并且可以在特定 IP 地址上使用。
UDP 多播组是 239.255.250.250,端口是 9131。如果我运行 tcpdump,我可以看到我尝试发送的数据包实际上正在发送数据,但我从未在网络上的其他计算机上看到任何内容通过。
还有其他设备使用具有相同多播组和端口的相同类型的“信标”,我可以看到这些数据包在其他计算机上通过。路由器没有防火墙,此时我真的没有选择。
以下是我知道如何运行的基本诊断。错误的 udp chksum 看起来可能没有帮助,但我对此一无所知。
ifconfig 的输出
eth0 Link encap:Ethernet HWaddr b8:27:eb:b2:79:12
inet addr:192.168.2.7 Bcast:192.168.2.255 Mask:255.255.255.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:1682 errors:0 dropped:0 overruns:0 frame:0
TX packets:1686 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:119105 (116.3 KiB) TX bytes:169570 (165.5 KiB)
应用程序运行时 tcpdump 的输出
tcpdump: listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes
03:29:15.722653 IP (tos 0x0, ttl 1, id 0, offset 0, flags [DF], proto UDP (17), length 221)
192.168.2.7.33335 > 239.255.250.250.9131: [bad udp cksum 0xae84 -> 0xaabe!] UDP, length 193
0x0000: 4500 00dd 0000 4000 0111 cb66 c0a8 0207 [email protected]....
0x0010: efff fafa 8237 23ab 00c9 ae84 414d 5842 .....7#.....AMXB
0x0020: 3c4d 4143 2d41 4444 523d 6238 3a32 373a <MAC-ADDR=b8:27:
0x0030: 6562 3a62 323a 3739 3a31 323e 3c2d 5555 eb:b2:79:12><-UU
0x0040: 4944 3d32 3032 3438 3135 3937 3537 3734 ID=2024815975774
0x0050: 3930 3e3c 2d53 444b 436c 6173 733d 5574 90><-SDKClass=Ut
0x0060: 696c 6974 793e 3c2d 4d61 6b65 3d69 5275 ility><-Make=iRu
0x0070: 6c65 426f 783e 3c2d 4d6f 6465 6c3d 5265 leBox><-Model=Re
0x0080: 6d6f 7465 426f 783e 3c2d 5265 7669 7369 moteBox><-Revisi
0x0090: 6f6e 3d30 2e31 3e3c 2d50 6b67 5f4c 6576 on=0.1><-Pkg_Lev
0x00a0: 656c 3d47 4350 4b30 3032 3e3c 2d43 6f6e el=GCPK002><-Con
0x00b0: 6669 672d 5552 4c3d 6874 7470 3a2f 2f31 fig-URL=http://1
0x00c0: 3932 2e31 3638 2e32 2e37 3a38 303e 3c2d 92.168.2.7:80><-
0x00d0: 5374 6174 7573 3d52 6561 6479 3e Status=Ready>
^C
1 packet captured
1 packet received by filter
0 packets dropped by kernel
程序运行时netstat的输出
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
udp 0 0 0.0.0.0:31144 0.0.0.0:* 1510/dhclient
udp 0 0 0.0.0.0:33335 0.0.0.0:* 2089/python
udp 0 0 0.0.0.0:68 0.0.0.0:* 1510/dhclient
udp 0 0 192.168.2.7:123 0.0.0.0:* 1911/ntpd
udp 0 0 0.0.0.0:123 0.0.0.0:* 1911/ntpd
答案1
我了解到您的主机 192.168.2.7 正在端口 9131 上向组 239.255.250.250 发送多播数据包
注意:但是我假设服务器正在侦听端口 9131。您没有提供任何相关信息。
从 ifconfig 输出中,我可以看到 MULTICAST 已启用,并且 tcpdump 确认了这一点。
首先确保运行服务器的主机(接收多播数据包的主机)已加入多播组。
在每个服务器主机上键入:
netstat -gn
如果您看到您的多播地址,则它已加入该组。如果没有,那么要么是你的服务器程序有问题,要么是内核设置有问题。
如果服务器已加入该组,但您没有看到任何来自客户端的数据包,请检查您已启用的路由器免疫组化(您的路由器必须支持 igmp)
例如,在思科路由器上
enable
conf t
ip multicast-routing
For each interface involved.
int <NIC>
ip pim sparse-dense-mode
如果路由器上启用了 igmp,请查找调试功能来跟踪数据包。
在服务器端,启动数据包捕获:
tcpdump -i <NIC> host 239.255.250.250
如果您没有看到任何数据包传入,则不会转发多播数据包(假设
然后在客户端发送多播数据包(使用下面链接中的脚本进行故障排除)
注意:UDP 数据包似乎格式错误,因此不确定服务器是否能够读取它。您可以使用下面链接中的脚本来确认 tcpdump 中的消息是否显示为格式错误(在我的情况下不是)
使用多播的 python 代码示例:
https://stackoverflow.com/questions/603852/multicast-in-python
注意:我在 debian raspi 上使用了这个脚本(不是 raspbian,服务器通过路由器接收数据包 - 如上面的设置 - 很好)
答案2
我注意到这也可能是硬件和/或驱动程序问题。我在我的 raspberryPI 上使用多播 UDP(传输和接收),没有任何问题 - 使用 C、Java 和/或 Python 程序。
然而,我刚刚了解到 UDP 多播接收不适用于 EDIMAX 的漂亮的小型 USB nano WiFi 适配器 - 发送 UDP(多播)可以工作,也可以接收自己的(本地)消息。
来自 lsusb 的 USB 记忆棒的详细信息:
UDP 多播接收不起作用:ID 7392:7811 Edimax Technology Co., Ltd EW-7811Un 802.11n 无线适配器 [Realtek RTL8188CUS]
UDP 组播接收工作正常: ID 148f:3070 Ralink Technology, Corp. RT2870/RT3070 无线适配器
答案3
我遇到了类似的问题,数据包正在传入,我可以看到它们,tcpdump
但没有程序可以接收数据。
本例中的问题是,我过去iptables
只允许来自本地子网的流量,192.168.0.0/24
但当然多播来自本地子网224.0.0.0/4
。我没有开放整个子网(也可能没有防火墙),而是允许来自我用于多播的特定 UDP 端口上的所有主机的流量,这解决了问题。
答案4
对于我们来说,我们遇到了类似的问题,多播组加入得很好,但没有收到消息。
我们检查了路由器上的 igmp 设置,看起来一切正常。
最后,我们从使用 IPv6 多播地址切换到 IPv4,并解决了该特定系统的问题。