Chapter 07

IP 주소와 서브넷

카페에서 노트북을 열면 몇 초 만에 인터넷이 된다. 그 사이 노트북은 “나는 몇 번지인가?”를 물어 주소를 빌리고, 옆자리 공유기의 하드웨어 주소를 알아내고, 공유기는 노트북의 주소를 바깥용 주소로 바꿔 적는다. 전 세계 수백억 대의 기기가 서로를 찾는 비결은 32비트(또는 128비트)짜리 숫자 하나, IP 주소다. 이 장에서는 그 숫자를 직접 쪼개고 계산해 본다.

IP의 일: 최선을 다해, 한 상자씩

3장에서 본 계층 구조에서 IP(Internet Protocol)는 네트워크 계층을 맡는다. 할 일은 하나뿐이다. 목적지 주소가 적힌 상자(패킷)를 지구 어디든 그 주소의 기기까지 가져다 놓는 것. 이더넷(6장)이 같은 건물 안의 우편실이라면, IP는 도시와 나라를 넘나드는 택배 회사다.

IP의 배달 방식에는 두 가지 큰 특징이 있다.

약속을 적게 한 덕분에 IP는 단순하고, 단순한 덕분에 구리선·광섬유·전파·위성 어떤 링크 위에서도 돌아간다. “인터넷의 허리”라 불리는 이유다. 아래는 IPv4 패킷 맨 앞에 붙는 20바이트 헤더, 즉 택배 상자의 송장이다.

08162431 048121620 바이트 버전헤더 길이서비스 종류전체 길이 식별자플래그조각 오프셋 TTL프로토콜헤더 체크섬 출발지 IP 주소 (32비트) 목적지 IP 주소 (32비트) 옵션 (가변 길이, 거의 쓰지 않음) 45 (×4B)DSCP·ECN헤더+데이터 바이트 수 조각 맞추기용 번호DF·MF8바이트 단위 위치 64 → 홉마다 −16=TCP, 17=UDP헤더 손상 검사 예: 192.168.0.23 예: 142.250.196.110 한 줄 = 32비트(4바이트). 옵션이 없으면 헤더는 정확히 20바이트다.
그림 7-1. IPv4 헤더. 라우터는 패킷마다 목적지 주소를 보고 길을 정하고, TTL을 1 줄이고, 그 때문에 바뀐 헤더의 체크섬을 다시 계산한다. 프로토콜 번호는 안에 든 상자가 TCP인지 UDP인지 알려 준다. 데이터 내용은 들여다보지 않는다.
송장만 보는 분류 센터

물류 허브의 직원은 상자를 열어 보지 않는다. 송장의 받는 주소만 보고 어느 트럭에 실을지 정한다. 상자가 너무 많아 창고가 넘치면 일부를 그냥 버린다(최선형). 같은 사람이 보낸 상자 열 개도 각각 다른 트럭을 탈 수 있다(비연결형). 대신 송장에는 “유효 기한(TTL)” 도장이 있어 허브를 지날 때마다 하나씩 줄고, 0이 되면 폐기한다. 주소가 잘못돼 영원히 도는 상자를 막는 장치다.

32비트 주소: 네트워크 부분과 호스트 부분

IPv4 주소는 32개의 비트, 즉 0과 1이 32개 늘어선 숫자다. 사람이 읽기 쉽게 8비트(1바이트)씩 끊어 각각 0~255의 십진수로 쓰고 점으로 잇는다. 이를 점 표기(dotted decimal)라 한다. 192.168.10.37은 사실 11000000 10101000 00001010 00100101이다. 가능한 주소는 232 ≈ 43억 개다.

주소의 앞쪽은 어느 네트워크인가, 뒤쪽은 그 네트워크 안의 어느 기기인가를 뜻한다. 도로명 주소의 “테헤란로 123”이 동네와 건물을 가리키고, 뒤의 호수가 집을 가리키는 것과 같다. 라우터는 앞부분(네트워크)만 보고 길을 정하므로, 전 세계 기기 수십억 개를 일일이 외울 필요 없이 네트워크 수십만~백만 개 정도만 알면 된다(8장).

