네트워크 학습 노트 목차

IP 주소 계산 — 손으로 굴려서 답이 나와야 한다

앞선 03편에서 IP 주소는 네트워크 부분과 호스트 부분으로 나뉜다는 걸 봤다. 그런데 "안다"와 "푼다"는 다르다. 192.168.1.130/26을 받았을 때 이 주소가 속한 네트워크가 어디고, 브로드캐스트가 무엇이며, 같은 랜에 있는 다른 주소는 어디부터 어디까지인지종이 위에서 30초 안에 뽑아낼 수 있어야 실무에서 쓰인다. 이 편은 그 계산을 다룬다.

읽고 넘어가면 남지 않는다. 각 절의 예제를 직접 손으로 풀어 보고 답을 맞춰 보는 방식으로 읽기를 권한다.

왜 이진수로 내려가야 하나

255.255.255.192라는 마스크를 보고 "아 24비트구나"라고 착각하는 일이 흔하다. 십진수 표기는 사람이 읽기 편하라고 만든 껍데기일 뿐이고, 라우터와 호스트는 32비트 이진수로만 판단한다. 그래서 계산은 반드시 이진수에서 출발한다.

옥텟 하나(8비트)의 자릿값은 이것만 외우면 된다.

비트 위치   :  1    2    3    4    5    6    7    8
자릿값      : 128   64   32   16    8    4    2    1
누적 마스크 : 128  192  224  240  248  252  254  255

아래 줄이 핵심이다. 마스크의 각 옥텟은 이 아홉 개 값 중 하나만 될 수 있다0, 128, 192, 224, 240, 248, 252, 254, 255. 255.255.255.100 같은 마스크는 존재할 수 없다. 1이 왼쪽부터 연속으로 채워져야 하기 때문이다(RFC 4632의 CIDR 규칙).

/26  → 11111111.11111111.11111111.11000000  → 255.255.255.192
                                    ↑↑
                          앞 2비트만 1 → 128+64 = 192

세 가지 수를 먼저 뽑는다

프리픽스 길이를 받으면 호스트 비트 수 → 블록 크기 → 사용 가능 호스트 수 순으로 세 값을 뽑는다. 이 셋이 나오면 나머지는 자동이다.

프리픽스 /n 이 주어졌을 때

호스트 비트 h  = 32 - n
블록 크기      = 2^(마지막 옥텟의 호스트 비트)   ← 서브넷 간 간격
사용 가능 호스트 = 2^h - 2                        ← 네트워크·브로드캐스트 제외

/26으로 해 보자.

h = 32 - 26 = 6
블록 크기 = 2^6 = 64
사용 가능 호스트 = 2^6 - 2 = 62

블록 크기 64가 뜻하는 건 마지막 옥텟이 0, 64, 128, 192에서 새 네트워크가 시작된다는 것이다. 이 네 개가 /26서브넷 경계다.

자주 쓰는 프리픽스는 표로 익혀 두면 계산이 훨씬 빨라진다.

프리픽스마스크호스트 비트블록 크기사용 가능 호스트
/24255.255.255.08256254
/25255.255.255.1287128126
/26255.255.255.19266462
/27255.255.255.22453230
/28255.255.255.24041614
/29255.255.255.248386
/30255.255.255.252242
/31255.255.255.25412(특수)
/32255.255.255.25501(단일 호스트)

/30이 특별히 자주 쓰인다. 사용 가능 호스트가 딱 2개라 라우터와 라우터를 잇는 구간(point-to-point) 에 딱 맞기 때문이다. 주소를 한 톨도 낭비하지 않는다.

/31은 원래 쓸 수 없는 값이었지만, 점대점 링크에서는 브로드캐스트가 의미 없다는 이유로 RFC 3021이 2개 주소를 모두 쓰도록 허용했다.

네트워크 주소와 브로드캐스트 주소 뽑기

이제 실제 계산이다. 192.168.1.130/26이 주어졌다.

① 블록 크기로 경계를 찾는다. /26의 블록 크기는 64. 마지막 옥텟이 130이므로 130보다 작거나 같은 64의 배수를 찾는다.

0, 64, 128, 192  중에서 130 이하의 최대값 → 128

네트워크 주소 = 그 경계값.

네트워크 주소 : 192.168.1.128

