본문 바로가기

자료실/기타잡다지식

IPv6 표기법

----------------------------------------------------------------------------------------------------

RFC3513 Internet Protocol Version 6(IPv6) Addressing Architecture

<http://www.zvon.org/tmRFC/RFC3513/Output/index.html>


[RFC3513] Internet Protocol Version 6 (IPv6) Addressing Architecture

2. IPv6 Addressing

2.2. Text Representation of Addresses

   There are three conventional forms for representing IPv6 addresses as
   text strings:

   1. The preferred form is x:x:x:x:x:x:x:x, where the 'x's are the
      hexadecimal values of the eight 16-bit pieces of the address.

      Examples:

         FEDC:BA98:7654:3210:FEDC:BA98:7654:3210

         1080:0:0:0:8:800:200C:417A

      Note that it is not necessary to write the leading zeros in an
      individual field, but there must be at least one numeral in every
      field (except for the case described in 2.).

   2. Due to some methods of allocating certain styles of IPv6
      addresses, it will be common for addresses to contain long strings
      of zero bits.  In order to make writing addresses containing zero
      bits easier a special syntax is available to compress the zeros.

      The use of "::" indicates one or more groups of 16 bits of zeros.
      The "::" can only appear once in an address.  The "::" can also be
      used to compress leading or trailing zeros in an address.

      For example, the following addresses:

         1080:0:0:0:8:800:200C:417A  a unicast address
         FF01:0:0:0:0:0:0:101        a multicast address
         0:0:0:0:0:0:0:1             the loopback address
         0:0:0:0:0:0:0:0             the unspecified addresses

      may be represented as:

         1080::8:800:200C:417A       a unicast address
         FF01::101                   a multicast address
         ::1                         the loopback address
         ::                          the unspecified addresses

   3. An alternative form that is sometimes more convenient when dealing
      with a mixed environment of IPv4 and IPv6 nodes is
      x:x:x:x:x:x:d.d.d.d, where the 'x's are the hexadecimal values of
      the six high-order 16-bit pieces of the address, and the 'd's are
      the decimal values of the four low-order 8-bit pieces of the
      address (standard IPv4 representation).  Examples:

         0:0:0:0:0:0:13.1.68.3

         0:0:0:0:0:FFFF:129.144.52.38

      or in compressed form:

         ::13.1.68.3

         ::FFFF:129.144.52.38

----------------------------------------------------------------------------------------------------

 

IPv6 주소는 128 bit의 크기를 가진다.

이는 IPv6 헤더의 주소 필드가 128 bit의 데이터 필드로 정의된 것에서 연유한다.

그러나 이 긴 IPv6 주소를 어떻게 표기할 것인가?

 

IPv4 주소의 경우에는 32bit의 크기를 갖는다. 이 주소는 8bit로 구분하여 4개의 byte로 표시할 수 있다.

따라서 IPv4 주소의 경우는 텍스트 표기 방식으로 ddd.ddd.ddd.ddd로 표기하는 것으로 정해졌다.

ddd는 0~255의 범위를 갖는 10진수를 사용한다.

192.0.2.100의 IPv4 주소는 사실상 네트워크 상에서는 IPv4 헤더의 주소 필드에 '11000000000000000000001001100100'으로 지정된다. 이것은 2진법으로 표현된 것이다.

 

IPv6 주소 필드는 128bit의 크기를 가진다.

상당히 큰 길이다. 이러한 긴 주소를 간단히 표기하기 위해 IPv6 주소는 16진수 단위로 표기한다.

그러나 16진수표기는 사람이 처리하기에는 상당히 불편하다. 그러나 10진수로 표기한다면 그 또한 너무나 복잡해 진다. 할 수 없다. 보다 많은 IP 주소를 확보하기 위해서는 할 수 없다.

IPv6 주소는 '2001:1234:5678:9abcd:ef01:2345:6789:abdc'와 같이 16진수로 표기된다.

이 주소를 일일이 외울 수 있을까?

telnet 2001:1234:5678:9abcd:ef01:2345:6789:abdc

위와 같이 명령어를 입력하는 것은 이제 거의 불가능할 것으로 보인다.

이와 같은 이유에 근거하여 IPv6 환경에서는 DNS가 보다 더 중요해 질 것으로 여겨진다.

telnet 2001:1234:5678:9abcd:ef01:2345:6789:abdc

이렇게 명령어를 쓰는 것보다는

telnet telnet.example.com.

이렇게 명령어를 사용하는 것이 보다 인간적(?)이다.

 

다시 원래의 주제로 돌아가 IPv6 주소 표기법을 알아본다.

 

IPv6 주소를 텍스트 표기 형식으로써

'2001:1234:5678:9abcd:ef01:2345:6789:abdc'

와 같이 표기하는 것이 정상적이다.

그러나

'2001:0001:0002:0003:0004:0005:0006:abdc'

와 같은 경우에 위와 같이 '0'으로 표기된 주소영역을 모두 표기하는 것은 무의미해 보인다.

이를

'2001:1:2:3:4:5:6:abdc'

 으로 표기할 수 있게 허용(?) 한다. '연속된 0'을 생략하는 것이다.

그렇다면

'2001:0000:0000:0000:0000:0000:0000:abdc'

의 경우는?

'2001::abdc'

으로 표기하는 것이 가능하다.

 

역시 '연속된 0'을 생략할 수 있다.

그러나 주의해야 하는 경우가 있다.

'2001:0001:0000:0003:0000:0005:0000:abdc'

와 같은 경우에

