Linux 커널은 연결 시 "IGMP 재조인"을 수행해야 합니까?

Linux 커널은 연결 시 "IGMP 재조인"을 수행해야 합니까?

이 질문은 이전에 발견된 답변되지 않은 질문과 거의 동일합니다.여기커널의 메일링 리스트에 있습니다(Simon Paillard에게 제공). 다음은 (의역된) 요약입니다.

Linux 커널을 실행하는 호스트가 IGMP 스누핑이 활성화된 스위치에 연결되면 다음과 같은 시나리오가 발생합니다.

  • 인터페이스는 멀티캐스트 그룹의 구성원입니다. (조인) 보고서가 수행됩니다.
  • 링크 장애가 발생했습니다(예: 케이블 연결 끊김).
  • 스위치는 해당 포트의 멀티캐스트 멤버십을 플러시합니다.
  • 링크가 다시 나타납니다(예: 케이블이 다시 연결됨).
  • 이 시점에서 커널은 새로운 IGMP 가입 멤버십 요청을 보내기 전에 스위치의 쿼리를 기다립니다.
  • 이는 링크가 다시 시작되는 시간과 중첩 예약된 일반 쿼리(RFC의 기본값: 125초) 사이에 애플리케이션이 패킷을 놓친다는 것을 의미합니다.

이는 Linux 커널이 재연결 후 조인 재전송을 처리하지 않음을 나타내는 것 같습니다. IGMP 사양에 대해 좀 더 자세히 알고 있는 사람이라면 누구나 재연결 시 재조인이 재전송되어야 하는지 확인할 수 있습니까?

링크 실패를 확인하고 다시 연결될 때 스위치에 대한 가입 요청을 다시 발행하는 것이 사용자 수준 애플리케이션의 작업입니까?

흥미롭게도 Windows 커널은 링크가 다운된 후 다시 연결될 때 조인 요청을 다시 보내는 것을 처리하는 것 같습니다.

답변1

논리적으로는 그렇다고 생각합니다. Linux IPv6 코드에서 볼 수 있기 때문입니다. 그리고RFCIPv6 MLD 스누핑은 IPv4 IGMP 스누핑과 매우 유사하다고 합니다.

실제로 이 addrconf 코드는 커널이 DAD 및 RS/RA를 지원하는 ipv6용으로 추가되었습니다. 현재 커널 버전에 ipv4에 해당하는 기능이 없다고 해도 놀라지 않을 것입니다.

    } else if (event == NETDEV_CHANGE) {
        if (!addrconf_link_ready(dev)) {
            /* device is still not ready. */
            rt6_sync_down_dev(dev, event);
            break;
        }

        if (!IS_ERR_OR_NULL(idev)) {
            if (idev->if_flags & IF_READY) {
                /* device is already configured -
                 * but resend MLD reports, we might
                 * have roamed and need to update
                 * multicast snooping switches
                 */
                ipv6_mc_up(idev);
                change_info = ptr;
                if (change_info->flags_changed & IFF_NOARP)
                    addrconf_dad_run(idev, true);
                rt6_sync_up(dev, RTNH_F_LINKDOWN);
                break;
            }
            idev->if_flags |= IF_READY;
        }

        pr_info("ADDRCONF(NETDEV_CHANGE): %s: link becomes ready\n",
            dev->name);

https://elixir.bootlin.com/linux/v5.1/source/net/ipv6/addrconf.c#L3546

관련 정보