IPv6 주소 압축 및 확장

IPv6 주소를 하나뿐인 표준 압축 표기로 줄이거나 32자리 전체로 확장하고, 어떤 0이 사라지는지, 왜 그 연속이 ::이 되었는지, 입력이 RFC 5952의 어떤 규칙을 어겼는지 보여 줍니다. 목록도 한 번에 처리합니다.

RFC 5952 표준 표기 · RFC 4291 파싱(끝부분 IPv4 점 표기 포함) · 브라우저에서 실행

읽은 형식: IPv6

8개 그룹과 압축으로 사라지는 부분글자 수: 39 → 17 · 22자 줄어듦
유지앞자리 0, 삭제::이 되는 연속그 밖의 0, 유지
예시

주소 하나, 또는 한 줄에 하나씩 적은 목록(최대 100개)을 입력하세요. 변환은 브라우저에서 이루어지며 아무것도 전송되지 않습니다.

규칙 3개 적용RFC 5952

2001:db8::1:0:0:1

0 그룹 2개짜리 연속이 둘: 앞쪽이 ::이 되었습니다

RFC 5952 규칙별 확인

앞자리 0 삭제§4.1수정0DB8 → db8, 0001 → 1, 0000 → 0, 0000 → 0
::은 최대한 길게§4.2.1수정0000:0000 그대로 적음 → ::
그룹 하나에는 :: 금지§4.2.2통과
가장 긴 연속, 같으면 앞쪽§4.2.3통과0 그룹 2개짜리 연속이 둘: 앞쪽이 ::이 되었습니다
소문자§4.3수정0DB8 → db8
압축 표기(RFC 5952)
전체 표기
URL에서
숫자 하나로
10진수 · 16진수 · 2진수
역방향 DNS 이름

IPv6 주소는 어떻게 압축하나요?

소문자로 바꾸고, 각 그룹의 앞자리 0을 지운 다음, 모두 0인 그룹이 두 개 이상 이어진 가장 긴 연속을 :: 하나로 바꿉니다. 길이가 같은 연속이 둘이면 앞쪽을 바꿉니다.

이렇게 해서 RFC 5952가 소프트웨어에 출력하라고 요구하는 하나뿐인 표준 표기를 얻습니다. 프로그램은 입력으로 그 밖의 유효한 표기도 모두 받아들여야 하므로, 압축은 주소 자체를 바꾸지 않고 적는 방식만 바꿉니다.

2001:0DB8:0000:0000:0000:FF00:0042:8329를 2001:db8::ff00:42:8329로 줄이는 단계별 과정.
IPv6 주소 압축 도구가 RFC 5952 규칙으로 지우는 앞자리 0과 ::이 되는 0 그룹 연속을 보여 주는 화면IPv6 주소 압축 도구가 RFC 5952 규칙으로 지우는 앞자리 0과 ::이 되는 0 그룹 연속을 보여 주는 화면입력한 그대로대문자, 앞자리 0이 있어도 됩니다: 유효한 표기라면 무엇이든 읽습니다.지워지는 0앞자리 0을 그룹마다 취소선으로 표시합니다.::이 되는 연속0 그룹의 가장 긴 연속, 길이가 같으면 앞쪽입니다.남는 연속나머지 0 연속은 0을 그대로 두며, 그 이유를 보여 줍니다.규칙별 확인입력이 RFC 5952 규칙을 몇 개 어겼는지, 그 아래 체크리스트에서 각 규칙과 바뀐 점을 보여 줍니다.
길이가 같은 0 연속이 두 개: RFC 5952는 앞쪽을 압축하고, 체크리스트가 입력이 어긴 규칙을 하나하나 짚습니다.

IPv6 주소 압축 규칙은 무엇인가요?

RFC 5952는 다섯 가지 규칙을 정합니다: 앞자리 0을 지운다, ::은 가능한 한 길게 쓴다, 0 그룹 하나에는 ::을 쓰지 않는다, 가장 긴 연속을 압축한다(길이가 같으면 앞쪽), 16진수 문자는 소문자로 쓴다.

