Subnet Mask (IPv4)
IPv4에서 서브넷 마스크로 네트워크/호스트 구분하는 것이 이해가 잘 되지 않아서 간단히 정리합니다.
LLM과 대화를 하며, 이해가 가지 않던 부분과 예외들을 질문한 내용을 다시 문서화했습니다.
IPv4
IPv4 주소는 32비트(4바이트) 로 구성돼 있습니다.
192.168.10.25 # 이건 실제로는
11000000.10101000.00001010.00011001 # 이런 식의 2진수(32비트)입니다.
Network / Host
IP는 네트워크/호스트 부분으로 구성됩니다.
- 네트워크 주소 (Network part) : 어떤 네트워크인지 구분
- 호스트 주소 (Host part) : 그 네트워크 안의 어떤 기기인지 구분
IP에서 두 부분을 구분해주는 방법 중 하나는 서브넷 마스크(Subnet Mask) 입니다.
Subnet Mask
서브넷 마스크는 네트워크 부분이 몇 비트인지 표시하는 가면(mask) 입니다.
비트마스크처럼 오류 검출이나, 기타 목적에 따른 표시용 값처럼, IP 형태 자체를 마스크로 사용한다-정도로 이해했습니다.
예시
| 서브넷 마스크 | 의미 | 네트워크/호스트 비트 수 |
|---|---|---|
| 255.0.0.0 | Class A | 네트워크 8비트 / 호스트 24비트 |
| 255.255.0.0 | Class B | 네트워크 16비트 / 호스트 16비트 |
| 255.255.255.0 | Class C | 네트워크 24비트 / 호스트 8비트 |
위 서브넷 마스크 예시에서 네트워크/호스트 비트는 다음과 같습니다:
- 네트워크 비트: 255는 2진수로 11111111
- 호스트 비트: 0은 00000000
CIDR 표기법
CIDR 표기법은 서브넷 마스크를 간단히 /숫자 로 표기합니다.
| 표기 | 의미 | 서브넷 마스크 |
|---|---|---|
| /8 | 네트워크 8비트 | 255.0.0.0 |
| /16 | 네트워크 16비트 | 255.255.0.0 |
| /24 | 네트워크 24비트 | 255.255.255.0 |
| /26 | 네트워크 26비트 | 255.255.255.192 |
/8 | /16 | /24 | /26
32(8옥텟 * 4) 이전까지 서브넷 마스크를 이와 같이 나타낼 수 있습니다.
네트워크가 8, 16, 24비트인 경우엔 이해가 쉽습니다.
/08 [■■네트워크■■][호스트][호스트][호스트]
/16 [■■네트워크■■][■■네트워크■■][호스트][호스트]
/24 [■■네트워크■■][■■네트워크■■][■■네트워크■■][호스트]
/26 [■■네트워크■■][■■네트워크■■][■■네트워크■■][■■네트워크(2비트) / 호스트 ]
하지만 /26은 서브넷 마스크 마지막 옥텟이 192이므로, 호스트 부분.
또한 /19, /22처럼 서브넷 마스크가 n번째 옥텟 중간이 될 수 있습니다.
즉 서브넷 마스크는 255로 차곡차곡 채워지지 않을 수 있습니다.
이러한 경우, 서브넷 마스크와 호스트/네트워크 주소를 바탕으로 계산이 필요합니다.
AND 연산과 네트워크/호스트 경계 찾기
서브넷 마스크와 IP 주소가 주어졌을 때, 그 둘을 2진수로 바꾼 뒤 AND 연산합니다
서브넷 마스크로 주어진 IP 주소에서 네트워크/호스트 주소를 알아내기 위해선 AND 연산을 해야합니다.
“AND 연산”이란, 1과 1이면 1, 그 외엔 0인 비트연산입니다.
주어진 예제로 AND 연산을 하면 다음과 같습니다:
1. 주소의 각 자리를 2진수로 변환
IP 주소: 223.13.234.132
223 = 11011111
13 = 00001101
234 = 11101010
132 = 10000100
서브넷 마스크: 255.255.255.192
255 = 11111111
255 = 11111111
255 = 11111111
192 = 11000000
2. 각 옥텟별 AND 연산
IP 주소: 1101111.00001101.11101010.10000100 (=223.13.234.132)
서브넷 마스크: 11111111.11111111.11111111.1100000 (= 255.255.255.192)
223: 11011111 & 255: 11111111 = | 11011111 |
13: 00001101 & 255: 11111111 = | 00001101 |
234: 11101010 & 255: 11111111 = | 11101010 |
132: 10000100 & 192: 11000000 = | 10000000 | => 결과
결과: 11011111.00001101.11101010.10000000
AND 연산 결과로 11011111.00001101.11101010.10000000를 얻었습니다.
이를 다시 10진수로 바꾸면, 223.13.234.128이 됩니다.
주어진 IP에서 바로 여기까지가 네트워크 주소가 됩니다.
호스트 주소는 마지막 브로드캐스트 주소 1비트를 제외하면,
223.13.234.129 ~ 223.13.234.254까지가 됩니다.
중요: 실제 호스트 범위는 맨 앞의 값과 맨 마지막 값은 각각 네트워크 주소/브로드캐스트 주소를 제외합니다.
중요한 내용이어서 강조합니다.
CIDR 계산
서브넷 마스크가 IP 형태 대신, /n 형태로 주어질 수 있습니다.
/26 예제를 통해 서브넷 마스크로 계산하는 방법을 알아봅니다.
문제 1 : "192.168.10.0/26" 네트워크에서 다음을 구하시오.
- 네트워크 수
- 호스트 수
- 서브넷 범위
/26 = 네트워크의 마지막 옥텟이 26/32이다.
- 네트워크 수
/26: 서브넷 마스크를 IPv4로 표기하면255.255.255.192입니다.- 마지막 옥텟의 192는 11000000 → 상위 2비트가 네트워크 비트입니다.
- 호스트 수
- 호스트 비트: 마지막 옥텟에서 전체 32비트 중 26비트가 네트워크이므로 호스트 비트는
32-26= 6비트가 됩니다. - 호스트의 수는 2⁶ - 2 = 62개가 됩니다.
- 네트워크 마지막 비트와 브로드캐스트, 양 끝단을 제외한 숫자입니다.
- 호스트 비트: 마지막 옥텟에서 전체 32비트 중 26비트가 네트워크이므로 호스트 비트는
- 서브넷 범위
- 기본 Class C는 /24 (24비트)
- 현재
/26은11000000입니다. 네트워크 비트 2개를 추가로 쪼갬 → 2² = 4개의 서브넷 발생
| 서브넷 번호 | 네트워크 주소 | 첫 호스트 | 마지막 호스트 | 브로드캐스트 |
|---|---|---|---|---|
| 1 | 192.168.10.0 | .1 | .62 | .63 |
| 2 | 192.168.10.64 | .65 | .126 | .127 |
| 3 | 192.168.10.128 | .129 | .190 | .191 |
| 4 | 192.168.10.192 | .193 | .254 | .255 |
/n -> n.n.n.n
앞서 계속 살핀 것처럼, CIDR의 /n은 “앞에서부터 몇 비트가 네트워크 부분인가”를 뜻합니다.
/8:255.0.0.0/16:255.255.0.0
이렇게 옥텟 크기와 동일한 숫자라면 서브넷 마스크를 구하기 쉽습니다.
하지만 아래처럼 옥텟 중간에서 끊길 수 있습니다.
/27→ 앞의 27비트가 네트워크, 뒤의 5비트가 호스트/19→ 앞의 19비트가 네트워크, 뒤의 13비트가 호스트
[네트워크].[네트워크+일부].[호스트+나머지].[호스트]
IPv4는 전체 32비트이니, 네트워크 비트 수 + 호스트 비트 수 = 32가 되어야합니다.
/26, 255.255.255.192처럼 “네트워크/호스트”의 경계가 옥텟(8비트) 중간에 끊길 수도 있습니다.
아래 표를 참조하면 다음과 같습니다:
| CIDR | 네트워크/호스트 구성 | 서브넷 마스크 |
|---|---|---|
| /19 | [네트워크].[네트워크].[네트워크(3비트)/호스트(5비트)].[호스트] | 255.255.224.0 |
| /22 | [네트워크].[네트워크].[네트워크(6비트)/호스트(2비트)].[호스트] | 255.255.252.0 |
| /24 | [네트워크].[네트워크].[네트워크].[호스트] | 255.255.255.0 |
| /25 | [네트워크].[네트워크].[네트워크].[네트워크(1비트)/호스트(7비트)] | 255.255.255.128 |
| /26 | [네트워크].[네트워크].[네트워크].[네트워크(2비트)/호스트(6비트)] | 255.255.255.192 |
| /27 | [네트워크].[네트워크].[네트워크].[네트워크(3비트)/호스트(5비트)] | 255.255.255.224 |
/25, /26,/27은 네 번째 옥텟 중 일부가 네트워크, 나머지가 호스트인 구조가 됩니다.
이제 이 서브넷 마스크를 바탕으로 네트워크나 호스트 주소 한쪽이 주어진 경우, 호스트 ⇆ 네트워크 주소를 구할 수 있습니다.
이해를 돕기 위해 정리하자면,
8 8 8 8 --- 11111111 / 00000000
255 . 255 . 255 . 255
[■■■■■■■■][■■■■■■■■][■■■■■■■■][■■■■■■■■]
- /24면 앞의 24칸이 네트워크 (세 칸 완전히)
- /27이면 세 칸 + 마지막 칸의 일부 (27칸)
- /19면 두 칸 + 세 번째 칸의 일부 (19칸)
- /36은 아예 IPv4 상자 크기를 초과 (→ IPv6용)
/19 → 255.255.224.0
(224 = 11100000 → 앞 3비트 네트워크, 뒤 5비트 호스트)
Summary
마지막으로 여기까지의 내용을 표로 정리하면 다음과 같습니다.
| 항목 | 공식 |
|---|---|
| 서브넷 개수 | 2ⁿ (n = 빌린 비트 수) |
| 호스트 수 | 2ʰ - 2 (h = 남은 비트 수) |
| 블록 크기 | 256 - (서브넷 마스크 마지막 옥텟 값) |