192.168.10.37 /24 1921681037 11000000101010000000101000100101 네트워크 부분 24비트 = 도로명·건물 호스트 8비트 = 호수 “/24” = 앞에서부터 24비트가 네트워크. 서브넷 마스크로 쓰면 255.255.255.0. 네트워크 부분이 같은 기기끼리는 라우터 없이 같은 LAN(6장) 안에서 바로 주고받는다.
그림 7-2. IPv4 주소의 두 부분. 경계선의 위치는 주소 자체에 적혀 있지 않고, 프리픽스 길이(또는 서브넷 마스크)라는 별도 정보로 정한다.

클래스에서 CIDR로

1981년 처음 정한 규칙은 경계선을 8비트 단위로 고정한 클래스 방식이었다. 첫 숫자만 보면 클래스가 정해졌다.

클래스첫 바이트네트워크/호스트네트워크 수네트워크당 호스트
A0~1278 / 24비트128약 1,677만
B128~19116 / 16비트16,38465,534
C192~22324 / 8비트약 209만254
D224~239멀티캐스트(여러 수신자에게 한꺼번에)
E240~255실험·예약용

문제는 크기가 세 가지뿐이라는 것이었다. 직원 2,000명 회사는 C(254대)로는 모자라 B(65,534대)를 받아야 했고, 6만 개 넘는 주소가 놀았다. 1990년대 초 B 클래스가 빠르게 바닥나자 1993년 CIDR(Classless Inter-Domain Routing)이 도입됐다. 경계선을 아무 비트에나 둘 수 있게 하고, 주소 뒤에 /22처럼 네트워크 비트 수를 붙인다. 이 숫자를 프리픽스 길이(prefix length)라 한다. 2,000명 회사는 이제 /21(2,046대)을 받으면 된다. 오늘날 클래스라는 말은 역사 용어로만 남았다.

서브넷 계산기

프리픽스 길이를 비트 모양으로 쓴 것이 서브넷 마스크(subnet mask)다. 네트워크 비트 자리는 1, 호스트 비트 자리는 0. /24는 1이 24개, 0이 8개이므로 255.255.255.0이다. 기기는 주소와 마스크를 비트별 AND(둘 다 1일 때만 1) 하여 자기 네트워크 주소를 얻고, 상대 주소도 같은 방식으로 계산해 “같은 동네인가?”를 판단한다. 같으면 직접(ARP로 MAC을 찾아) 보내고, 다르면 기본 게이트웨이(공유기)에게 맡긴다.

한 서브넷(subnet)에서 두 주소는 기기에게 줄 수 없다. 호스트 비트가 전부 0인 주소는 네트워크 자체의 이름(네트워크 주소)이고, 전부 1인 주소는 “이 네트워크의 모두에게”라는 뜻의 브로드캐스트 주소(broadcast address)다. 그래서 호스트 비트가 h개면 쓸 수 있는 주소는 2h − 2개다.

사용 가능 호스트 = 2(32 − 프리픽스) − 2   ·   네트워크 주소 = IP AND 마스크   ·   브로드캐스트 = 네트워크 주소 OR (NOT 마스크)
CALCULATOR

서브넷 계산기: 프리픽스 길이를 움직여 보세요

예시
네트워크 비트호스트 비트브로드캐스트의 호스트 비트(모두 1)
서브넷 마스크—
네트워크 주소—
브로드캐스트 주소—
기기에 줄 수 있는 범위—
사용 가능 호스트 수—
주소 종류 (옛 클래스)—
해볼 것: 프리픽스를 24 → 25 → 26으로 늘려 보자. 네트워크 비트(파란색)가 하나 늘 때마다 호스트 수가 절반이 된다. 맨 위 줄(IP 주소)의 비트를 눌러 직접 뒤집을 수도 있다. 호스트 비트를 바꾸면 네트워크 주소는 그대로, 네트워크 비트를 바꾸면 다른 동네가 된다. /31은 두 라우터를 잇는 점대점 링크 전용(RFC 3021)이라 네트워크·브로드캐스트 주소를 따로 두지 않고, /32는 기기 하나만 가리킨다.
예측해 보기

