icon

안동민 개발노트

2장 : 네트워크 모델과 계층 구조

TCP/IP 4계층 모델


OSI 7계층 모델은 네트워크를 이해하기 위한 훌륭한 참조 모델이지만, 실제 인터넷은 이 모델을 그대로 따르지 않습니다. 현실에서 인터넷의 동작을 설명하는 데 사용되는 것은 TCP/IP 4계층 모델입니다.

그렇다면 왜 OSI를 먼저 배웠을까요? OSI 모델이 각 계층의 역할을 더 세밀하게 나누어 놓았기 때문에, 네트워크의 동작 원리를 이해하는 데는 OSI가 더 좋은 학습 도구입니다. 하지만 실제 프로토콜 스택을 설명할 때는 TCP/IP 모델이 현실에 훨씬 가깝습니다.


OSI와 TCP/IP의 대응 관계

        OSI 7계층                       TCP/IP 4계층

┌───────────────────────┐          ┌──────────────────────┐
│ 7. 응용 (Application) │          │ 4. 응용 계층         │
│ 6. 표현 (Presentation)│ ───────▶ │    (Application)     │
│ 5. 세션 (Session)     │          └──────────────────────┘
├───────────────────────┤
│ 4. 전송 (Transport)   │ ───────▶ ┌──────────────────────┐
└───────────────────────┘          │ 3. 전송 계층         │
                                   │    (Transport)       │
┌───────────────────────┐          └──────────────────────┘
│ 3. 네트워크 (Network) │ ───────▶ ┌──────────────────────┐
└───────────────────────┘          │ 2. 인터넷 계층       │
                                   │    (Internet)        │
┌──────────────────────┐           └──────────────────────┘
│ 2. 데이터 링크       │
│ 1. 물리 (Physical)   │  ───────▶ ┌────────────────────────┐
└──────────────────────┘           │ 1. 네트워크 인터페이스 │
                                   │    (Network Interface) │
                                   └────────────────────────┘

OSI의 5~7계층이 TCP/IP의 응용 계층 하나로 통합됩니다. 세션 관리, 데이터 표현 변환, 실제 서비스 제공이 모두 응용 계층에서 처리됩니다.

OSI의 1~2계층이 TCP/IP의 네트워크 인터페이스 계층으로 합쳐집니다. 물리적 전송과 프레이밍을 함께 다룹니다.


각 계층 상세

응용 계층 (Application Layer)

사용자가 직접 상호작용하는 계층입니다. HTTP, DNS, SMTP 등 모든 응용 프로토콜이 여기에 속합니다.

프로토콜포트전송용도
HTTP80TCP웹 페이지 전송
HTTPS443TCP암호화된 웹
DNS53UDP/TCP도메인 → IP 변환
SMTP25TCP메일 전송
SSH22TCP원격 접속
FTP21TCP파일 전송
DHCP67/68UDPIP 자동 할당
NTP123UDP시간 동기화

개발자가 가장 많이 다루는 계층입니다. fetch(), axios, curl 등은 모두 이 계층에서 동작합니다.

전송 계층 (Transport Layer)

프로세스 간 데이터 전달을 담당합니다. TCP와 UDP가 핵심입니다.

transport_layer_demo.py
import socket

# TCP 소켓 (연결형, 신뢰성)
tcp_sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

# UDP 소켓 (비연결형, 빠름)
udp_sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

# 개발자는 소켓 API를 통해 전송 계층에 접근
# 소켓 = 응용 계층과 전송 계층 사이의 인터페이스

QUIC은 UDP 위에 구축된 차세대 전송 프로토콜로, HTTP/3의 기반입니다. TCP의 신뢰성과 UDP의 빠른 연결 설정을 결합했습니다.

인터넷 계층 (Internet Layer)

IP 프로토콜이 핵심이며, 서로 다른 네트워크 간의 라우팅을 담당합니다.

프로토콜역할
IPv432비트 주소, 현재 가장 널리 사용
IPv6128비트 주소, IPv4 고갈 대응
ICMP오류 보고, 진단 (ping)
ARPIP → MAC 주소 변환
IGMP멀티캐스트 그룹 관리
internet_layer_check.sh
# IP 주소 확인
ip addr show

# 라우팅 테이블 확인
ip route show

# ICMP로 연결 확인
ping -c 4 8.8.8.8

