多播 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)
應用程序執行時 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
我了解到您的主機 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 程式碼範例:
https://stackoverflow.com/questions/603852/multicast-in-python
注意:我在 debian raspi 上使用了這個腳本(不是 raspbian,伺服器通過路由器接收數據包 - 如上所述 - 很好)