여섯 번째 권고는 IPv4를 담은 주소에 관한 것입니다: ::ffff: 같은 프리픽스 뒤에서는 마지막 32비트를 점으로 구분한 IPv4 주소로 씁니다. 도구는 입력을 각 규칙과 대조하고 고친 규칙을 알려 줍니다.

1앞자리 0 삭제§4.1

올바름: 2001:db8::1

틀림: 2001:0db8::0001

2::은 최대한 길게§4.2.1

올바름: 2001:db8::2:1

틀림: 2001:db8:0:0:0:0:2:1

3그룹 하나에는 :: 금지§4.2.2

올바름: 2001:db8:0:1:1:1:1:1

틀림: 2001:db8::1:1:1:1:1

4가장 긴 연속, 같으면 앞쪽§4.2.3

올바름: 2001:db8::1:0:0:1

틀림: 2001:db8:0:0:1::1

5소문자§4.3

올바름: 2001:db8::a

틀림: 2001:DB8::A

+끝부분 IPv4 점 표기§5

올바름: ::ffff:192.0.2.1

틀림: 0:0:0:0:0:ffff:192.0.2.1

각 규칙과 RFC 5952가 직접 든 올바른 예와 틀린 예.

IPv6 주소는 어떻게 확장하나요?

적힌 그룹 수를 세고, 여덟 개가 될 때까지 필요한 만큼의 0 그룹을 ::이 나타낸다고 보고, 모든 그룹을 네 자리로 채웁니다: 2001:db8::1에는 그룹이 세 개 있으므로 ::은 다섯 개입니다.

확장한 형식은 역방향 DNS가 니블(16진수 한 자리)마다 쓰는 형식이자, 많은 로그와 스프레드시트에서 텍스트로 정렬할 때 필요한 형식입니다. Python에서는 .exploded, Go에서는 StringExpanded라고 부릅니다.

2001:db8::1 확장: 적힌 그룹 3개, ::이 나타내는 0 그룹 5개, 모든 그룹을 4자리로 채웁니다.

IPv6 주소 하나를 몇 가지로 쓸 수 있나요?

여러 가지입니다: 앞자리 0, 대소문자, ::의 위치가 모두 달라질 수 있어 주소 하나에 유효한 표기가 많으며, RFC 5952는 표준 표기 하나를 정하기 전에 2001:db8:0:0:1:0:0:1의 표기 여덟 가지를 나열합니다.

주소를 텍스트로 비교하면 실패하는 이유가 이것입니다: 같은 주소의 두 표기가 일치하지 않습니다. 대신 128비트 숫자로 비교하거나, 먼저 둘 다 압축하세요.

2001:db8:0:0:1:0:0:12001:0db8:0:0:1:0:0:12001:db8::1:0:0:12001:db8::0:1:0:0:12001:0db8::1:0:0:12001:db8:0:0:1::12001:db8:0000:0:1::12001:DB8:0:0:1::1
2001:db8::1:0:0:1표준 표기 · RFC 5952
RFC 5952가 든 여덟 가지 표기, 모두 같은 주소입니다.

포트나 존이 있는 IPv6 주소는 URL에 어떻게 쓰나요?

주소를 대괄호로 감싸 http://[2001:db8::1]:8443/처럼 씁니다. 그러면 포트가 그룹으로 오인되지 않습니다. %eth0 같은 존은 브라우저 URL에 아예 쓸 수 없습니다.

RFC 5952는 포트가 있는 주소를 대괄호로 감싸라고 하며, 2001:db8::1:8443은 권장하지 않는다고 합니다. URL에서 대괄호는 다른 용도로 쓰이지 않습니다. 브라우저는 ::ffff: 뒤에서도 주소를 16진수로 출력하므로, [::ffff:192.0.2.1]은 [::ffff:c000:201]로 표시됩니다.

