데이터 전송의 기본 원리
네트워크가 무엇이고 인터넷이 어떤 구조인지 이해했다면, 이제 그 안에서 데이터가 실제로 어떻게 전달되는지를 들여다볼 차례입니다.
인터넷이 느리다라는 말을 할 때, 정확히 무엇이 느린 것인지 자신 있게 대답할 수 있는 사람은 많지 않습니다. 이 절에서 다루는 교환 방식과 성능 지표를 이해하면, 그 질문에 답할 수 있게 됩니다.
회선 교환 vs 패킷 교환
데이터를 목적지까지 전달하는 방식은 크게 두 가지입니다.
회선 교환(Circuit Switching)은 통신을 시작하기 전에 송신자와 수신자 사이에 전용 경로(회선)를 미리 설정하는 방식입니다.
회선 교환: 전용 경로 독점
[A] ════════════════════════> [B] (통화 중 — 회선 점유)
다른 이용자 사용 불가과거의 전화 통화를 떠올리면 됩니다. 전화를 걸면 두 사람 사이에 전용 회선이 할당되고, 통화가 끝날 때까지 이 회선은 다른 사용자가 사용할 수 없습니다. 대역폭이 안정적으로 보장되지만, 대화가 잠시 멈추는 순간에도 회선을 계속 점유하기 때문에 자원 낭비가 심합니다.
패킷 교환(Packet Switching)은 데이터를 패킷(Packet)이라는 작은 단위로 나누어 독립적으로 전송하는 방식입니다.
패킷 교환: 링크 공유
[A] ──P1──→ [R1] ──P1──→ [R2] ──P1──→ [B]
[C] ──P2──→ [R1] ──P2──→ [R3] ──P2──→ [D]
같은 링크를 시분할 공유각 패킷은 목적지 주소를 가지고 있으며, 네트워크 상황에 따라 서로 다른 경로를 통해 목적지에 도달할 수 있습니다. 도착하면 원래 순서대로 재조립됩니다.
| 비교 | 회선 교환 | 패킷 교환 |
|---|---|---|
| 연결 방식 | 통신 전 경로 설정 | 경로 설정 없음 |
| 전용 경로 | 있음 (독점) | 없음 (공유) |
| 자원 효율 | 낮음 (유휴 시에도 점유) | 높음 (사용 시에만 점유) |
| 지연 | 일정 (보장) | 가변 (혼잡에 따라) |
| 확장성 | 낮음 | 높음 |
| 장애 내성 | 낮음 (경로 끊기면 통신 중단) | 높음 (우회 가능) |
| 적합한 용도 | 과거 음성 전화 | 인터넷 |
오늘날의 인터넷은 전적으로 패킷 교환 방식을 기반으로 동작합니다.
패킷의 구조
패킷은 크게 헤더(Header)와 페이로드(Payload)로 구성됩니다.
┌──────────────────────────────────────────────┐
│ 이더넷 프레임 │
│ ┌──────────────────────────────────────────┐ │
│ │ MAC 헤더 │ IP 헤더 │ TCP 헤더 │ 데이터 │ │
│ │ 14B │ 20B │ 20B │ Payload │ │
│ └──────────────────────────────────────────┘ │
│ └── 트레일러 (FCS 4B) ─────────────────────┘ │
└──────────────────────────────────────────────┘헤더는 패킷의 메타데이터를 담고 있습니다. 출발지 주소, 목적지 주소, 프로토콜 정보, 순서 번호 등이 포함됩니다. 택배 상자에 붙이는 송장이라고 생각하면 직관적입니다.
페이로드는 실제로 전달하려는 데이터, 즉 "상자 안의 물건"입니다.
네트워크의 각 계층은 패킷에 자신만의 헤더를 추가합니다. 이 과정을 캡슐화(Encapsulation)라고 합니다.
애플리케이션: [HTTP 데이터]
전송 계층: [TCP 헤더][HTTP 데이터] → 세그먼트
네트워크 계층: [IP 헤더][TCP 헤더][HTTP 데이터] → 패킷
데이터 링크: [MAC 헤더][IP 헤더][TCP 헤더][HTTP 데이터][FCS] → 프레임수신 측에서는 역순으로 각 계층의 헤더를 벗겨내며(역캡슐화), 최종적으로 애플리케이션 데이터를 얻습니다.
MTU와 단편화
MTU(Maximum Transmission Unit)는 한 번에 전송할 수 있는 최대 패킷 크기입니다. 이더넷의 기본 MTU는 1500바이트입니다.
ETHERNET_MTU = 1500
IP_HEADER = 20
TCP_HEADER = 20
MSS = ETHERNET_MTU - IP_HEADER - TCP_HEADER # Maximum Segment Size
print(f"MTU: {ETHERNET_MTU} bytes")
print(f"IP 헤더: {IP_HEADER} bytes")
print(f"TCP 헤더: {TCP_HEADER} bytes")
print(f"MSS (실제 데이터): {MSS} bytes")
# 10KB 파일 전송 시 필요한 세그먼트 수
file_size = 10 * 1024
segments = -(-file_size // MSS) # 올림 나눗셈
print(f"\n10KB 전송 → {segments}개 세그먼트 필요")페이로드가 MTU를 초과하면 단편화(Fragmentation)가 발생합니다. IP 계층에서 패킷을 잘라 여러 개로 나누고, 수신 측에서 재조립합니다. 단편화는 오버헤드를 유발하므로, 현대 네트워크에서는 Path MTU Discovery를 통해 경로상 최소 MTU를 파악하고 단편화를 피합니다.
지연, 대역폭, 처리량
네트워크 성능을 논할 때 반드시 구분해야 하는 세 가지 핵심 지표입니다.
지연 (Latency)
지연(Latency)은 데이터가 출발지에서 목적지까지 도달하는 데 걸리는 시간입니다.
전체 지연 = 전파 지연 + 전송 지연 + 처리 지연 + 큐잉 지연
[송신] ──전송──→ [라우터 큐] ──처리──→ [링크] ──전파──→ [수신]
↑ ↑ ↑ ↑
Transmission Queuing Processing Propagation| 지연 유형 | 원인 | 크기 | 줄이는 방법 |
|---|---|---|---|
| 전파 지연 | 물리적 거리 | 수~수십 ms | 서버를 가까이 배치 (CDN) |
| 전송 지연 | 패킷 크기 / 대역폭 | 수 μs~ms | 대역폭 확장, 데이터 압축 |
| 처리 지연 | 라우터 헤더 검사 | 수 μs | 고성능 라우터 |
| 큐잉 지연 | 트래픽 혼잡 | 가변 (수 ms~) | 혼잡 제어, 트래픽 분산 |
# RTT(Round-Trip Time) 측정
ping -c 10 google.com
# 결과: min/avg/max/mdev = 3.2/4.1/5.8/0.7 ms
# 경로별 지연 측정
traceroute -n google.com
# 각 홉(라우터)에서의 RTT를 확인
# HTTP 요청의 각 단계별 시간 측정
curl -w "\nDNS: %{time_namelookup}s\nConnect: %{time_connect}s\nTLS: %{time_appconnect}s\nFirst byte: %{time_starttransfer}s\nTotal: %{time_total}s\n" -o /dev/null -s https://example.com대역폭과 처리량
대역폭(Bandwidth)은 단위 시간당 전송할 수 있는 최대 데이터량입니다. 도로에 비유하면 차선 수에 해당합니다.
처리량(Throughput)은 실제로 전송된 데이터량입니다. 혼잡, 패킷 손실, 프로토콜 오버헤드로 인해 처리량은 항상 대역폭보다 낮습니다.
def calculate_throughput(bandwidth_mbps, packet_loss_pct, overhead_pct):
"""실제 처리량 추정"""
effective = bandwidth_mbps * (1 - packet_loss_pct / 100)
effective *= (1 - overhead_pct / 100)
return effective
# 1Gbps 회선, 패킷 손실 0.1%, 프로토콜 오버헤드 5%
throughput = calculate_throughput(1000, 0.1, 5)
print(f"대역폭: 1000 Mbps")
print(f"실제 처리량: {throughput:.1f} Mbps")
# 대용량 파일 전송 시간 추정
file_size_gb = 10
transfer_time = (file_size_gb * 8 * 1024) / throughput
print(f"\n10GB 파일 전송: {transfer_time:.0f}초 ({transfer_time/60:.1f}분)")핵심 비유: 대역폭은 파이프의 굵기, 지연은 파이프의 길이, 처리량은 실제로 흐르는 물의 양입니다.
병목과 혼잡의 차이
네트워크가 느리다라는 증상은 같지만, 원인은 크게 두 가지로 나뉩니다.
병목(Bottleneck)은 경로 중 가장 좁은(대역폭이 낮은) 구간이 전체 성능을 제한하는 현상입니다.
서버 ──1Gbps──→ 라우터 ──1Gbps──→ ISP ──100Mbps──→ 사용자
↑
병목 지점!
처리량 상한 = 100Mbps혼잡(Congestion)은 특정 지점에 트래픽이 한꺼번에 몰려 큐잉 지연이 급증하는 현상입니다.
[A] ──→ ┐
[B] ──→ ├─→ [라우터] ──→ (1Gbps 링크) → [서버]
[C] ──→ ┘ ↑ 버퍼 가득!
3Gbps 유입 > 1Gbps 유출
→ 큐잉 지연 급증, 패킷 드롭라우터의 버퍼가 가득 차면 새로 도착하는 패킷을 버릴 수밖에 없는데(패킷 손실), 송신 측이 손실된 패킷을 재전송하면서 트래픽이 더 증가하고, 혼잡이 악화되는 혼잡 붕괴(Congestion Collapse)가 발생할 수 있습니다.
| 구분 | 병목 | 혼잡 |
|---|---|---|
| 원인 | 경로 중 최소 대역폭 | 트래픽 집중 |
| 특성 | 항상 존재 (구조적) | 일시적 (동적) |
| 증상 | 처리량 상한 제한 | 지연 급증, 패킷 손실 |
| 해결 | 회선 업그레이드, CDN | 혼잡 제어, 로드 밸런싱 |
# 경로상 병목 확인
mtr -rw -c 20 example.com
# 각 홉의 패킷 손실률과 지연을 확인
# 대역폭 측정 (서버 필요)
iperf3 -c server.example.com -t 30
# → 실제 achievable throughput 측정이어지는 장에서는 이처럼 복잡한 네트워크의 동작을 체계적으로 이해하기 위해, 통신을 계층별로 분리하는 모델을 살펴보겠습니다.