③ 브로드캐스트 = 다음 경계 - 1.

다음 경계는 192 이므로
브로드캐스트 : 192.168.1.191

④ 사용 가능 범위 = 그 사이.

호스트 범위 : 192.168.1.129 ~ 192.168.1.190   (62개)

정리하면 이렇게 된다.

192.168.1.128   ← 네트워크 주소 (호스트에 할당 불가)
192.168.1.129   ┐
     ...        ├ 사용 가능 62개
192.168.1.190   ┘
192.168.1.191   ← 브로드캐스트 (호스트에 할당 불가)
192.168.1.192   ← 다음 서브넷의 네트워크 주소

네트워크 주소와 브로드캐스트 주소는 호스트에 줄 수 없다. 이걸 놓치고 .128이나 .191을 인터페이스에 박아 넣는 것이 가장 흔한 실수다.

이진수로 확인하면 왜 그런지 보인다.

주소     192.168.1.130 = ... .10000010
마스크   /26            = ... .11000000
AND 연산 -----------------------------
네트워크 192.168.1.128 = ... .10000000   ← 호스트 비트가 전부 0
브로드캐스트           = ... .10111111   ← 호스트 비트가 전부 1

호스트 비트가 전부 0이면 네트워크 주소, 전부 1이면 브로드캐스트다. 그래서 그 둘을 뺀 2^h - 2가 사용 가능 개수가 된다.

두 주소가 같은 네트워크인가

이게 실무에서 가장 자주 하는 판단이다. 방법은 하나뿐이다 — 각 주소를 자기 마스크로 AND 해서 네트워크 주소를 구하고, 그 둘이 같은지 본다.

10.0.5.20/2210.0.6.30/22가 통신할 수 있을까?

/22 → 호스트 비트 10 → 셋째 옥텟에서 블록 크기 2^(10-8) = 4

10.0.5.20  → 셋째 옥텟 5,  4의 배수 중 5 이하 최대 → 4  → 네트워크 10.0.4.0
10.0.6.30  → 셋째 옥텟 6,  4의 배수 중 6 이하 최대 → 4  → 네트워크 10.0.4.0

같다 → 같은 네트워크. 라우터 없이 직접 통신 가능

셋째 옥텟까지 내려가는 경우가 헷갈리는데, 원리는 같다. 호스트 비트가 걸쳐 있는 옥텟에서 블록 크기를 구하면 된다.

/22 → 32-22 = 10 호스트 비트
      마지막 옥텟이 8비트를 가져가고, 남은 2비트가 셋째 옥텟에 걸린다
      셋째 옥텟의 블록 크기 = 2^2 = 4
      → 셋째 옥텟 경계: 0, 4, 8, 12, 16, ...

마스크가 서로 다르면 통신이 한쪽만 된다

이게 진짜 함정이다. 두 호스트가 서로 다른 마스크를 쓰면, 한쪽은 상대를 같은 랜으로 보고 다른 쪽은 아니라고 보는 비대칭 상황이 생긴다.

A : 192.168.1.10/24   → A가 보는 네트워크 192.168.1.0 ~ 192.168.1.255
B : 192.168.1.20/28   → B가 보는 네트워크 192.168.1.16 ~ 192.168.1.31

A → B : A는 B(.20)가 자기 네트워크 안이라 판단 → ARP로 직접 부른다
B → A : B는 A(.10)가 자기 범위(.16~.31) 밖이라 판단 → 게이트웨이로 보낸다

결과는 한 방향만 되는 것처럼 보이는 기묘한 증상이다. ping이 나가긴 하는데 응답이 안 온다거나, 어떤 호스트끼리는 되고 어떤 호스트끼리는 안 된다. 같은 세그먼트에 있는 모든 인터페이스는 반드시 같은 마스크를 써야 한다.

게이트웨이도 같은 서브넷에 있어야 한다

호스트    192.168.1.130/26   → 네트워크 192.168.1.128 ~ .191
게이트웨이 192.168.1.1        → 이 주소는 192.168.1.0 ~ .63 에 속한다

→ 호스트가 게이트웨이에 도달할 수 없다. 외부 통신 전면 불가