존은 fe80::1%eth0처럼 한 컴퓨터의 인터페이스를 가리킵니다. RFC 9844는 2025년에 존을 URL에서 다시 뺐고 브라우저도 거부하지만, 프로그램에서는 여전히 입력할 수 있어야 합니다.

http://스킴[2001:db8::1]대괄호 안의 IPv6:8443포트/status경로

존(%eth0) · fe80::1%eth0

프로그램 입력란에 입력허용
브라우저 URL거부
inet_pton()해석 불가
전역 주소존이 없음
IPv6 주소가 든 URL을 나눠 보고, 존을 쓸 수 있는 곳을 정리했습니다.

코드에서 IPv6를 압축하거나 확장하려면 어떻게 하나요?

주소를 파싱한 뒤 출력하면 됩니다: Python의 .compressed, Go의 netip.Addr.String(), MySQL의 INET6_NTOA(INET6_ATON(…))는 표준 표기를, .exploded와 StringExpanded()는 전체 표기를 돌려줍니다.

Python의 str()도 압축 표기를 돌려주며, Python은 %zone 접미사도 받아들입니다. MySQL은 소문자로 최대 39자를 출력하며, 어느 플랫폼에서나 같습니다.

› import ipaddress
a = ipaddress.ip_address('2001:0DB8::0001')
a.compressed, a.exploded
('2001:db8::1', '2001:0db8:0000:0000:0000:0000:0000:0001')

Python ipaddress

› a := netip.MustParseAddr("2001:0DB8::0001")
fmt.Println(a.String(), a.StringExpanded())
2001:db8::1 2001:0db8:0000:0000:0000:0000:0000:0001

Go net/netip

› SELECT INET6_NTOA(INET6_ATON('2001:0DB8::0001'));
2001:db8::1

MySQL 8.4

Python, Go, MySQL에서 얻는 표준 압축 표기와 전체 표기.

자주 묻는 질문

2001:0db8:0000:0000:0000:ff00:0042:8329의 압축 표기는 무엇인가요?

2001:db8::ff00:42:8329입니다. 문자를 소문자로 바꾸고, 각 그룹의 앞자리 0을 지운 뒤(0db8은 db8, 0042는 42), 모두 0인 그룹 세 개의 연속을 :: 하나로 바꿉니다. 결과는 39자가 아니라 22자이며, RFC 5952가 표준이라고 부르는 유일한 형식입니다. 이것을 다시 확장하면 정확히 같은 16진수 32자리로 돌아갑니다.

IPv6 주소에서 ::을 두 번 쓸 수 있나요?

아닙니다. ::은 하나 이상의 0 그룹을 나타내며 주소에 한 번만 쓸 수 있습니다. 두 번 있으면 각각이 0 그룹 몇 개를 나타내는지 아무도 알 수 없으므로, 2001:db8::1::1은 무효입니다. 0 연속이 둘인 주소에서는 더 긴 쪽(길이가 같으면 앞쪽)을 압축하고, 다른 쪽은 2001:db8::1:0:0:1처럼 0:0으로 씁니다.

2001:db8:0:1:1:1:1:1을 2001:db8::1:1:1:1:1로 압축하지 않는 이유는 무엇인가요?

RFC 5952가 0 그룹 하나에 ::을 쓰는 것을 금지하기 때문입니다. 이렇게 줄여도 한 글자만 줄고 주소는 읽기 어려워지므로, 표준 표기는 홀로 있는 그룹을 0으로 남겨 2001:db8:0:1:1:1:1:1로 씁니다. 파서는 2001:db8::1:1:1:1:1도 같은 주소로 받아들이지만, 소프트웨어가 이렇게 출력해서는 안 됩니다.

IPv6 주소는 대문자와 소문자 중 무엇으로 써야 하나요?

