내 LAN에 연결된 전류 측정 장치에서 멀티캐스트 업데이트를 받기 위한 애플리케이션을 작성 중입니다. 장치는 몇 분마다 멀티캐스트 그룹 224.192.32.19:22600에 패킷을 전송하며 호스트 중 하나(라즈베리 파이)에서 패킷을 잘 읽을 수 있습니다.
이상한 점은 두 번째 리스너 호스트를 추가하려고 할 때 인터페이스에서 해당 그룹의 멀티캐스트 트래픽을 찾을 수 없다는 것입니다.
모든 네트워크는 동일한 192.168.xx 서브넷 아래의 동일한 물리적 위치에 있습니다. 발신자와 수신자 사이에는 DD-WRT를 실행하는 2개의 TP-Link WDR3600 라우터와 "멍청한" TP-Link 8포트 기가비트 스위치(포트 확장기로 사용됨)가 있습니다. 모든 것은 이더넷을 통해 연결됩니다.
자세한 내용:
- "NOK" 호스트에는 Windows 7 노트북, 동일한 노트북에 연결된 Linux VM 및 다른 Linux 노트북이 포함됩니다.
- "NOK" 호스트를 "OK" 호스트가 있는 덤 스위치에 직접 연결하면 아무런 효과가 없습니다.
- 보조 라우터(소스에 더 가까운 이더넷 "홉" 1개)에 직접 연결하면 효과가 없습니다.
작업 중인 호스트를 포함하여 모든 호스트에서 해당 그룹에 대한 IGMP 트래픽을 찾을 수 없습니다.224.0.0.22
IGMP에 대한 네트워크 트래픽을 스누핑하면 내 애플리케이션이 시작될 때 2개의 조인 요청이 나가는 것을 볼 수 있습니다 .
그룹 멤버십은 커널에 의해 등록되고 다음으로 표시됩니다.
~ $ netstat -ng
IPv6/IPv4 Group Memberships
Interface RefCnt Group
--------------- ------ ---------------------
lo 1 224.0.0.1
eth0 1 224.192.32.19
eth0 1 224.0.0.251
eth0 1 224.0.0.1
리스너 애플리케이션에서 소켓을 초기화하는 Python 코드는 다음과 같습니다.
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDP)
sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
sock.bind((self.mcast_group, self.mcast_port))
mreq = struct.pack("4sl", socket.inet_aton(self.mcast_group), socket.INADDR_ANY)
sock.setsockopt(socket.IPPROTO_IP, socket.IP_ADD_MEMBERSHIP, mreq)
내가 여기서 무엇을 놓치고 있는 걸까요? 작업 호스트에서 리스너 애플리케이션을 실행하는 것만으로도 멀티캐스트 트래픽을 수신하기에 충분했는데, 추가 리스너에서는 그렇지 않은 이유는 무엇입니까?
답변1
이는 라우터 문제인 것으로 밝혀졌습니다. 보조 라우터를 다시 시작한 후 모든 호스트가 예상대로 멀티캐스트 패킷을 받기 시작했습니다.
나는 그것이 DD-WRT 버그이거나 멀티캐스트 트래픽 분배를 손상시키는 일부 상태 손상이라고 말하고 싶습니다.