기본 게이트웨이는 호스트가 직접 말을 걸 수 있는 주소여야 한다. 즉 호스트와 같은 서브넷 안에 있어야 한다. /24에 익숙해진 채로 .1을 습관적으로 적다가 서브넷을 쪼갠 환경에서 이 사고가 난다.

VLSM — 필요한 만큼만 잘라 쓴다

192.168.10.0/24 하나를 받아 부서별로 나눠야 한다고 하자. 필요한 호스트 수가 이렇다.

영업부  50대
개발부  25대
운영부  10대
링크    2대 (라우터 간 연결)

큰 것부터 자르는 것이 원칙이다. 작은 것부터 자르면 큰 덩어리가 연속으로 남지 않아 조각이 난다.

① 영업부 50대 → 2^h - 2 ≥ 50 → h=6 (62개) → /26, 블록 64
   192.168.10.0/26      사용 .1 ~ .62,    브로드캐스트 .63

② 개발부 25대 → 2^h - 2 ≥ 25 → h=5 (30개) → /27, 블록 32
   192.168.10.64/27     사용 .65 ~ .94,   브로드캐스트 .95

③ 운영부 10대 → 2^h - 2 ≥ 10 → h=4 (14개) → /28, 블록 16
   192.168.10.96/28     사용 .97 ~ .110,  브로드캐스트 .111

④ 링크 2대   → 2^h - 2 ≥ 2  → h=2 (2개)  → /30, 블록 4
   192.168.10.112/30    사용 .113 ~ .114, 브로드캐스트 .115

남은 대역 192.168.10.116 ~ .255 는 여유분

2^h - 2 ≥ 필요 대수를 만족하는 가장 작은 h를 고르는 것이 요령이다. 50대에 h=6(62개)을 쓰는 이유가 여기 있다 — h=5면 30개뿐이라 모자란다.

라우팅 테이블 읽고 쓰기

주소가 정해졌으면 다음은 경로다. 라우팅 테이블의 한 줄은 "이 목적지 대역으로 갈 거면 저기로 넘겨라" 는 뜻이다.

목적지            넥스트 홉        의미
10.1.0.0/16      10.0.0.2        10.1.x.x 로 갈 거면 10.0.0.2 에게
10.2.0.0/16      10.0.0.6        10.2.x.x 로 갈 거면 10.0.0.6 에게
0.0.0.0/0        10.0.0.254      그 외 전부는 10.0.0.254 에게 (기본 경로)

0.0.0.0/0프리픽스 길이가 0이라 모든 주소에 매칭된다. 그래서 기본 경로가 된다. 03편에서 본 최장 프리픽스 매칭 덕분에, 더 구체적인 항목이 있으면 그쪽이 먼저 선택되고 없을 때만 기본 경로로 떨어진다.

라우팅 테이블을 채울 때 지켜야 할 것 두 가지가 있다.

① 넥스트 홉은 그 라우터가 직접 닿을 수 있는 주소여야 한다. 즉 자기 인터페이스 중 하나와 같은 서브넷에 있어야 한다. 두 홉 건너의 주소를 넥스트 홉으로 적으면 동작하지 않는다.

② 경로는 양방향으로 있어야 한다. 요청이 가는 길만 있고 응답이 돌아오는 길이 없으면 통신은 성립하지 않는다. A에서 B로 가는 경로를 넣었으면 B에서 A로 오는 경로도 확인해야 한다.

        [A 10.1.0.10]        [B 10.2.0.10]
             │                     │
        ┌────┴────┐           ┌────┴────┐
        │ R1      ├───────────┤ R2      │
        │10.1.0.1 │ 10.0.0.1  │10.2.0.1 │
        └─────────┘ 10.0.0.2  └─────────┘

R1 에 필요한 경로 : 10.2.0.0/24 → 10.0.0.2
R2 에 필요한 경로 : 10.1.0.0/24 → 10.0.0.1     ← 이걸 빠뜨리면 응답이 못 온다

스위치에는 IP를 주지 않는다

주소를 배치하다 보면 스위치에 IP를 적어야 하나 헷갈릴 때가 있다. 답은 아니오다.

스위치는 02편에서 본 대로 MAC 주소로 프레임을 전달하는 장비라 IP 주소 없이 동작한다. 관리 목적으로 IP를 주는 경우가 있지만 그건 스위치 자신에게 접속하기 위한 것이지 전달 동작과는 무관하다.