/24 네트워크(사용 가능 254대)의 프리픽스를 /25로 1만 늘리면, 서브넷 하나에서 쓸 수 있는 호스트 수는?

서브넷 계산기의 슬라이더를 24에서 25로 옮겨 확인하자.

호스트 비트가 8개에서 7개가 되면 주소는 256 → 128개로 절반이 되고, 네트워크·브로드캐스트 두 개를 빼면 126대다. 대신 같은 /24 안에 이런 서브넷이 두 개 생긴다.

서브넷 나누기와 VLSM

회사가 192.168.10.0/24 하나를 받았다고 하자. 영업팀, 개발팀, 손님 Wi-Fi를 한 네트워크에 몰아 두면 브로드캐스트가 모두에게 퍼지고, 보안 정책도 나누기 어렵다. 그래서 프리픽스를 늘려 작은 서브넷 여러 개로 쪼갠다. 비트 하나를 네트워크 쪽으로 빌릴 때마다 서브넷 수는 두 배, 크기는 절반이 된다.

그런데 팀마다 필요한 크기가 다르다. 모든 서브넷을 같은 크기로 자르면 라우터 두 대를 잇는 링크(주소 2개 필요)에도 62개짜리 블록을 줘야 한다. VLSM(Variable Length Subnet Mask)은 서브넷마다 프리픽스 길이를 다르게 해서 필요한 만큼만 떼어 준다. 큰 블록부터 차례로 배치하면 블록 경계가 저절로 맞는다.

SIMULATOR

/24 하나를 서브넷으로 나누기

방식
서브넷 수—
서브넷당 크기—
전체 사용 가능 호스트—
막대 하나가 주소 256개(192.168.10.0~.255)다. 블록 양 끝의 빨간 선은 기기에게 줄 수 없는 네트워크·브로드캐스트 주소. 같은 크기로 잘게 나눌수록 이 “세금”이 늘어 전체 사용 가능 호스트가 줄어든다(1개 → 254대, 64개 → 128대). VLSM 모드에서는 필요 기기 수 + 2를 담는 가장 작은 2의 거듭제곱 크기를 큰 것부터 배치한다. 영업팀을 200대로 늘려 공간이 모자라는 순간을 확인해 보자.

특별한 주소들

43억 개의 주소가 모두 인터넷에서 쓰이는 것은 아니다. 몇 덩어리는 특별한 용도로 예약되어 있다. 가장 중요한 것은 사설 IP 주소(private address)다. 회사나 집 안에서 누구나 마음대로 쓸 수 있지만 인터넷으로는 나갈 수 없는 주소로, 1996년 RFC 1918이 정했다. 전 세계 수억 가정이 똑같이 192.168.0.1을 공유기 주소로 쓰는데도 충돌이 없는 이유다. 바깥으로 나갈 때는 NAT(아래)가 공인 주소로 바꿔 준다.

범위이름쓰임
10.0.0.0/8사설 (큰 것)대기업·데이터센터·클라우드 내부망. 약 1,677만 개
172.16.0.0/12사설 (중간)172.16.0.0~172.31.255.255. 약 105만 개. 172.32는 공인이니 주의
192.168.0.0/16사설 (작은 것)집 공유기의 기본값(192.168.0.x, 192.168.1.x 등)
127.0.0.0/8루프백(loopback)“나 자신”. 127.0.0.1로 보낸 패킷은 밖으로 나가지 않고 같은 컴퓨터로 돌아온다(localhost)
169.254.0.0/16링크 로컬 주소(link-local)DHCP 서버를 못 찾았을 때 기기가 스스로 붙이는 주소. 이 주소가 보이면 “주소 배정 실패” 신호
100.64.0.0/10공유 주소 (CGNAT)통신사가 가입자에게 주는 “두 번째 사설 주소”(RFC 6598)
224.0.0.0/4멀티캐스트한 번 보내 여러 수신자가 받는 그룹 주소(IPTV, 라우팅 프로토콜 등)
255.255.255.255제한 브로드캐스트“지금 이 LAN의 모두에게”. 라우터를 넘지 않는다. DHCP가 쓴다
0.0.0.0지정 안 됨아직 주소가 없는 기기의 출발지 주소. 라우팅 표에서는 “모든 곳”(기본 경로, 8장)
192.0.2.0/24 등문서용책과 예제에만 쓰는 주소(198.51.100.0/24, 203.0.113.0/24도). 이 장의 예시들도 이것을 쓴다