'2001:1::3::5::abdc'

와 같이 표기할 수는 없다!

'연속된 0'을 생략할 수 있다. 그러나 하나의 주소 표기 문자열 중에 2번 '연속된 0'을 생략할 수는 없다. 이는 '::'에 의한 생략의 경우에 해당한다.

위와 같은 경우에는

'2001:1::3:0:5:0:abdc', 또는

'2001:1:0:3::5:0:abdc', 또는

'2001:1:0:3:0:5::abdc'

중의 하나의 표기를 선택해야 한다.

만일 IPv6 주소가

'0000:0000:0000:0000:0000:0000:0000:abdc'

이라면? --> '::abcd'가 된다.

'0000:0000:0000:0000:0000:0000:0000:0001' (IPv6 loopback address)

이라면? --> '::1'이 된다.

'0000:0000:0000:0000:0000:0000:0000:0000' (IPv6 unspecified address)

이라면? --> '::'이 된다.

 

이외에 특별한 표기법 하나를 허용한다.

'2001:0001:0000:0003:192.0.2.101'

과 같은 형태이다.

'2001:1::3:192.0.2.101'과 같이 표기된다.

 

이와 같은 표기는 끝의 32 bit 또는 4 바이트의 주소 부분이 IPv4 주소인 경우이다.

표준에서는 'x:x:x:x:x:x:d.d.d.d'로 표기됨을 유의해야 한다.  

맨 끝 IPv6 주소의 4 바이트에 해당하는 부분에 대한 ddd.ddd.ddd.ddd의 IPv4 주소 표기법을 허용한다.

 

왜 이런 표기법을 정의하는 것인가?

그것은 IPv6 전환기술 중 일부 IPv6-in-IPv4 터널링 방식에서 사용하는 IPv6 주소를 위한 것이다. (자세한 소개는 후에...)

또는 호스트에서 IPv4 주소를 IPv6 주소필드에 표현해야 하는 경우에 사용해야 하기 때문이다.

(왜 IPv4 주소를 IPv6 주소필드에 표기해야 하나? --> 역시 그 필요성을 후에 설명한다.)

 

IPv6 전환기술 중  자동터널링 방식 중에 'IPv4-compatible' 터널링 방식이 있다.

이 방식에서는 특수한 IPv6 주소영역을 사용하는데, 그 형식은 '0:0:0:0:0:0:ddd.ddd.ddd.ddd'이다.

이 경우 'ddd.dd.ddd.ddd'는 IPv4 주소이다.

이 경우의 예로써

'::192.0.2.200'과 형태가 된다.

이외에 IPv4 주소를 IPv6 주소 필드에 표기하는 경우는

'0000:0000:0000:0000:0000:FFFF:ddd.ddd.ddd.ddd'

와 같이 표기한다. 그 간략한 표기로는 '::FFFF:ddd.ddd.ddd.ddd'가 된다.

'::FFFF:192.0.2.200' 은

IPv4 주소 '192.0.2.200'의 IPv6 주소 필드에 표기되어야 할 때의 IPv6 형식의 표기이다.

 

이렇게 보다보면 왜?

왜? 이렇게 표기방식을 외워야 하는가? IPv4 주소의 경우는 단일하게 표기하는데, 왜 IPv6 주소 표기는 이렇게 복잡하며, 이렇게 꼭 그 표기법을 지켜야 하나?

이런 의문이 들 수 있다.

물론 단순히 표기를 위한 것이라면 안 지켜도 된다. -->라고 생각할지도 모른다. !!

그러나!!!!

그렇지 않다. 반드시 지켜야 한다.

 

그 이유는 네트워크 통신에 사용하는 함수들은 이러한 표준 표기법에 따라 IP 주소를 인식하는 알고리듬을 마련하기 때문이다.

IPv4의 경우에 사용하던 텍스트 문자열 형식의 IPv4 주소를 네트워크 헤더 필드의 IPv4 주소형식으로 변환하는 함수는 'inet_aton()'과 같은 함수이다.

IPv6 주소 문자열을 네트워크 헤더 필드의 IPv6 주소 데이터로 변환하는 함수는 'inet_pton()'이다.

문제는 이 'inet_pton()' 함수가 유효한 IPv6 텍스트 문자열 주소로 인식하는 형식은 위의 표준 표기법에 의해 표기된 IPv6 주소만이다. 그 외의 표기형태는 에러를 유발하거나 엉뚱한 네트워크 IPv6 헤더의 주소 필드 값을 산출한다.

 

반드시! 프로그램 코드를 작성하는데 있어서 위의 표준 표기법을 지켜야 한다...

그리고 또 하나!

DNS 네임서버의 zone 파일에 IPv6 주소를 표기할 때, 위의 표기법을 정확히 지켜야 한다.

그렇지 않으면 심각한 오류를 발생시킬 수 있다.

그리고 일반 어플리케이션 프로그램을 사용할 때도 이 표기법을 준수해야 한다. 이는 이 프로그램들이 'inet_pton()' 함수를 호출하여 사용자가 입력한 IPv6 주소를 인식하기 때문이다.

따라서

telnet 2001::2::3:100

과 같이 입력한 경우, telnet은 에러를 일으키거나 엉뚱한 IPv6 호스트로 접속을 시도하게 된다.

 

IPv6의 주소에 대한 텍스트 문자열 형태의 표기에 있어 그 표기 원칙을 반드시 지켜야 안전한 통신이 이루어 질 수 있다.

IPv6 주소 표기규정을 가볍게 보지는 말아야 한다.