IP가 필요한 것   호스트 인터페이스, 라우터의 각 인터페이스
IP가 불필요한 것  스위치의 전달 포트, 허브, 케이블

라우터는 인터페이스마다 서로 다른 네트워크의 주소를 갖는다. 라우터의 역할이 서로 다른 네트워크를 잇는 것이기 때문이다. 같은 라우터의 두 인터페이스에 같은 네트워크 주소를 주면 그건 이미 잘못된 구성이다.

사설 주소 대역

내부망에 쓰는 대역은 RFC 1918이 정해 두었다.

10.0.0.0/8        10.0.0.0     ~ 10.255.255.255    (약 1,678만)
172.16.0.0/12     172.16.0.0   ~ 172.31.255.255    (약 104만)
192.168.0.0/16    192.168.0.0  ~ 192.168.255.255   (약 6.5만)

172.16.0.0/12의 범위가 헷갈리기 쉽다. /12는 둘째 옥텟에 4비트가 걸리므로 블록 크기가 16이고, 16의 배수 경계에서 시작해 172.16 ~ 172.31이 된다. 172.32.0.0은 사설 대역이 아니다.

이 대역들은 인터넷으로 라우팅되지 않아 NAT가 필요하다. 그 이야기는 03편에서 다뤘다.

예약된 특수 주소

호스트에 할당하면 안 되는 주소들이다.

0.0.0.0/8          이 네트워크 (DHCP 요청 시 출발지로 사용)
127.0.0.0/8        루프백 — 자기 자신
169.254.0.0/16     링크 로컬 (APIPA) — DHCP 실패 시 자동 할당
224.0.0.0/4        멀티캐스트 (D 클래스)
240.0.0.0/4        예약 (E 클래스)
255.255.255.255    제한적 브로드캐스트

169.254.x.x가 인터페이스에 붙어 있으면 DHCP 서버로부터 주소를 받지 못했다는 신호다. 주소 문제를 진단할 때 가장 먼저 확인하는 단서 중 하나다.

손으로 풀어 보기

답을 보기 전에 직접 계산해 보자.

문제 1. 172.16.35.200/21 의 네트워크 주소와 브로드캐스트 주소는?

문제 2. 10.10.10.65/27 과 10.10.10.100/27 은 같은 네트워크인가?

문제 3. 200대를 수용하려면 최소 몇 비트의 호스트 비트가 필요한가?

문제 4. 192.168.5.0/24 를 60대·28대·12대 세 그룹으로 VLSM 분할하라.
<details> <summary>답</summary>

문제 1. /21 → 호스트 비트 11 → 셋째 옥텟 블록 크기 2^(11-8) = 8. 셋째 옥텟 35 이하의 8의 배수 최대값은 32. → 네트워크 172.16.32.0, 브로드캐스트 172.16.39.255, 호스트 범위 172.16.32.1 ~ 172.16.39.254 (2046개)

문제 2. /27 블록 크기 32 → 경계 0, 32, 64, 96, 128 … 65 → 네트워크 10.10.10.64 / 100 → 네트워크 10.10.10.96다르다. 라우터를 거쳐야 통신된다.

문제 3. 2^h - 2 ≥ 200 → h=8 이면 254개로 충족, h=7 이면 126개로 부족. → 8비트 (즉 /24)

문제 4.

60대 → h=6 (62개) → /26 : 192.168.5.0/26    사용 .1~.62
28대 → h=5 (30개) → /27 : 192.168.5.64/27   사용 .65~.94
12대 → h=4 (14개) → /28 : 192.168.5.96/28   사용 .97~.110
</details>

한 줄 요약

프리픽스에서 호스트 비트 → 블록 크기 → 경계를 뽑는 것이 모든 계산의 출발점이다. 네트워크 주소는 블록 경계, 브로드캐스트는 다음 경계 -1, 사용 가능 호스트는 2^h - 2다. 두 주소가 같은 랜인지는 각자의 마스크로 AND 해서 비교하고, 같은 세그먼트의 마스크는 반드시 일치해야 하며, 게이트웨이는 호스트와 같은 서브넷 안에 있어야 한다.

출처

IP 계층 — 라우팅·서브넷·NAT·best-effortTCP — 핸드셰이크·신뢰성·흐름/혼잡 제어