주소 빌리기(DHCP)와 이웃 찾기(ARP)

노트북을 처음 보는 Wi-Fi에 연결하면 주소, 마스크, 공유기 주소, DNS 서버 주소를 손으로 넣은 적이 없는데도 인터넷이 된다. DHCP(Dynamic Host Configuration Protocol) 덕분이다. 공유기 안의 DHCP 서버가 주소 묶음(예: 192.168.0.2~254)을 관리하며, 새로 온 기기에게 하나를 일정 기간 임대해 준다. 주고받는 메시지 네 개의 머리글자를 따서 DORA라 부른다.

STEP

DHCP DORA: 주소를 빌리는 네 번의 대화

Discover와 Request는 브로드캐스트라 같은 LAN의 모든 기기(휴대폰, TV)가 받지만 DHCP 서버가 아니므로 무시한다. 단순화: Offer와 ACK는 노트북에게만 가는 것으로 그렸다(실제로는 클라이언트 설정에 따라 브로드캐스트로 보내기도 한다). 임대 시간은 공유기마다 다르며 하루 정도가 흔하다.

주소를 얻은 노트북이 같은 LAN의 프린터 192.168.0.40에게 패킷을 보내려 한다. 그런데 이더넷과 Wi-Fi(6장, 13장)는 IP 주소가 아니라 MAC 주소로 프레임을 배달한다. 프린터의 MAC 주소는 어떻게 알까? ARP(Address Resolution Protocol)가 답이다. LAN 전체에 “192.168.0.40 쓰는 분, MAC 주소 알려 주세요” 하고 브로드캐스트로 외치면, 해당 기기만 자기 MAC을 적어 답한다. 답은 ARP 캐시에 잠시 저장해 두고 다음부터는 묻지 않는다.

목적지가 LAN 바깥(예: 8.8.8.8)이면? 노트북은 서브넷 마스크로 계산해 “다른 동네”임을 알고, 8.8.8.8이 아니라 기본 게이트웨이(공유기)의 MAC을 묻는다. IP 헤더의 목적지는 8.8.8.8 그대로 두고, 이더넷 프레임의 목적지만 공유기 MAC으로 적어 넘긴다. 택배 송장의 최종 주소는 그대로인데, 일단 동네 집하장 트럭에 싣는 것이다.

SIMULATOR

ARP: “이 IP 쓰는 분 누구세요?”

노트북(A)이 보낼 곳
 
노트북의 ARP 캐시: IP 주소MAC 주소남은 시간
보낸 ARP 요청 (브로드캐스트)0
캐시 적중 (묻지 않고 바로)0
괜히 방해받은 기기 수 누적0
해볼 것: 같은 곳으로 두 번 보내 보자. 두 번째는 캐시에 있어 묻지 않고 바로 간다. 그다음 ‘인터넷 8.8.8.8’을 고르면 노트북이 묻는 대상이 8.8.8.8이 아니라 공유기(.1)임을 확인하자. 캐시 항목은 이 시뮬레이터에서 45초 뒤 지워진다(실제 OS는 수십 초~수 분). 브로드캐스트는 모든 기기를 깨우므로 기기가 수천 대인 LAN에서는 ARP만으로도 부담이 된다. 이것이 큰 망을 서브넷으로 나누는 이유 중 하나다.
ARP는 거짓말을 믿는다

