이번 문서의 목표: 이 파일을 다 읽으면 IPv4 헤더의 주요 필드가 하는 일을 설명할 수 있고, 클래스별 주소 범위와 기본 마스크를 구분하며, 사설 IP 대역과 CIDR 표기를 읽고 쓸 수 있다.
네트워크 계층이 푸는 문제
09~11편에서 다룬 데이터링크 계층은 하나의 링크(예: 같은 스위치에 물린 장치들) 안에서만 통한다. MAC 주소는 그 링크를 벗어나면 아무 의미가 없다. 하지만 실제 통신은 전 세계에 흩어진, 서로 다른 링크에 있는 두 장치 사이에서 이루어져야 한다. 이 문제를 해결하는 것이 네트워크 계층(network layer)이다.
네트워크 계층은 크게 두 가지 일을 한다.
- 논리 주소 지정(logical addressing): 링크와 무관하게, 인터넷 전체에서 통하는 주소 체계(IP 주소)를 부여한다.
- 경로 선택(routing): 출발지에서 목적지까지 여러 개의 링크를 거쳐 가는 경로를 찾는다(14~15편에서 다룸).
이 편은 그중 논리 주소 지정, 특히 지금도 인터넷의 기본 골격을 이루는 IPv4(Internet Protocol version 4) 주소 체계를 다룬다. 03편에서 배운 OSI 3계층·TCP/IP 인터넷 계층이 바로 이 네트워크 계층에 해당하고, 02편에서 익힌 이진수·옥텟 감각이 이 편부터 본격적으로 쓰인다.
쉽게 말하면: 데이터링크 계층의 MAC 주소가 “건물 안의 호실 번호”라면, 네트워크 계층의 IP 주소는 “전국 어디서나 통하는 도로명 주소”다.
IPv4 헤더의 주요 필드
IPv4는 데이터(상위 계층에서 내려온 페이로드) 앞에 헤더(header)를 붙여서 패킷(packet, 정확히는 IP 데이터그램)을 만든다. 이 헤더에는 그 패킷을 어디로, 어떻게 보내야 하는지에 대한 정보가 담긴다. 시험에 자주 나오는 핵심 필드를 정리한다.
| 필드 | 크기 | 역할 |
|---|---|---|
| Version | 4비트 | IP 버전을 나타낸다. IPv4는 이 값이 항상 4다 |
| IHL (Internet Header Length) | 4비트 | 헤더의 길이를 4바이트 단위로 나타낸다. 옵션 필드가 없으면 최소값 5(= 20바이트)가 된다 |
| ToS/DSCP (Type of Service) | 8비트 | 패킷의 우선순위나 서비스 품질(QoS) 요구사항을 표시한다 |
| Total Length | 16비트 | 헤더를 포함한 패킷 전체의 길이(바이트 단위) |
| Identification | 16비트 | 하나의 데이터가 여러 조각(fragment)으로 나뉘었을 때, 같은 데이터에서 나온 조각임을 식별하는 값 |
| Flags | 3비트 | 단편화(fragmentation) 허용 여부와 추가 조각 존재 여부를 표시 |
| Fragment Offset | 13비트 | 단편화된 조각이 원래 데이터에서 몇 번째 위치부터인지 표시 |
| TTL (Time To Live) | 8비트 | 패킷이 통과할 수 있는 최대 라우터(홉) 수. 라우터를 하나 지날 때마다 1씩 감소하며 0이 되면 폐기된다 — 패킷이 라우팅 루프에 빠져 영원히 떠도는 것을 막는 안전장치 |
| Protocol | 8비트 | 이 패킷 안의 데이터가 상위 계층의 어떤 프로토콜(예: TCP는 6, UDP는 17, ICMP는 1)인지 표시 |
| Header Checksum | 16비트 | 헤더 부분만을 대상으로 한 09편의 체크섬 방식 오류 검출값. 라우터를 지날 때마다 TTL이 바뀌므로 매번 다시 계산된다 |
| Source Address | 32비트 | 출발지 IP 주소 |
| Destination Address | 32비트 | 목적지 IP 주소 |
| Options | 가변 길이 | 보안·경로 기록 등 부가 기능(실제로는 거의 쓰이지 않음) |
TTL 필드가 시험에서 특히 자주 나온다. “패킷이 라우터를 지날 때마다 값이 1씩 줄어들고, 이 값이 0이 되면 어떻게 되는가”라는 형태로 출제된다. 정답은 “해당 라우터가 그 패킷을 폐기하고, 필요하면 출발지에 ICMP 메시지를 보낸다”이며, 이 ICMP는 14편에서 다시 다룬다.
IPv4 주소의 구조
IPv4 주소는 32비트 길이의 숫자다. 사람이 읽기 편하도록 8비트씩(옥텟, octet) 네 부분으로 나누고, 각 부분을 10진수로 바꿔 마침표로 구분해서 쓴다. 이를 점 십진 표기법(dotted-decimal notation)이라 부른다.
32비트: 11000000.10101000.00000001.00000001
점 십진 표기: 192 .168 .1 .1한 옥텟(8비트)이 표현할 수 있는 값의 범위는 다음과 같다.
- 8: 한 옥텟의 비트 수
- 256: 0부터 255까지의 개수
따라서 IPv4 주소의 각 자리는 항상 0에서 255 사이의 값만 가질 수 있다. “256.1.1.1” 같은 표기는 애초에 존재할 수 없는 주소다.
네트워크부와 호스트부
IPv4 주소 32비트는 개념적으로 두 부분으로 나뉜다.
- 네트워크부(network part): 그 주소가 속한 네트워크(같은 대역)를 식별하는 앞부분
- 호스트부(host part): 그 네트워크 안에서 개별 장치를 식별하는 뒷부분
쉽게 말하면: 네트워크부는 “도시 이름”, 호스트부는 “그 도시 안의 집 번호”에 해당한다. 두 집이 같은 도시에 살면(네트워크부가 같으면) 라우터를 거치지 않고도 직접 통신할 수 있다.
클래스 기반 주소 체계 (Classful Addressing)
IPv4가 처음 설계될 때는 네트워크부와 호스트부의 경계를 클래스(class)라는 다섯 종류로 미리 정해 두었다. 지금은 CIDR(뒤에서 설명)이 이 방식을 대체했지만, 시험에서는 클래스별 범위와 기본 마스크를 정확히 구분하는 문제가 여전히 자주 나온다.
| 클래스 | 첫 옥텟의 시작 비트 | 주소 범위(첫 옥텟 기준) | 기본 서브넷 마스크 | 네트워크부 : 호스트부 | 용도 |
|---|---|---|---|---|---|
| A | 0 | 0–127 | 255.0.0.0 (/8) | 8비트 : 24비트 | 대규모 네트워크(호스트 수가 매우 많은 조직) |
| B | 10 | 128–191 | 255.255.0.0 (/16) | 16비트 : 16비트 | 중간 규모 네트워크 |
| C | 110 | 192–223 | 255.255.255.0 (/24) | 24비트 : 8비트 | 소규모 네트워크(일반 가정·소기업) |
| D | 1110 | 224–239 | (마스크 개념 없음) | — | 멀티캐스트 전용 |
| E | 1111 | 240–255 | (마스크 개념 없음) | — | 실험·예약용 |
클래스를 구분하는 원리는 첫 옥텟의 맨 앞 비트 패턴이다. 예를 들어 192.168.1.1의 첫 옥텟 192를 2진수로 바꾸면 11000000이며, 맨 앞 두 비트가 11, 세 번째 비트가 0인 패턴(110)이므로 클래스 C에 속한다.
자주 틀리는 점: 클래스 A의 범위가 0–127로 128개나 되는데 왜 실제로는 그렇게 크게 안 쓰이는지, 그리고 127로 시작하는 주소(127.0.0.0/8)가 사실은 루프백(loopback, 자기 자신을 가리키는 특수 대역, 예: 127.0.0.1)으로 예약되어 있어 일반 호스트 주소로 쓰이지 않는다는 점을 놓치기 쉽다.
사설 IP 주소 대역
인터넷에 직접 연결되는 주소를 공인 IP 주소(public IP address)라 하고, 조직 내부에서만 쓰고 인터넷으로는 직접 나가지 않는 주소를 사설 IP 주소(private IP address)라 한다. IETF는 각 클래스에서 하나씩, 총 세 개의 대역을 사설 주소 전용으로 예약해 두었다(RFC 1918).
| 클래스 | 사설 IP 대역 | CIDR 표기 | 사용 가능한 호스트 수(이론상) |
|---|---|---|---|
| A | 10.0.0.0 – 10.255.255.255 | 10.0.0.0/8 | 약 1600만 개 |
| B | 172.16.0.0 – 172.31.255.255 | 172.16.0.0/12 | 약 100만 개 |
| C | 192.168.0.0 – 192.168.255.255 | 192.168.0.0/16 | 약 6만 5000개 |
사설 IP 주소는 전 세계 어디서나 조직 내부에서 중복해서 자유롭게 재사용할 수 있다. 우리 집 공유기와 옆집 공유기가 똑같이 192.168.0.1을 쓰고 있어도 문제가 없는 이유가 바로 이것이다. 사설 IP를 쓰는 장치가 인터넷에 나가려면 16편에서 다룰 NAT(Network Address Translation, 네트워크 주소 변환)를 거쳐 공인 IP로 바꿔야 한다.
쉽게 말하면: 사설 IP는 회사 내선 번호와 비슷하다. 여러 회사가 똑같은 “내선 101번”을 쓸 수 있지만, 외부로 전화를 걸려면(인터넷에 나가려면) 대표 번호(공인 IP, NAT)를 거쳐야 한다.
서브넷 마스크
서브넷 마스크(subnet mask)는 32비트 주소 중 어디까지가 네트워크부이고 어디부터가 호스트부인지를 표시하는 32비트 값이다. 네트워크부에 해당하는 자리는 1로, 호스트부에 해당하는 자리는 0으로 채운다.
예를 들어 클래스 C의 기본 마스크 255.255.255.0을 2진수로 풀면 다음과 같다.
255.255.255.0 = 11111111.11111111.11111111.00000000
└────────── 네트워크부(24비트) ──────────┘└ 호스트부(8비트) ┘주어진 IP 주소와 서브넷 마스크를 비트 단위 AND 연산하면 그 주소가 속한 네트워크 주소를 얻을 수 있다. 예를 들어 IP 주소 192.168.1.10과 마스크 255.255.255.0을 AND 연산하면 다음과 같다.
11000000.10101000.00000001.00001010 (192.168.1.10)
& 11111111.11111111.11111111.00000000 (255.255.255.0)
------------------------------------
11000000.10101000.00000001.00000000 (192.168.1.0 — 네트워크 주소)이렇게 얻은 네트워크 주소는 “이 장치가 어느 네트워크에 속해 있는지”를 나타낸다. 서브넷을 실제로 여러 개로 쪼개서 계산하는 문제(네트워크 주소·브로드캐스트 주소·호스트 수 계산)는 13편에서 본격적으로 다룬다.
CIDR — 클래스의 한계를 넘어선 표기법
쉽게 말하면: CIDR은 “네트워크부가 몇 비트인지”를 클래스로 정하지 않고 숫자 하나로 자유롭게 표시하는 방법이다.
클래스 기반 주소 체계에는 심각한 낭비 문제가 있었다. 예를 들어 호스트가 300대 필요한 조직은 클래스 C(호스트부 8비트, 최대 254대) 하나로는 부족해 클래스 B(호스트부 16비트, 최대 6만 5000여 대) 전체를 할당받아야 했다. 이렇게 되면 나머지 수만 개의 주소가 낭비된다.
CIDR(Classless Inter-Domain Routing, 클래스 없는 도메인 간 라우팅)은 이 문제를 해결하기 위해, 네트워크부의 길이를 클래스에 얽매이지 않고 원하는 비트 수만큼 자유롭게 정할 수 있게 했다. 표기 방법은 IP 주소 뒤에 슬래시(/)와 네트워크부의 비트 수를 붙이는 것이다.
192.168.1.0/24이 표기는 “192.168.1.0이라는 주소에서, 앞쪽 24비트가 네트워크부다”라는 뜻이다. /24는 앞서 본 마스크 255.255.255.0과 완전히 같은 의미를 숫자 하나로 표현한 것이다.
| CIDR 접두사 | 이진수 마스크 | 점 십진 마스크 | 클래스 대응 |
|---|---|---|---|
| /8 | 11111111.00000000.00000000.00000000 | 255.0.0.0 | 클래스 A 기본 마스크와 동일 |
| /16 | 11111111.11111111.00000000.00000000 | 255.255.0.0 | 클래스 B 기본 마스크와 동일 |
| /24 | 11111111.11111111.11111111.00000000 | 255.255.255.0 | 클래스 C 기본 마스크와 동일 |
| /26 | 11111111.11111111.11111111.11000000 | 255.255.255.192 | 클래스 경계에 얽매이지 않는 CIDR 전용 표기 |
/26처럼 클래스 경계(8의 배수)와 무관한 값을 쓸 수 있다는 점이 CIDR의 핵심이다. 이를 이용하면 호스트가 300대 필요한 조직에게 클래스 B 전체를 주는 대신, 필요한 만큼만 딱 맞춰 여러 개의 CIDR 블록을 나눠 줄 수 있다. 이 “필요한 만큼 쪼개는” 실제 계산 과정이 13편의 서브네팅·VLSM 주제로 이어진다.
자주 틀리는 점: CIDR 표기의 슬래시 뒤 숫자를 “호스트 수”로 착각하는 경우가 있다. /24는 네트워크부의 비트 수이지 호스트 수가 아니다. 호스트부 비트 수는 (32 − CIDR 접두사)이며, 실제 사용 가능한 호스트 수 계산은 13편에서 다룬다.
핵심 정리
- 네트워크 계층은 링크에 종속되지 않는 논리 주소(IP 주소)를 부여하고, 출발지에서 목적지까지의 경로를 찾는다.
- IPv4 헤더의 TTL은 패킷이 라우터를 지날 때마다 1씩 감소하며 0이 되면 폐기되어 라우팅 루프를 방지하고, Protocol 필드는 상위 계층 프로토콜(TCP=6, UDP=17, ICMP=1)을 표시한다.
- IPv4 주소는 32비트이며 8비트씩 네 옥텟으로 나눠 점 십진 표기법으로 쓴다. 각 옥텟은 0부터 255까지의 값만 가진다.
- 클래스 A는 0–127(기본 마스크 /8), 클래스 B는 128–191(기본 마스크 /16), 클래스 C는 192–223(기본 마스크 /24)이며, 127로 시작하는 대역은 루프백 전용으로 예약되어 일반 호스트 주소로 쓰이지 않는다.
- 사설 IP 대역은 클래스별로 하나씩 총 세 개(10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16)가 예약되어 있으며, 인터넷에 나가려면 NAT를 거쳐야 한다.
- CIDR은 네트워크부의 비트 수를 클래스에 얽매이지 않고 슬래시 표기(예: /24)로 자유롭게 나타내는 방법이며, 서브네팅의 기초가 된다.