组播UDP不起作用


11

树莓派上的多播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  E.....@....f....
    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  

您能否在2台主机上提供netstat -gn的输出?
UnX 2014年

Answers:


13

我了解您的主机192.168.2.7正在将多播数据包发送到端口9131上的组239.255.250.250

注意:但是,我认为服务器正在侦听端口9131。您未​​提供有关此信息。

从ifconfig输出中,我可以看到已启用MULTICAST,并且tcpdump确认了这一点。

首先,请确保运行服务器的主机(接收多播数据包的主机)已加入多播组。

在每个服务器主机上,输入:

netstat -gn

如果看到您的多播地址,则该组播地址已加入该组。如果不是,则服务器程序或内核设置有问题。

如果服务器已加入该组,但是您没有看到来自客户端的任何数据包,则在路由器上检查是否已启用igmp(路由器必须具有igmp功能)

例如,在Cisco路由器上

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代码示例:

/programming/603852/multicast-in-python

注意:我在debian raspi上使用了此脚本(不是树莓派和服务器通过路由器收到的数据包-如上面的设置-很好)

Linux指南:http//stlinux.com/howto/network/short-guide

思科:http : //www.cisco.com/c/en/us/td/docs/switches/lan/catalyst3750/software/release/12-2_52_se/configuration/guide/3750scg/swmcast.html#wp1024278


答案很长,最微小的部分实际上是问题所在。您已经提到了有关故障排除的内容,但是我已经发布了。在服务器和客户端上,一切看起来都很不错。路由器上的IGMP是问题所在,但该设置已隐藏
2014年

2
您的描述不够清晰,无法给出直接的答案,所以我想我可以写一个小型的故障排除指南。
UnX

1

我注意到这也可能是硬件和/或驱动程序问题。我在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无线适配器


也可以使用:这款ID为0b05:1791的ASUS记忆棒ASUSTek Computer,Inc. WL-167G v3 802.11n适配器[Realtek RTL8188SU]
Michael

0

我遇到了类似的问题,即将数据包传入,我可以看到它们,tcpdump但是没有程序可以接收数据。

在这种情况下的问题是,我曾经iptables只允许来自本地子网的流量,192.168.0.0/24但是多播当然来自该本地子网224.0.0.0/4。我没有打开整个子网(然后可能也没有防火墙),而只是允许来自我用于多播的特定UDP端口上的所有主机的流量,因此可以解决此问题。


0

对于我们来说,我们有一个类似的问题,即多播组可以很好地加入,但是没有收到消息。

我们检查了路由器上的igmp设置,这似乎是正常的。

最后,我们从使用IPv6多播地址切换到IPv4,并为该特定系统解决了该问题。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.