组播 UDP 不起作用

Ale*_*lex 12 networking python multicast udp

树莓派上的组播 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)
Run Code Online (Sandbox Code Playgroud)

应用程序运行时 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
Run Code Online (Sandbox Code Playgroud)

程序运行时 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  
Run Code Online (Sandbox Code Playgroud)

UnX*_*UnX 13

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

注意:然而,我假设服务器正在侦听端口 9131。您没有提供任何有关此的信息。

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

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

在每个服务器主机类型上:

netstat -gn
Run Code Online (Sandbox Code Playgroud)

如果您看到您的多播地址,则它已加入该组。如果没有,那么您的服务器程序或内核设置可能有问题。

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

例如,在 cisco 路由器上

enable
conf t
ip multicast-routing
For each interface involved.
int <NIC>
ip pim sparse-dense-mode
Run Code Online (Sandbox Code Playgroud)

如果在路由器上启用了 igmp,请查找调试功能以跟踪数据包。

在服务器端,开始抓包:

tcpdump -i <NIC> host 239.255.250.250
Run Code Online (Sandbox Code Playgroud)

如果您没有看到任何数据包进入,则不会转发多播数据包(假设

然后在客户端发送一个多播数据包(使用下面链接中的脚本进行故障排除)

注意:UDP 数据包似乎格式错误,因此不确定服务器是否能够读取它。您可以使用下面链接中的脚本来确认 tcpdump 中的消息是否显示为格式错误(在我的情况下不是这样)

使用多播的python代码示例:

/sf/ask/42269671/

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

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

  • 您的描述不够清楚,无法直接回答,所以我想我可以编写一个小型故障排除指南。 (2认同)