IPv6 생략 규칙: :: 압축과 확장 읽는 법

IPv6 주소 2001:db8:0:0:0:0:0:12001:db8::1로 줄어드는 이유와, 반대로 압축된 주소를 원래의 8개 블록으로 어떻게 되돌려 읽는지가 궁금한 분들을 위한 글입니다.

규칙은 복잡하지 않습니다. 블록 앞자리 0은 생략하고, 연속된 0 블록은 ::로 딱 한 번만 묶으며, 0 블록 구간이 여러 곳이면 그중 가장 긴 구간 하나만 축약 대상이 됩니다. 이 글에서 IPv6 생략 규칙 네 가지를 순서대로 정리합니다.

요약 ① 각 블록 앞자리의 0은 그냥 생략합니다 (0db8 → db8) ② 연속된 0 블록은 ::로 압축하되, ::는 주소 하나에 단 한 번만 쓸 수 있습니다 ③ 0 블록 구간이 여러 곳이면 그중 '가장 긴' 구간 하나만 축약 대상이 됩니다

왜 헷갈리는가 — 압축형과 확장형이 같이 돌아다닙니다

IPv6 주소를 다루다 보면 같은 주소가 서로 다른 모습으로 나타나는 상황을 자주 만납니다. 서버 로그에는 fe80::1로 찍혀 있는데, 방화벽 설정 파일에는 fe80:0000:0000:0000:0000:0000:0000:0001로 적혀 있는 식입니다.

두 표기가 같은 주소인지 눈으로 바로 판단하기 어렵습니다. 특히 0 블록이 여러 구간에 흩어져 있는 주소를 손으로 줄이려다, 엉뚱한 구간을 압축해 완전히 다른 표기를 적어버리는 실수도 흔합니다.

이 문제는 IPv6 주소가 128비트, 16비트씩 8개 블록으로 이루어져 있어서 표기 자체가 길기 때문에 생깁니다. 표기를 줄이는 규칙과 다시 펴는 규칙을 정확히 알아야 이 혼동이 풀립니다.

도구 없이 손으로 계산하는 법 — IPv6 생략 규칙 네 가지

IPv6 주소 표기 규칙은 IETF 기술 표준 문서에 정리되어 있습니다. 기본 골격은 RFC 4291(IP Version 6 Addressing Architecture)이 정합니다.

0 블록 구간이 여러 곳일 때 어디를 압축할지 같은 세부 기준은 RFC 5952(A Recommendation for IPv6 Address Text Representation)가 보충합니다.

IPv6 주소는 128비트를 16비트씩 8개 블록으로 나누고, 각 블록을 4자리 16진수로 적어 콜론(:)으로 구분합니다. 2001:0db8:0000:0000:0000:0000:0000:0001처럼 8개 블록, 콜론 7개로 이어진 형태가 기본형(Full Expanded)입니다.

규칙 1~2 — 앞자리 0 생략과 :: 압축

규칙 1 — 블록 앞자리 0은 생략합니다. 각 블록 맨 앞의 0들은 그냥 지웁니다. 0db8db8로, 00000 하나만 남습니다. 이 규칙은 ::와 무관하게 항상 적용됩니다.

규칙 2 — 연속된 0 블록은 ::로 묶되, 한 주소에 단 한 번만 씁니다. 블록이 연속으로 0인 구간이 있으면 그 구간 전체를 ::로 대체할 수 있습니다.

다만 ::는 주소 하나에 딱 한 번만 등장해야 합니다. 두 번 쓰면 각 ::가 몇 개의 0 블록을 대신하는지 특정할 수 없어, 원래 8개 블록으로 되돌리는 계산이 불가능해지기 때문입니다.

규칙 3~4 — 0 블록 구간이 여러 곳일 때

규칙 3 — 0 블록 구간이 여러 곳이면 '가장 긴' 구간만 압축합니다. 예를 들어 2001:db8:0:0:1:0:0:1에는 0 블록이 두 곳(34번째, 67번째)에 있고, 길이가 둘 다 2블록으로 같습니다.

RFC 5952는 이렇게 길이가 같으면 앞쪽(왼쪽) 구간을 압축하도록 정합니다. 결과는 2001:db8::1:0:0:1입니다. 만약 두 구간의 길이가 다르다면 더 긴 쪽만 압축 대상이고, 짧은 쪽은 0을 그대로 남겨둡니다.

규칙 4 — 0 블록이 딱 하나뿐인 구간은 압축하지 않습니다. 2001:db8:1:0:1:1:1:1처럼 0 블록이 한 개뿐이면 ::로 묶지 않고 0을 그대로 씁니다. RFC 5952가 이런 구간을 압축 대상에서 제외하도록 명시하고 있습니다.

압축된 주소를 원래대로 펴는 법

거꾸로 압축된 주소를 펴는 것도 같은 규칙을 반대로 적용하면 됩니다. 2001:db8::1을 예로 들면, 콜론으로 나눈 명시적 블록은 2001, db8, 1 세 개뿐입니다.

8개 블록을 채우려면 5개가 부족하므로, :: 자리에 0 블록 5개를 끼워 넣습니다. 그다음 각 블록을 4자리로 채우면 2001:0db8:0000:0000:0000:0000:0000:0001이 됩니다.

IPv4 표기가 섞인 주소