소문자입니다. RFC 5952는 표준 표기에서 16진수 문자 a부터 f까지를 소문자로 쓰도록 요구하며, 브라우저와 대부분의 라이브러리도 그렇게 출력합니다. 소프트웨어는 대문자 입력도 받아들여야 하므로 2001:DB8::A와 2001:db8::a는 같은 주소이고, 바뀌는 것은 출력 형식뿐입니다. 대문자는 오래된 문서와 일부 공급업체의 설정 파일에서 흔히 보입니다.

IPv6 주소의 ::은 어떻게 확장하나요?

적힌 그룹 수를 센 다음, 여덟 개가 되는 데 필요한 만큼의 0 그룹을 ::이 나타낸다고 보면 됩니다. 2001:db8::ff00:42:8329에는 다섯 그룹이 적혀 있으므로 ::은 0000 그룹 세 개입니다. 모든 그룹을 네 자리로 채우면 2001:0db8:0000:0000:0000:ff00:0042:8329가 되며, 이것이 역방향 DNS와 많은 로그 도구가 쓰는 전체 표기입니다.

가장 긴 IPv6 주소는 몇 글자인가요?

16진수만 쓴 전체 표기로 39자입니다: 네 자리 그룹 여덟 개와 콜론 일곱 개입니다. 끝부분을 점으로 구분한 IPv4로 쓴 형식은 더 길어질 수 있어서, 소켓 API의 버퍼 크기 INET6_ADDRSTRLEN은 46바이트입니다. 0000:0000:0000:0000:0000:ffff:255.255.255.255와 끝의 NUL이 들어가는 크기입니다. 압축한 주소는 보통 훨씬 짧으며, 주소 ::은 겨우 두 글자입니다.

::ffff:c000:280이 ::ffff:192.0.2.128이 되는 이유는 무엇인가요?

IPv4 매핑 주소의 마지막 32비트는 IPv4 주소를 뜻하므로, RFC 5952가 그 부분을 점으로 구분한 IPv4 주소로 쓰라고 권장하기 때문입니다. 두 표기는 같은 주소이며 둘 다 유효한 입력입니다. 예외는 브라우저입니다: URL Standard는 항상 16진수 형식을 출력하므로, 같은 주소가 주소창에서는 [::ffff:c000:280]으로 보입니다.

포트가 있는 IPv6 주소는 URL에 어떻게 넣나요?

주소를 대괄호로 감싸고 그 뒤에 포트를 씁니다: http://[2001:db8::1]:8443/. 대괄호가 없으면 포트가 그룹 하나처럼 보이므로, RFC 5952는 2001:db8::1:8443처럼 쓰지 말라고 합니다. URL에서 대괄호는 IPv6 리터럴에만 쓰입니다. %eth0 같은 존은 브라우저 URL에 아예 넣을 수 없으며, 브라우저가 거부합니다.

Python에서 IPv6 주소를 압축하려면 어떻게 하나요?

ipaddress 모듈로 파싱한 다음, 표준 압축 표기는 .compressed로, 32자리 전체는 .exploded로 읽습니다: ipaddress.ip_address('2001:0db8::0001').compressed는 '2001:db8::1'을 돌려주며, str()도 같은 값을 돌려줍니다. Go에서는 netip.Addr의 String()과 StringExpanded()가 같은 일을 하고, MySQL의 INET6_NTOA(INET6_ATON(…))는 소문자 표준 표기를 출력합니다.

IPv6 주소 목록을 한 번에 압축할 수 있나요?

네. 한 줄에 하나씩 최대 100개 주소를 붙여 넣으면 도구가 표 형태로 바뀌어, 줄마다 압축 표기와 전체 표기, 그 표기가 어긴 RFC 5952 규칙을 보여 줍니다. 주소가 아닌 줄은 빼지 않고 표시만 하므로 행이 입력과 그대로 맞습니다. 두 열 중 어느 쪽이든 복사하거나 CSV로 내려받을 수 있으며, 아무것도 브라우저 밖으로 나가지 않습니다.

부족한 점이 있습니까?기능 또는 새 도구 제안하기