ARP에는 인증이 없다. 누군가 묻지도 않았는데 “공유기 IP는 내 MAC이야”라는 응답을 계속 뿌리면 이웃들의 캐시가 오염되어 모든 트래픽이 그 사람을 거쳐 가게 된다(ARP 스푸핑). 공용 Wi-Fi에서 HTTPS 같은 암호화(22장)가 중요한 이유다.

NAT: 대표 번호 하나로 온 가족이

집에는 휴대폰, 노트북, TV, 스피커까지 기기가 열 대 넘게 있지만, 통신사가 집에 주는 공인 IPv4 주소는 보통 하나다. 공유기의 NAT(Network Address Translation)가 이 문제를 푼다. 집 안 기기가 밖으로 패킷을 보내면, 공유기가 출발지 주소를 자기 공인 주소로 바꿔 적는다. 기기 여러 대가 동시에 나가도 구분할 수 있도록 출발지 포트 번호까지 바꾸고, 그 대응을 변환표에 적어 둔다. 포트까지 바꾸는 이 방식을 정확히는 PAT(Port Address Translation) 또는 NAPT라 하며, 집 공유기의 NAT는 사실상 모두 이것이다.

회사 대표 전화와 내선 번호

직원 100명이 바깥에 전화를 걸면 상대방 화면에는 모두 회사 대표 번호가 뜬다. 교환대는 “지금 거래처 A와 통화 중인 선은 내선 37번”이라고 적어 두었다가 상대가 말하면 37번으로 돌려준다. 그런데 바깥 사람이 대표 번호로 먼저 전화해 “아무나 바꿔 주세요” 하면? 교환대는 누구에게 연결할지 모른다. 미리 “고객 상담 문의는 내선 200번”이라고 정해 두지 않았다면.

SIMULATOR

공유기의 NAT 변환표 채우기

패킷 헤더기기를 고르고 ‘요청 보내기’를 누르세요.
보내는 기기
목적지
 
집 안 주소:포트공인 주소:포트상대방남은 시간
공인 IP 개수1개
변환표 항목0
버린 패킷 (표에 없음)0
해볼 것: 휴대폰과 노트북에서 한 번씩 요청을 보내 보자. 둘 다 출발지 포트로 50000을 골랐지만(각자 따로 고르니 겹칠 수 있다) 공유기는 바깥 포트를 40001, 40002로 다르게 줘서 답장을 정확히 되돌린다. 그다음 ‘바깥에서 먼저 접속’을 눌러 보자. 변환표에 없는 패킷이라 버려진다. 포트 포워딩을 켜면 TV로 들어간다. 단순화: 실제 공유기는 바깥 포트를 무작위로 고르고, 항목은 TCP 연결이 끝나거나 일정 시간(수십 초~수 분) 조용하면 지운다. 여기서는 60초.
예측해 보기

포트 포워딩을 끈 상태에서, 바깥의 친구가 우리 집 공인 IP의 8080번 포트로 먼저 접속하면 어떻게 될까?

NAT 시뮬레이터에서 포트 포워딩을 끄고 ‘바깥에서 먼저 접속’을 눌러 보자.

NAT 변환표는 안에서 밖으로 나간 패킷이 있을 때만 생긴다. 바깥에서 먼저 온 패킷은 누구에게 줄지 알 수 없어 버린다. 그래서 집에서 게임 서버나 NAS를 열려면 포트 포워딩 규칙을 직접 넣어야 한다. 부수적으로 이것은 간단한 방화벽 역할도 한다.

NAT의 부작용

IPv4 고갈과 IPv6

43억 개는 1981년에는 무한해 보였다. 하지만 PC, 휴대폰, 사물인터넷이 쏟아지며 바닥이 드러났다. 전 세계 주소를 총괄하는 IANA는 2011년 2월 마지막 /8 블록 다섯 개를 다섯 지역 인터넷 레지스트리(RIR)에 하나씩 나눠 주고 창고를 비웠다. 아시아·태평양의 APNIC은 두 달 뒤 사실상 소진됐고, 유럽(RIPE NCC), 남미(LACNIC), 북미(ARIN)가 뒤따랐다. 지금 IPv4 주소는 회사끼리 사고파는 “중고 자산”이 되어 주소 하나에 수십 달러 수준에 거래된다.

