IPv6에서 ARP는 IPv6 Solicited Node Multicast임.
위 사진을 보면 타 네트워크 (Router A)에서 Router B의 한 호스트로 ping을 할 때 2001:DB8::AB:2
에 ping을 한다.
Router B는 2001:DB8::/64
가 인터페이스에 할당되어 있으므로 자신의 네트워크로 식별하기 때문에 L2 통신 (MAC)을 해야한다. 그러나 IPv6 에서는 ARP 도 브로드캐스트도 존재하지 않는다. MAC 주소를 어떻게 가져와야 할까?
IPv6 에서도 All-node Multicast (FF02::1
) 라고 사실상의 브로드캐스트가 있긴 하지만 IPv6 체계에서는 기본 64bit 크기의 호스트 비트를 채택하고 있기 때문에 하나의 네트워크의 호스트가 무수히 많아진다. 그래서 네트워크 전체에 브로드캐스트를 하지 않기 위해 또 하나의 영역이 제한된 멀티캐스트를 만들게 되었다고 추측한다. (멀티캐스트 주소를 보면 왜 제한된 영역인지 알 수 있다.)
모든 IPv6 Unicast Address가 참여해야만 하는 Multicast Address는 다음과 같다.
IPv6 유니캐스트 주소 : 2001:1:1:1::1234:5678
IPv6 Solicited Node Multicast Group : FF02::1:FF34:5678
IPv6 Multicast MAC Address : 33-FF-FF-34-56-78
IPv6 유니캐스트 활성화 장치는 멀티캐스트 그룹에 무조건 가입해야한다.
2001:ABC:1 장치는 FF02::1 및, FF01::1, FF02::1:FF00:0001 에 가입하게 될 것이고,
2001:ABC:2 장치는 FF02::1 및, FF01::1, FF02::1:FF00:0002 에 가입하게 될 것이다.
IPv6 네트워크에서 같은 네트워크 주소와의 통신하는 경우 L2 (MAC)주소를 얻어야 장치간 통신이 가능하다. 유니캐스트 주소로 상대 MAC주소를 얻기 위해서 ICMPv6 135 Neighbor Soliciation을 사용해서 묻는다.
유니캐스트 주소가 FD33::5CE1:E0FF:FE43:A213 이 있으면 Multicast 그룹 FF02::1:FF43:A213 및 IPv6 Multicast MAC (33-33-FF-43-A2-13) 으로 ICMPv6 를 보낸다.
C:\Users\J>netsh interface ipv6 show joins
Scope References Last Address
---------- ---------- ---- ---------------------------------
0 0 Yes ff01::1
0 0 Yes ff02::1
0 1 Yes ff02::c
0 2 Yes ff02::fb
0 1 Yes ff02::1:3
0 1 Yes ff02::1:ff9b:35d6
0 2 Yes ff02::1:fff3:647a
[root@localhost ~]# ip maddr show
OMITTED
....
link 33:33:ff:43:a2:13
link 33:33:ff:00:00:01
inet 224.0.0.1
inet6 ff02::1:ff00:1
inet6 ff02::1:ff43:a213 users 2
inet6 ff02::2 users 2
inet6 ff02::1
inet6 ff01::1
자신이 FF02::1:FF43:A213 그룹에 가입되었다면 IP 패킷까지 확인한 뒤 ICMPv6 패킷에 실린 target Address가 본인의 주소가 맞으면 본인의 MAC주소를 유니캐스트 주소로 돌려줄 것이다 (ICMPv6 136 Neighbor Advertisement) 그룹에 가입되어있지 않다면 L2 Multicast부터 frame을 버려서 IP 프로토콜에서 불필요한 트래픽을 받지 않거나 무시할 수 있다. 그렇기에 IPv6에서는 ICMPv6을 차단하면 MAC주소를 얻을 수 없기 때문에 통신이 되질 않는다.
IPv6 은 기본적으로 SLAAC라고 라우터가 prefix (네트워크 주소)만 알려 나머지 호스트/인터페이스 주소를 호스트가 선정할 수 있도록 제공한다. 호스트가 맘대로 선정할 수 있다면, 264–x 의 확률로 주소가 중복될 수 있다. 중복된 IP를 피하기 위해서 Node Solicitation을 사용한다.
Host A : 2001:330::A111 – FF02::1:FF00:A111
Host B : 2001:330::A222 – FF02::1:FF00:A222
두 호스트가 네트워크에 존재했다고 가정한다.
Host C가 랜덤(!)으로 2001:330::A222 를 선정하게 되었다. 그러면 Host B와 Host C는 IP가 중복되어 네트워크를 사용할 수 없게된다.
이 때에도 마찬가지로 Host C는 IP를 할당하기 전에 FF02::1:FF00:A222 주소에 Node Solicitation을 보낸 뒤 응답이 없으면 IP가 중복되지 않는다는 것으로 간주한 뒤 해당 IP를 사용하게 된다.
기본적으로 멀티캐스트 주소는 스위치(L2) 장비가 IGMP Snooping (IPv6에서는 MLD Snooping)을 하지 않으면 모든 멀티캐스트 트래픽을 브로드캐스팅 해버린다.
물론 스누핑 환경을 갖추면 IPv4 에서는 UDP multicast membership join 패킷을, IPv6 에서는 ICMPv6 Multicast Listener Query/Report Message를 스누핑한다. IPv6 에서 Solicited Node multicast는 Listener Query/Report 메시지가 발생하지 않는다.