Raspberry Pi의 멀티캐스트 UDP
내 문제가 Debian, 특히 Raspbian으로 인한 것인지, 아니면 뭔가 완전히 빠진 것인지 알 수 있을 만큼 범위를 좁히지 못했습니다.
멀티캐스트 UDP를 사용하여 내 응용 프로그램이 실행 중이고 특정 IP 주소에서 사용할 수 있음을 네트워크의 다른 장치에 알리는 Python 응용 프로그램이 있습니다.
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를 지원해야 함)
예를 들어 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이 아니라 서버는 위에서 설정한 대로 라우터를 통해 패킷을 수신합니다).
답변2
하드웨어 및/또는 드라이버 문제일 수도 있다는 것을 알았습니다. C, Java 및/또는 Python 프로그램을 사용하여 아무런 문제 없이 raspberryPI에서 멀티캐스트 UDP(전송 및 수신)를 사용하고 있습니다.
그러나 방금 UDP 멀티캐스트 수신이 EDIMAX의 작은 USB 나노 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로 전환하여 특정 시스템의 문제를 해결했습니다.