19801990200020102020 1981 IPv4 표준 (RFC 791) 1993 CIDR 도입 → 1994 NAT 제안 1996 사설 주소 (RFC 1918) 1998 IPv6 규격 (RFC 2460) 2011.2 IANA 마지막 블록 배분 → 2017 IPv6 정식 표준 2011 APNIC(아시아·태평양) 2012 RIPE NCC(유럽) 2014 LACNIC(남미) 2015 ARIN(북미) 빨간색: 지역 레지스트리별 IPv4 사실상 소진 시점(아프리카 AFRINIC은 2017년 이후 단계적 소진)
그림 7-3. IPv4 고갈 연표. CIDR(1993)과 NAT·사설 주소(1994~1996)는 원래 IPv6가 준비될 때까지 시간을 버는 임시방편이었지만, 너무 잘 통해서 30년을 버텼다.

근본 해결책은 주소를 늘리는 것이다. IPv6는 주소를 128비트로 키웠다. 2128 ≈ 3.4×1038개, 지구 표면 1제곱미터마다 약 6.7×1023개를 줄 수 있는 양이다. 집 하나의 LAN에 기본으로 주는 /64 서브넷 하나만 해도 1.8×1019개, IPv4 인터넷 전체의 40억 배가 넘는다. 주소가 넉넉하니 NAT가 필요 없고 모든 기기가 전 세계에서 유일한 주소를 가질 수 있다. 헤더도 고정 40바이트로 단순해졌고, 라우터가 패킷을 쪼개는 단편화(아래)와 헤더 체크섬을 없앴다.

IPv6 표기와 축약

128비트를 점과 십진수로 쓰면 16칸이나 되므로, IPv6는 16비트씩 8묶음으로 끊어 16진수로 쓰고 콜론으로 잇는다. 그래도 길어서 두 가지 축약 규칙이 있다. ① 각 묶음 앞의 0은 생략할 수 있다(0db8 → db8, 0000 → 0). ② 0으로만 된 묶음이 연달아 있으면 한 번만 ::로 줄일 수 있다(두 번 쓰면 각각 몇 묶음인지 알 수 없다). 표준 권장 표기(RFC 5952)는 소문자, 가장 긴 0 묶음 덩어리를 줄이고, 길이가 같으면 앞쪽을 줄이며, 0 묶음 하나만은 ::로 줄이지 않는다.

CONVERTER

IPv6 전체 주소 ↔ 축약형 변환기

예시
주소 종류—
네트워크 프리픽스 (앞 64비트)—
인터페이스 ID (뒤 64비트)—
글자 수—
해볼 것: ‘0 덩어리 둘’ 예시에서 0이 두 묶음씩 두 군데 있다. 길이가 같으므로 앞쪽만 ::가 된다. 축약형(2001:db8::1)을 입력하면 거꾸로 전체형을 복원한다. 인터페이스 ID 가운데에 ff:fe가 끼어 있으면 MAC 주소로 만든 EUI-64 방식이다. 이 변환기는 점 표기 IPv4를 끼운 형식(::ffff:1.2.3.4)은 다루지 않는다.

주소를 스스로 만드는 SLAAC

IPv6 기기는 DHCP 서버 없이도 주소를 만든다. 이를 SLAAC(Stateless Address Autoconfiguration)이라 한다. 라우터가 주기적으로(또는 요청받으면) “이 링크의 프리픽스는 2001:db8:1:2::/64”라는 라우터 광고(RA)를 보내면, 기기는 뒤 64비트 인터페이스 ID를 스스로 정해 붙인다. 예전에는 MAC 주소로 만들었지만(EUI-64) 어디서 접속하든 같은 꼬리가 남아 추적에 악용될 수 있어, 요즘 OS는 무작위 값을 쓰고 주기적으로 바꾼다. 같은 주소를 이미 누가 쓰는지는 NDP(IPv6판 ARP)로 물어 확인한다. ARP와 브로드캐스트는 IPv6에서 사라지고 멀티캐스트 기반 NDP가 그 역할을 맡는다.

