Skip to main content

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.0Class A네트워크 8비트 / 호스트 24비트
255.255.0.0Class B네트워크 16비트 / 호스트 16비트
255.255.255.0Class 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이다.

  1. 네트워크 수
    • /26: 서브넷 마스크를 IPv4로 표기하면 255.255.255.192입니다.
    • 마지막 옥텟의 192는 11000000상위 2비트가 네트워크 비트입니다.
  2. 호스트 수
    • 호스트 비트: 마지막 옥텟에서 전체 32비트 중 26비트가 네트워크이므로 호스트 비트는 32 - 26 = 6비트가 됩니다.
    • 호스트의 수는 2⁶ - 2 = 62개가 됩니다.
      • 네트워크 마지막 비트와 브로드캐스트, 양 끝단을 제외한 숫자입니다.
  3. 서브넷 범위
    • 기본 Class C는 /24 (24비트)
    • 현재 /2611000000입니다. 네트워크 비트 2개를 추가로 쪼갬 → 2² = 4개의 서브넷 발생
서브넷 번호네트워크 주소첫 호스트마지막 호스트브로드캐스트
1192.168.10.0.1.62.63
2192.168.10.64.65.126.127
3192.168.10.128.129.190.191
4192.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 - (서브넷 마스크 마지막 옥텟 값)