주소 끝에 IPv4 표기가 섞인 경우(::ffff:192.168.1.1 같은 형태)도 원리는 같습니다. 마지막 IPv4 부분(192.168.1.1)을 16비트씩 두 블록으로 먼저 바꾸고(c0a8, 0101), 그다음 앞의 ::를 나머지 0 블록으로 펴면 됩니다.

직접 여러 주소를 넣어 확장형과 압축형이 어떻게 바뀌는지 눈으로 확인해 보는 편이 규칙을 외우는 것보다 빠릅니다. 저희 도구로 확인하기.

IP 주소 형식 변환기 (IPv4 ↔ IPv6)

IP 주소를 입력하면 IPv4 10진수·16진수·2진수와 IPv6 확장·압축 표기가 실시간으로 계산됩니다. 회원가입 없이 무료로 사용합니다.

흔한 착각과 실수

압축 규칙에서 자주 틀리는 부분을 정리하면 다음과 같습니다.

상황틀린 예규칙
::를 두 번 사용2001:db8::1::2::는 주소당 단 한 번만 허용됩니다. 두 번 쓰면 각 ::가 대신하는 0 블록 수를 특정할 수 없습니다
0 블록 구간이 두 곳, 길이가 같은데 뒤쪽을 압축2001:db8:0:0:1::1길이가 같으면 왼쪽(앞쪽) 구간을 압축합니다. 올바른 표기는 2001:db8::1:0:0:1입니다
0 블록이 한 개뿐인데 압축2001:db8:1::1:1:1:1길이 1인 구간은 압축 대상이 아닙니다. 0을 그대로 남깁니다
블록 앞자리 0을 그대로 둠2001:0db8:... 그대로 유지틀린 표기는 아니지만 압축형이 아닙니다. 앞자리 0 생략은 항상 적용됩니다

이 표에서 가장 흔한 실수는 두 번째 줄입니다. 0 블록 구간이 두 군데 이상 있을 때 눈에 먼저 띄는 구간이나 계산하기 편한 구간을 압축해버리는 경우가 많습니다. 규칙은 '가장 긴 구간'이지 '먼저 보이는 구간'이 아닙니다.

정리

IPv6 생략(압축) 표기는 아래 네 가지 규칙으로 정리됩니다.

  1. 블록 앞자리 0은 생략합니다. ::와 무관하게 항상 적용됩니다.
  2. 연속된 0 블록은 ::로 압축하되, 한 주소에 단 한 번만 씁니다. 두 번 쓰면 원래 주소를 복원할 수 없습니다.
  3. 0 블록 구간이 여러 곳이면 가장 긴 구간 하나만 압축 대상입니다. 길이가 같으면 왼쪽(앞쪽) 구간을 압축합니다.
  4. 0 블록이 한 개뿐인 구간은 압축하지 않습니다. 0을 그대로 남겨둡니다.

이 네 규칙만 지키면 어떤 IPv6 주소든 손으로도 펴고 줄일 수 있습니다. 다만 블록이 8개나 되다 보니 손으로 세다 틀리기 쉬운 것도 사실입니다. 여러 예시 주소를 도구에 직접 넣어 확장형과 압축형을 눈으로 대조해 보면 규칙이 훨씬 빨리 손에 익습니다.

IP 주소 형식 변환기 (IPv4 ↔ IPv6)

IP 주소를 입력하면 IPv4 10진수·16진수·2진수와 IPv6 확장·압축 표기가 실시간으로 계산됩니다. 회원가입 없이 무료로 사용합니다.

자주 묻는 질문

::를 두 번 쓰면 안 되나요?

안 됩니다. ::는 주소 하나에 단 한 번만 쓸 수 있습니다. 두 번 쓰면 각 ::가 몇 개의 0 블록을 대신하는지 알 수 없어, 8개 블록으로 되돌리는 계산이 여러 갈래로 갈립니다. 어느 쪽이 맞는 주소인지 특정할 수 없으므로 유효하지 않은 표기로 취급됩니다.

0 블록이 하나뿐이어도 ::로 줄일 수 있나요?

권장되지 않습니다. RFC 5952는 길이가 1블록인 0 구간을 압축 대상에서 제외하도록 정합니다. 압축해도 글자 수가 거의 줄지 않는 반면, 어떤 표기를 표준형으로 볼지 혼란만 커지기 때문입니다. 이런 구간은 0을 그대로 남겨 씁니다.

압축형과 확장형은 정말 같은 주소인가요?

네, 같은 주소입니다. ::로 묶는 것과 앞자리 0을 생략하는 것 모두 값을 바꾸지 않고 표기만 줄이는 규칙입니다. 두 표기가 같은 주소인지 헷갈릴 때는 압축된 쪽을 8개 블록으로 펼쳐서 블록 단위로 나란히 비교하면 확실합니다.

IPv4-Mapped 주소(::ffff:a.b.c.d)는 왜 있나요?

IPv6 전용 소켓 하나로 IPv4·IPv6 클라이언트를 모두 받기 위한 표기입니다. IPv4 주소를 마지막 32비트에 그대로 넣고 그 앞에 ffff 블록을 붙여, IPv4로 들어온 연결도 IPv6 주소 형식으로 표현합니다.

비슷하게 생긴 IPv4-Compatible 주소(::a.b.c.d, ffff 없이)는 예전 자동 터널링 방식을 위해 만들어졌던 표기로, RFC 4291에서 현재는 쓰이지 않는(deprecated) 형식으로 분류됩니다.

가격 보기카톡 무료 상담