이사는 아직 진행 중

IPv6는 IPv4와 호환되지 않는다. 그래서 지금은 기기와 망이 두 주소를 함께 쓰는 듀얼 스택(dual stack)으로 과도기를 보낸다. 웹사이트가 두 주소를 다 가지면 브라우저는 IPv6를 먼저 시도하고, 느리면 재빨리 IPv4로 바꾼다(Happy Eyeballs). 구글이 집계하는 자사 서비스 접속 중 IPv6 비율은 2025년 무렵 약 45~50% 수준이다. 나라와 통신사마다 차이가 커서 인도·프랑스·독일 등은 절반을 크게 넘고, IPv4 주소를 일찍 넉넉히 받은 곳은 상대적으로 낮다. 휴대폰 망은 IPv6 전용으로 운영하고 IPv4 사이트만 변환 장비(NAT64)로 연결하는 통신사도 많다.

단편화, MTU, 그리고 TTL

링크마다 한 번에 실을 수 있는 최대 크기, MTU가 다르다(이더넷은 보통 1,500바이트, 데이터센터의 점보 프레임은 9,000바이트, 6장). 큰 MTU 구간에서 온 4,000바이트 패킷이 1,500바이트 구간을 만나면? IPv4 라우터는 패킷을 여러 조각으로 자른다. 이를 단편화(fragmentation)라 한다. 조각마다 IP 헤더를 새로 붙이고, 같은 식별자와 “원래 패킷의 몇 번째 바이트부터인가(조각 오프셋)”, “뒤에 조각이 더 있다(MF 플래그)”를 적는다. 다시 맞추는 일은 최종 목적지만 한다.

원래 패킷 (4,000바이트) H데이터 3,980B 식별자 = 7001, MF = 0, 오프셋 = 0 라우터다음 MTU 1,500 1,480BMF=1 · 0 1,480BMF=1 · 185 1,020BMF=0 · 370 오프셋은 8바이트 단위: 1,480 ÷ 8 = 185 세 조각은 서로 다른 길로 가도 되고, 목적지가 식별자·오프셋을 보고 재조립한다. 조각 하나만 잃어도 4,000바이트 전체가 쓸모없어진다. 그래서 요즘은 경로 MTU를 미리 알아내 처음부터 작게 보내고(DF 플래그), IPv6는 라우터의 단편화를 아예 없앴다.
그림 7-4. IPv4 단편화. 각 조각은 헤더 20바이트 + 데이터 1,480바이트 이하. 조각 오프셋 필드(13비트)가 8바이트 단위인 것은 헤더 비트를 아끼려는 설계다.

단편화는 성능과 보안에 모두 골칫거리라 지금은 피하는 것이 원칙이다. 보내는 쪽이 “쪼개지 마시오(DF)” 표시를 하고 보내면, 너무 큰 패킷을 만난 라우터는 버리면서 ICMP 오류로 “이 구간 MTU는 1,500”이라고 알려 준다. 보내는 쪽은 크기를 줄여 다시 보낸다. 이를 경로 MTU 탐색(PMTUD)이라 한다. 방화벽이 이 ICMP를 막으면 작은 웹 페이지는 열리는데 큰 페이지만 멈추는 기묘한 장애가 생긴다(23장).

헤더의 TTL(Time To Live)은 라우터를 하나 지날 때마다 1씩 줄고, 0이 되면 그 라우터가 패킷을 버리고 출발지에 ICMP “시간 초과”를 알린다. 이름은 “생존 시간”이지만 실제로는 남은 홉 수다. 라우팅 설정 실수로 라우터 두 대가 서로에게 패킷을 넘기는 고리가 생겨도, 패킷이 영원히 돌며 링크를 가득 채우는 일을 막는다. 보통 64나 128로 시작한다. 8장의 traceroute는 이 TTL을 일부러 1, 2, 3…으로 보내 경로를 알아내는 영리한 도구다.

