커널의 모든 멀티캐스트 관련 코드는 ipmr.c(net/ipv4/ipmr.c) 및 mroute.h(포함/linux/mroute.h)의 두 파일에 있습니다. 코드를 살펴보기 전에 다른 두 파일(/proc/net/ip_mr_vif 및 /proc/net/ip_mr_cache)을 언급하는 것이 중요합니다. 나중에 볼 수 있듯이 이 두 파일은 멀티캐스트 라우터의 현재 상태를 이해하는 데 특히 유용합니다. ip_mr_vif 파일은 멀티캐스트 작업에 관련된 모든 가상 인터페이스를 나열하고 ip_mr_cache는 MFC의 상태를 정확히 나타냅니다. 리소스 부족으로 인해 오류가 발생하면 중단 메커니즘이 호출되고 모든 MFC 항목이 하드웨어에서 제거되고 대신 커널에 의해 라우팅이 수행됩니다. 이제 MFC에 새 항목을 추가하라는 요청을 받을 때 커널이 수행하는 작업을 살펴보겠습니다. 형식 요청은 ipmr_mfc_add() 함수에 의해 처리됩니다. 커널은 MFC의 현재 항목을 검색하여 업데이트 요청인지 여부를 확인합니다. 일치하는 항목이 발견되면 새 TTL의 값이 기존 mfc_cache 구조로 복사되고 minvif 및 maxvif 값도 업데이트됩니다. 이 값은 특정 멀티캐스트 주소에 대한 모든 출력 인터페이스의 최소 및 최대 인덱스 값을 나타냅니다.
이 작업을 수행하는 함수는 ipmr_update_thresholds()입니다. 사용자의 편의를 위해 리스팅 3에 표시된 함수를 포함하면 최소 및 최대 필드의 의미를 더 잘 설명하므로 이 함수를 포함합니다. 멀티캐스트 라우팅의 기본 데이터 구조를 살펴보았으니 이제 커널에 의해 어떻게 조작되는지 살펴보겠습니다. 모든 함수는 ipmr.c의 단일 파일로 구현됩니다. 이 파일의 코드는 라우팅 프로토콜 자체를 구현하지 않습니다. ipmr.c에서 찾을 수 있는 함수는 멀티캐스트 라우팅 다이몬(PIMd)에서 이러한 데이터 구조를 관리하는 데 사용됩니다. 간단히 말해서 PIMd가 경로를 추가하거나 삭제할 때라고 결정할 때마다 수행해야 할 작업을 지정하는 메시지를 커널에 보내는 것입니다. 이를 위해서는 PIMd가 IGMP 패킷을 수신할 수 있어야 합니다. 이러한 커널에 의해 사용자 공간으로 전달됩니다. PIMd는 ioctls 사용 및 setockopt() 시스템 호출을 통해 두 가지 방법으로 커널에 통신합니다. vif 및 mfc 테이블은 모두 setockopt() 시스템 호출을 사용하여 처리됩니다.
하나 이상의 멀티캐스트 그룹에 가입하면 IP_DROP_MEMBERSHIP 옵션을 사용하여 특정 그룹을 탈퇴합니다. 다시 말하지만, 구조체 ip_mreq 구조는 입력 매개 변수입니다. 드롭할 로컬 인터페이스 및 멀티캐스트 그룹은 구조의 인수입니다. 예를 들어 방금 본 코드 샘플을 보면 이전에 조인한 멀티캐스트 그룹이 삭제됩니다. 멀티캐스트는 모든 네트워크 세그먼트를 통해 전송됩니다. 우리는 특정 인터페이스에 서버를 바인딩하지 않습니다,하지만 우리는 특정 인터페이스에 멀티 캐스트 그룹 (IP_MULTICAST_JOIN)에 가입 기본적으로, IGMP 프록시 업스트림 인터페이스는 IGMPv3 회원 보고서를 보내고 어떤 IGMP 버전 업스트림을 감지합니다 장치(예: 멀티캐스트 라우터)는 수신된 쿼리를 기반으로 사용됩니다. IGMPv1/v2 쿼리가 수신되면 업스트림 포트가 IGMP 버전으로 대체됩니다. IGMPv1/v2 쿼리기 현재 타이머(400s)가 만료되면 IGMPv3로 다시 변환됩니다.