Linux IPv4 스택에서 UDP 멀티캐스트 청취 소켓이 유니캐스트 패킷을 수신할 수 있습니까? 또는 UDP 유니캐스트 소켓이 멀티캐스트 패킷을 수신할 수 있습니까?

Linux IPv4 스택에서 UDP 멀티캐스트 청취 소켓이 유니캐스트 패킷을 수신할 수 있습니까? 또는 UDP 유니캐스트 소켓이 멀티캐스트 패킷을 수신할 수 있습니까?

제가 이해한 바에 따르면, 소켓이 로컬 주소에 바인딩되지 않은(또는 바인딩된 INADDR_ANY) 경우 원격 주소/포트 설정을 호출하지 않거나connect()

  1. 인터페이스가 하나인 컴퓨터에서 기본 IP 주소는 IP_ADDR입니다.
  2. 소켓 A는 UDP 멀티캐스트 주소 MULTICAST_IP_A를 수신하며 포트 번호는 PORT_A입니다.
  3. 소켓 B는 PORT_B에서 UDP 유니캐스트를 수신합니다.

그러면 다음 진술이 맞나요?

  1. 그룹 주소 MULTICAST_IP_A(포트 번호 PORT_B)로 전송된 멀티캐스트 패킷은 소켓 B로 전달됩니다.
  2. IP_ADDR:PORT_A로 전송된 유니캐스트 패킷은 소켓 A로 전달됩니다.

Linux IPv4 소스 코드를 살펴본 결과 지금까지 위의 두 가지 시나리오가 발생하는 것 같습니다. 예를 들면 다음과 같습니다.__udp_is_mcast_sock()true비어 있어도 반환됩니다 inet->mc_list.inet_create()inet->mc_all하지만 저는 전문가 가 1아니며 누군가가 이러한 주장을 확인/무효화하고 일부 코드 포인터를 제공하는 것을 듣고 싶습니다. 감사해요!

답변1

로컬 주소가 멀티캐스트가 아닌 경우 udp_is_mcast_sock()는 false를 반환합니다(참조).ip_mc_sf_allow).

두 질문 모두에 대해 이 기사가 도움이 될 수 있습니다.멀티캐스트(UDP) 소켓을 바인딩한다는 것은 무엇을 의미합니까?

사례 1의 경우.

  • 멀티캐스트 패킷은 그룹 주소 MULTICAST_IP_A로 전송되며 포트 번호는 PORT_B입니다.~하지 않을 것이다소켓 B로 전송됨

사례 2의 경우.

  • IP_ADDR:PORT_A로 전송된 유니캐스트 패킷~ 할 것이다소켓 A로 전달됩니다. UDP 멀티캐스트 소켓은 0.0.0.0에 바인딩됩니다. 이것이 바로 그 이유입니다. netstat -aun이미 포트 5353(avahi/mdns)에 서버가 있을 수도 있지만 서버를 가동하여 확인할 수 있습니다 .

Python 멀티캐스트 클라이언트/서버 프로그램을 사용하여 이 사례와 다른 사례를 확인할 수 있습니다.이 게시물. 유니캐스트 클라이언트/서버 동작을 시뮬레이션하려면 nc(netcat)을 사용할 수 있습니다 .

관련 정보