# 경로 추적
traceroute 8.8.8.8

# ARP 테이블 확인 (IP → MAC 매핑)
arp -n

네트워크 인터페이스 계층 (Network Interface Layer)

물리적 전송과 프레이밍을 담당합니다. 이더넷, Wi-Fi가 대표적입니다.

기술표준속도매체
이더넷IEEE 802.31/10/25/100 GbpsUTP, 광섬유
Wi-Fi 5IEEE 802.11ac~3.5 Gbps5GHz 전파
Wi-Fi 6IEEE 802.11ax~9.6 Gbps2.4/5/6GHz
5G NR3GPP~20 Gbps밀리미터파

현실에서 TCP/IP를 더 많이 쓰는 이유

가장 근본적인 이유는 순서가 반대였기 때문입니다.

OSI 모델은 먼저 이론을 정립하고, 그에 맞는 프로토콜을 만들겠다하향식(Top-down) 접근이었습니다. 반면 TCP/IP는 먼저 인터넷에서 실제로 동작하는 프로토콜을 만들고, 나중에 그것을 모델로 정리했다상향식(Bottom-up) 접근이었습니다.

OSI의 접근:   이론 정립 (1984) → 프로토콜 채택 시도 → 인터넷은 이미 TCP/IP
TCP/IP의 접근: 프로토콜 구현 (1974) → 인터넷 표준 (1983) → 모델 정리

인터넷이 폭발적으로 성장하는 동안 TCP/IP 프로토콜들은 이미 전 세계에서 사용되고 있었습니다. OSI 표준이 완성되었을 때는 이미 TCP/IP 기반의 인터넷이 사실상의 표준(de facto standard)이 된 뒤였습니다.


데이터 흐름 예시

웹 브라우저에서 https://example.com에 접속할 때 각 계층에서 어떤 일이 일어나는지 추적해 봅시다.

1. 응용 계층
   브라우저가 HTTP GET 요청 생성
   "GET / HTTP/1.1\r\nHost: example.com\r\n\r\n"

2. 전송 계층 (TCP)
   HTTP 메시지에 TCP 헤더 추가
   출발지 포트: 52341 (임의), 목적지 포트: 443 (HTTPS)
   순서 번호, ACK 번호 설정

3. 인터넷 계층 (IP)
   TCP 세그먼트에 IP 헤더 추가
   출발지 IP: 192.168.1.100, 목적지 IP: 93.184.216.34
   TTL: 64

4. 네트워크 인터페이스 계층 (이더넷)
   IP 패킷에 이더넷 헤더 추가
   출발지 MAC: 내 NIC, 목적지 MAC: 게이트웨이 MAC
   → 전기 신호로 변환하여 케이블로 전송
packet_structure.py
"""TCP/IP 각 계층의 헤더 크기를 계산하여
   전체 프레임에서 실제 데이터 비율을 확인"""

headers = {
    "이더넷 헤더": 14,
    "IP 헤더": 20,
    "TCP 헤더": 20,
    "FCS (트레일러)": 4,
}

total_overhead = sum(headers.values())
mtu = 1500  # 이더넷 MTU
max_payload = mtu - 20 - 20  # IP + TCP 헤더 제외
frame_total = mtu + 14 + 4   # 이더넷 헤더 + FCS 포함

print("=== 헤더 크기 ===")
for name, size in headers.items():
    print(f"  {name}: {size} bytes")

print(f"\n전체 프레임: {frame_total} bytes")
print(f"프로토콜 오버헤드: {total_overhead} bytes")
print(f"최대 페이로드: {max_payload} bytes")
print(f"데이터 효율: {max_payload/frame_total*100:.1f}%")

실무에서의 계층 참조

실무에서는 OSI와 TCP/IP를 혼용합니다. 대화할 때는 OSI 번호를 쓰면서, 실제 프로토콜은 TCP/IP 기준입니다.

실무 표현의미
L7 로드 밸런서HTTP 헤더/URL 기반 트래픽 분배 (ALB)
L4 로드 밸런서IP/포트 기반 트래픽 분배 (NLB)
L3 스위치라우팅 기능이 있는 스위치
L2 VLANMAC 기반 가상 네트워크 분리

다음 절에서는 이 계층들 사이에서 데이터가 실제로 어떻게 포장되고 전달되는지, 캡슐화와 역캡슐화를 살펴보겠습니다.

목차