cidrsubnet 함수
cidrsubnet 함수
주어진 IP 네트워크 주소 접두어 안에서 서브넷 주소를 계산하는 함수예요.
출처: 문서
본문
cidrsubnet은 주어진 IP 네트워크 주소 접두어 안에서 서브넷 주소를 계산해요.
cidrsubnet(prefix, newbits, netnum)
prefix는 RFC 4632 3.1절에서 정의한 대로 CIDR 표기로 주어야 해요.
newbits는 접두어를 확장할 추가 비트 수예요. 예를 들어 /16으로 끝나는 접두어와 4라는 newbits 값이 주어지면 결과 서브넷 주소의 길이는 /20이 돼요.
netnum은 newbits 이진 자릿수를 넘지 않는 이진 정수로 나타낼 수 있는 정수로, 접두어에 추가된 비트들을 채우는 데 사용돼요.
이 함수는 IPv6와 IPv4 접두어를 모두 허용하며, 결과는 항상 주어진 접두어와 같은 주소 체계를 사용해요.
관련 함수인 cidrsubnets와 달리 cidrsubnet은 사용할 특정 네트워크 번호를 지정할 수 있어요. cidrsubnets는 한 번에 여러 네트워크 주소를 할당할 수 있지만 0부터 시작해 자동으로 번호를 매겨요.
예제
> cidrsubnet("172.16.0.0/12", 4, 2)
172.18.0.0/16
> cidrsubnet("10.1.2.0/24", 4, 15)
10.1.2.240/28
> cidrsubnet("fd00:fd12:3456:7890::/56", 16, 162)
fd00:fd12:3456:7800:a200::/72
넷마스크와 서브넷 (Netmasks and Subnets)
cidrsubnet을 사용하려면 네트워크 주소 개념에 대한 이해가 필요해요.
가장 중요한 개념은 IP 주소(IPv4든 IPv6든)가 근본적으로 이진 자릿수로 구성된다는 점이에요. 비록 관례적으로는 네 개의 10진 옥텟(IPv4)이나 16비트 16진 수열(IPv6)로 나타내지만요.
위 예제 cidrsubnet("10.1.2.0/24", 4, 15)를 보면, 이 함수는 먼저 주어진 IP 주소 문자열을 동등한 이진 표현으로 변환해요.
10 . 1 . 2 . 0
00001010 00000001 00000010 | 00000000
network | host
접두어 문자열 끝의 /24는 주소의 처음 24비트(즉, 처음 세 옥텟)가 네트워크를 식별하고 나머지 비트(이 경우 32 - 24 = 8비트)가 네트워크 안의 호스트를 식별한다는 것을 지정해요.
CLI 도구인 ipcalc는 CIDR 접두어를 이진 숫자로 시각화하는 데 유용해요. ipcalc에 같은 접두어 문자열을 제공해서 위 변환을 확인할 수 있어요.
$ ipcalc 10.1.2.0/24
Address: 10.1.2.0 00001010.00000001.00000010. 00000000
Netmask: 255.255.255.0 = 24 11111111.11111111.11111111. 00000000
Wildcard: 0.0.0.255 00000000.00000000.00000000. 11111111
=>
Network: 10.1.2.0/24 00001010.00000001.00000010. 00000000
HostMin: 10.1.2.1 00001010.00000001.00000010. 00000001
HostMax: 10.1.2.254 00001010.00000001.00000010. 11111110
Broadcast: 10.1.2.255 00001010.00000001.00000010. 11111111
Hosts/Net: 254 Class A, Private Internet
이렇게 하면 추가 정보가 제공될 뿐 아니라 (약간 다른 표기법을 사용하지만) 10진수에서 이진수로의 변환이 확인되고 이 네트워크에서 가능한 호스트 주소 범위가 표시돼요.
cidrhost가 단일 호스트 IP 주소 계산을 허용하는 반면, cidrsubnet은 주어진 네트워크 접두어 안에 새로운 네트워크 접두어를 만들어요. 다시 말해 서브넷을 만들어요.
cidrsubnet을 호출할 때 newbits와 netnum이라는 두 개의 추가 인자도 전달해요. newbits는 결과 접두어가 비트 단위로 얼마나 길어질지 결정해요. 여기 예제에서는 4를 지정했으므로 결과 서브넷의 접두어 길이는 24 + 4 = 28비트가 돼요. 이 비트들이 다음과 같이 나뉜다고 상상할 수 있어요.
10 . 1 . 2 . ? 0
00001010 00000001 00000010 | XXXX | 0000
parent network | netnum | host
원래 "호스트 번호"였던 8비트 중 네 비트가 이제 서브넷 번호로 용도가 바뀌었어요. 네트워크 접두어는 더 이상 정확한 옥텟 경계에 떨어지지 않으므로, 사실상 IP 주소의 마지막 10진수를 두 부분으로 나눠 절반은 서브넷 번호로, 나머지 절반은 호스트 번호로 나타내고 있어요.
그런 다음 netnum 인자는 그 네 개의 새 서브넷 비트에 어떤 숫자 값을 인코딩할지 결정해요. 이 예제에서는 15를 전달했는데, 이진수로는 1111이라서 위의 XXXX 부분을 채울 수 있어요.
10 . 1 . 2 . 15 0
00001010 00000001 00000010 | 1111 | 0000
parent network | netnum | host
이것을 다시 일반 10진 표기로 변환하려면 마지막 옥텟의 두 부분을 다시 합쳐야 해요. 11110000을 이진수에서 10진수로 변환하면 240이고, 이를 새 접두어 길이 28과 결합하면 결과는 10.1.2.240/28이 돼요. 다시 ipcalc에 이 접두어 문자열을 전달해서 시각화할 수 있어요.
$ ipcalc 10.1.2.240/28
Address: 10.1.2.240 00001010.00000001.00000010.1111 0000
Netmask: 255.255.255.240 = 28 11111111.11111111.11111111.1111 0000
Wildcard: 0.0.0.15 00000000.00000000.00000000.0000 1111
=>
Network: 10.1.2.240/28 00001010.00000001.00000010.1111 0000
HostMin: 10.1.2.241 00001010.00000001.00000010.1111 0001
HostMax: 10.1.2.254 00001010.00000001.00000010.1111 1110
Broadcast: 10.1.2.255 00001010.00000001.00000010.1111 1111
Hosts/Net: 14 Class A, Private Internet
새 서브넷은 호스트 번호에 4비트를 사용할 수 있으므로, 네트워크 자체의 주소와 브로드캐스트 주소를 빼면 할당 가능한 호스트 주소가 14개 있어요. 따라서 cidrhost 함수에 1에서 14 사이의 값을 전달해서 그 호스트 주소들을 계산할 수 있어요.
> cidrhost("10.1.2.240/28", 1)
10.1.2.241
> cidrhost("10.1.2.240/28", 14)
10.1.2.254
CIDR 표기와 서브넷팅에 대한 자세한 내용은 클래스 없는 도메인 간 라우팅(Classless Inter-domain Routing)을 참고하세요.
더 알아보기 (Learn more)
cidrhost함수는 주어진 네트워크 주소 접두어 안의 단일 호스트에 대한 IP 주소를 계산해요.cidrnetmask함수는 CIDR 표기의 IPv4 네트워크 접두어를 넷마스크 표기로 변환해요.cidrsubnets함수는 접두어 아래의 여러 연속 주소를 한 번에 할당하며 자동으로 번호를 매겨요.