라이브러리
프로그래밍언어, 각종코드, 관련동향, 논문 등의 저장소
IPv6 어플리케이션은 IPv4와 IPv6 주소 중에서 어느 것으로 접속을 하나요?

도메인네임이 IPv4 주소(A RR)와 IPv6 주소(AAAA RR)를 모두 갖고 있는 경우
IPv4 인터넷에서는 도메인 네임이 갖는 IP 주소는 IPv4 주소 한 종류 뿐이었습니다.
그러나 이제 IPv6 인터넷이 도입되면서, 하나의 도메인네임이 IPv4 주소와 IPv6 주소 모두를
갖는 경우가 발생하게 됩니다.
예를 들어 아래와 같은 경우,
"examp.co.kr" 도메인 설정 내용
ftp.examp.co.kr.  1800  IN  A    192.0.2.200ftp.examp.co.kr.  1800  IN  AAAA 2001:dc5:f::200
단말 호스트의 IPv6 어플리케이션은 getaddrinfo() 함수 호출의 결과로ftp.examp.co.kr.
도메인네임에 대해 "192.0.2.200" IPv4 주소와 "2001:dc5:f::200"의 2개 주소를 얻게 됩니다.
이 경우, 어플리케이션은 "이 2개의 주소 중 어느 주소를 선택하여 접속을 시도해야 하는가?"
하는 문제가 발생하게 됩니다.
물론 이것은 원칙적으로 어플리케이션을 작성하는 개발자의 선택에 따라 결정될 것입니다.
어플리케이션이 getaddrinfo() 함수로부터 얻은 IP 주소 중 하나를 다시 Socket API에 인자로
전달함으로써 통신이 개시될 수 있기 때문입니다.
이 동작은 프로그래머가 정하여 프로그램 코드를 작성할 수 있습니다.
디폴트 IP 주소 선택 알고리듬 (Default Address Selection)
IETF RFC3484 문서는 이 문제를 다루고 있습니다.
Ref Docs:RFC3484 "Default Address Selection for Internet Protocol version 6 (IPv6)"
일반적으로 어플리케이션은 도메인네임의 IP 주소 변환 함수 gethostbyname() 이나
getaddrinfo()가 리턴하는 IP 주소 목록에서 첫 번째 IP 주소를 선택하여 이 IP 주소로
Socket을 열고 통신을 개시합니다.
이러한 일반 사항을 기반으로 RFC3484는 getaddrinfo() 함수가 도메인네임의 IPv4 주소와
IPv6 주소를 함께 파악한 경우, 일정한 디폴트 알고리듬을 적용하여 어플리케이션으로
리턴하는 IP 주소 목록을 정렬(sort)하여 반환하는 동작을 정의합니다.
getaddrinfo() 함수는 일정한 규칙으로 IP 주소 목록을 반환하여 어플리케이션이
접속 시도하는 IP 주소를 일정하게 제어하는 역할을 하게 됩니다.
접속대상 주소 선택 알고리듬에 사용되는 디폴트 정책 테이블(default poliy table)은
아래와 같습니다.

Prefix

Precedence

Label

비고

::1/128

50

0

IPv6 LoopBack 주소

::/0

40

1

이외의 모든 IPv6 주소

2002::/16

30

2

6to4 IPv6 주소

::/96

20

3

IPv4-compatible IPv6 주소

::ffff:0:0/96

10

4

IPv4-mapped IPv6 주소
IPv4 주소를 의미
Source:RFC3484 "Default Address Selection for Internet Protocol version 6 (IPv6)"
2.1. Policy Table
이 주소 선택 알고리듬의 개략적인 내용은 아래와 같이 정리할 수 있습니다.
1. IPv4 주소와 IPv6 주소가 함께 리스트에 있는 경우, IPv6 주소가 디폴트로 리스트 중
첫 번째 IP 주소로 리턴됩니다.
IPv4 주소(::ffff:0:0/96) 보다 IPv6 주소(::1/128, ::/0, 2002::/16, ::/96)들이
Precedence에서 모두 우선순위가 높습니다.
이에 따라 IPv6 어플리케이션이 getaddrinfo() 함수로부터 반환받는 IP 주소 리스트에
IPv4와 IPv6가 혼재하는 경우, 디폴트 동작으로 그 첫 번째 IP 주소는
IPv6 주소가 됩니다.
결과적으로 IPv6 어플리케이션은 IPv4와 IPv6 주소 모두 가진 도메인네임에 대해서는
IPv6를 먼저 접속 시도 주소로 선택하는 동작을 하게 됩니다.
2. IPv6 주소가 다수 존재하는 경우, IPv6 루프백(loopback) 주소, 일반적인 IPv6 주소,
6to4 IPv6 주소, IPv4-compatible IPv6 주소의 순으로 정렬(sort)하여 리턴합니다.
IPv6 주소 "2001:dc5:f::200"와 IPv6 주소 "2002:c000:02c8::c000:02c8"가 도메인네임에
함께 지정되어 있는 경우, APNIC을 통해 할당된 native IPv6 주소 "2001:dc5:f::200"가
6to4 tunnelling 방식의 자동생성된 6to4 IPv6 주소 "2002:c000:02c8::c000:02c8"보다
우선하게 됩니다.
곧 어플리케이션은 native IPv6 주소와 6to4 IPv6 주소가 있는 경우, native IPv6 주소로
먼저 접속시도하게 됩니다.
NOTE!: DNS의 IPv6 주소 설정오류가 야기하는 어플리케이션의 접속 시간 지연 문제
일반적으로 어플리케이션은 getaddrinfo() 등의 함수로부터 리턴받은 IP 주소 목록 중
첫 번째 IP 주소로 접속을 시도한 후 접속에 실패하면 다음의 IP 주소를 사용하여 접속을
시도합니다.
따라서 IPv4와 IPv6 주소가 하나씩 있는 경우, IPv6 주소로 먼저 접속을 시도하고, 이에
실패하게 되면, IPv4 주소로 접속을 시도합니다.
만일 DNS의 특정 도메인네임에 존재하지 않는 IPv6 주소가 설정되어 있는 경우,
어플리케이션에서는 접속시도와 그 timeout에 따르는 시간지연이 발생한 후 IPv4 주소로
접속이 성공함으로써, 사용자는 접속이 느린 현상을 경험하게 됩니다.
위에서 정리된 디폴트 주소 선택 알고리듬 내용은 개략적인 것으로 이외에 시스템 환경조건에
의한 주소 선택 및 정렬 알고리듬을 RFC3484 문서에서 정의하고 있습니다.
주의할 점은 RFC3484에서 정의한 주소선택 알고리듬은 디폴트 알고리듬일 뿐이며
어플리케이션에서 별도의 선택 알고리듬을 사용하여 특정한 주소 선택을 하거나,
디폴트 주소 선택 정책 테이블의 내용을 변경하는 경우, 선택 방식이 변경될 수 있다는
사실입니다.
Windows 2003 서버의 경우, 아래와 같이 default policy table 내용을 볼 수 있으며,
이 테이블에서 각 필드 값을 변경하여 getaddrinfo() 함수의 정렬 순서를 변경할 수
있습니다.
C:>netsh interface ipv6 show prefixpolicyQuerying active state... Precedence  Label  Prefix----------  -----  --------------------------------        10      4  ::ffff:0:0/96        20      3  ::/96        30      2  2002::/16        40      1  ::/0        50      0  ::1/128
 
  Comments,     Trackbacks