핵심 정리

  1. IP는 최선형·비연결형 배달을 한다. 패킷마다 출발지·목적지 주소, TTL, 프로토콜 번호가 적힌 20바이트 헤더를 단다.
  2. IPv4 주소는 32비트(약 43억 개). 앞쪽은 네트워크, 뒤쪽은 호스트이며 경계는 프리픽스 길이(/n) 또는 서브넷 마스크로 정한다(CIDR).
  3. 네트워크 주소 = IP AND 마스크, 브로드캐스트 = 호스트 비트 모두 1. 사용 가능 호스트 = 232−n − 2.
  4. 서브넷을 나누면 비트 하나마다 개수는 두 배, 크기는 절반. VLSM은 필요한 크기만큼 다른 길이로 떼어 낭비를 줄인다.
  5. 사설 주소(10/8, 172.16/12, 192.168/16)는 안에서만 쓰고, NAT(PAT)가 공인 IP 하나와 포트로 바꿔 내보낸다. 바깥에서 먼저 오는 연결은 막혀 포트 포워딩이 필요하다.
  6. DHCP는 Discover·Offer·Request·ACK로 주소를 임대하고, ARP는 브로드캐스트로 IP에 해당하는 MAC을 묻는다. LAN 바깥 목적지는 게이트웨이의 MAC을 묻는다.
  7. IPv4는 2011년 IANA에서 바닥났다. IPv6는 128비트(3.4×1038), 콜론 16진 표기와 :: 축약, SLAAC 자동 설정을 쓰며 듀얼 스택으로 보급 중이다(구글 기준 약 절반).
  8. MTU보다 큰 IPv4 패킷은 단편화된다. TTL은 홉마다 1씩 줄어 라우팅 고리에서 패킷이 영원히 도는 것을 막는다.

확인 퀴즈

192.168.1.130/26이 속한 네트워크의 네트워크 주소는?

/26의 마지막 바이트 마스크는 11000000(192)이다. 130 = 10000010이고 AND 하면 10000000 = 128. 이 서브넷은 .128~.191이며 브로드캐스트는 .191이다.

다음 중 사설 IP 주소가 아닌 것은?

172.16.0.0/12는 172.16.0.0~172.31.255.255까지다. 172.32.x.x는 인터넷의 공인 주소다.

DHCP Discover 메시지를 브로드캐스트(255.255.255.255)로 보내는 이유는?

출발지는 0.0.0.0, 목적지는 “이 LAN의 모두”로 보낼 수밖에 없다. 서버만 응답하고 나머지는 무시한다. 제한 브로드캐스트는 라우터를 넘지 않는다.

192.168.0.23/24인 노트북이 8.8.8.8로 패킷을 보낼 때, ARP로 MAC 주소를 묻는 대상은?

8.8.8.8은 다른 네트워크이므로 프레임은 일단 게이트웨이에게 간다. IP 헤더의 목적지는 8.8.8.8 그대로, 이더넷 목적지만 게이트웨이 MAC이다.

집 공유기(PAT)가 기기 세 대의 연결을 공인 IP 하나로 구분하는 방법은?

“공인IP:바깥포트 ↔ 내부IP:내부포트” 대응을 적어 두고, 답장의 목적지 포트로 표를 찾아 원래 기기로 되돌린다.

2001:0db8:0000:0000:0000:0000:0000:0001의 올바른 축약 표기는?

앞의 0만 생략할 수 있으므로 2001은 그대로, 0db8은 db8. 연속된 0 묶음 여섯 개를 ::로 한 번에 줄인다. ::: 같은 표기는 없다. 2001:db8::0:1도 해석은 되지만 가장 긴 덩어리를 다 줄이지 않아 권장 표기가 아니다.