UDP의 구조
UDP의 구조
1. UDP란?
UDP 개념
┌─────────────────────────────────────────────────────────────┐
│ UDP (User Datagram Protocol) │
├─────────────────────────────────────────────────────────────┤
│ │
│ 정의: │
│ • 전송 계층에서 동작하는 비연결형 프로토콜 │
│ • 신뢰성보다 속도와 효율성을 중시 │
│ • 간단한 헤더 구조 (8바이트 고정) │
│ │
│ 핵심 특징: │
│ ───────────────────────────────────────── │
│ • 비연결형 (Connectionless) │
│ • 신뢰성 보장 없음 (No Reliability) │
│ • 순서 보장 없음 (No Ordering) │
│ • 빠른 전송 (Fast) │
│ • 낮은 오버헤드 (Low Overhead) │
│ • 브로드캐스트/멀티캐스트 지원 │
│ │
│ │
│ 이름 유래: │
│ ───────────────────────────────────────── │
│ User Datagram Protocol │
│ └─┬─┘ └──┬───┘ │
│ │ └─ 데이터그램: 독립적인 데이터 패킷 │
│ └─ 사용자: 애플리케이션 레벨 │
│ │
└─────────────────────────────────────────────────────────────┘TCP vs UDP 비교
┌─────────────────────────────────────────────────────────────┐
│ TCP vs UDP │
├─────────────────────────────────────────────────────────────┤
│ │
│ [TCP - 연결 지향형] │
│ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ │
│ │
│ 전화 통화와 비슷: │
│ 1. 전화를 건다 (3-Way Handshake) │
│ 2. 대화를 나눈다 (데이터 전송) │
│ 3. 전화를 끊는다 (4-Way Handshake) │
│ │
│ [송신측] [수신측] │
│ │ │ │
│ │── 통화할래? ────────→│ │
│ │←─── 좋아! ──────────┤ │
│ │── 시작! ────────────→│ │
│ │ │ 연결 설정 │
│ │ │ │
│ │── 안녕하세요 ───────→│ │
│ │←─── 잘 들렸어! ─────┤ 확인 응답 │
│ │── 반가워요 ─────────→│ │
│ │←─── 잘 들렸어! ─────┤ │
│ │ │ │
│ │
│ • 신뢰성: 확실히 전달됨 ✓ │
│ • 속도: 느림 (연결 설정, ACK 대기) │
│ │
│ │
│ [UDP - 비연결형] │
│ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ │
│ │
│ 편지/엽서와 비슷: │
│ 1. 편지를 쓴다 │
│ 2. 우체통에 넣는다 │
│ 3. 끝! (받았는지 확인 안 함) │
│ │
│ [송신측] [수신측] │
│ │ │ │
│ │── 데이터 1 ─────────→│ 받음 ✓ │
│ │ │ │
│ │── 데이터 2 ─────────→│ 손실 ✗ │
│ │ │ │
│ │── 데이터 3 ─────────→│ 받음 ✓ │
│ │ │ │
│ │ (확인 안 함!) │ │
│ │
│ • 신뢰성: 보장 안 됨 (손실 가능) │
│ • 속도: 빠름 (연결 없음, ACK 없음) │
│ │
└─────────────────────────────────────────────────────────────┘2. UDP 헤더 구조
UDP 헤더 상세
┌─────────────────────────────────────────────────────────────┐
│ UDP 헤더 구조 (8바이트 고정) │
├─────────────────────────────────────────────────────────────┤
│ │
│ 비트: 0 16 31 │
│ ├────────────────────┼────────────────────┤ │
│ 0 │ 출발지 포트 │ 목적지 포트 │ │
│ │ (Source Port) │ (Destination Port) │ │
│ │ 16비트 │ 16비트 │ │
│ ├────────────────────┼────────────────────┤ │
│ 32 │ 길이 (Length) │ 체크섬 (Checksum) │ │
│ │ 16비트 │ 16비트 │ │
│ ├────────────────────┴────────────────────┤ │
│ 64 │ │ │
│ │ 데이터 (Data) │ │
│ │ ... │ │
│ │ │ │
│ └─────────────────────────────────────────┘ │
│ │
│ 총 헤더 크기: 8바이트 (고정) │
│ TCP 헤더: 20~60바이트 (가변) │
│ │
│ → UDP가 TCP보다 헤더가 훨씬 간단! │
│ │
└─────────────────────────────────────────────────────────────┘각 필드 설명
┌─────────────────────────────────────────────────────────────┐
│ UDP 헤더 필드 설명 │
├─────────────────────────────────────────────────────────────┤
│ │
│ 1. 출발지 포트 (Source Port) - 16비트 │
│ ───────────────────────────────────────── │
│ • 송신측 애플리케이션의 포트 번호 │
│ • 범위: 0 ~ 65535 │
│ • 선택사항: 응답이 필요 없으면 0으로 설정 가능 │
│ │
│ 예시: │
│ - DNS 쿼리 클라이언트: 52341 │
│ - 스트리밍 클라이언트: 49152 │
│ │
│ │
│ 2. 목적지 포트 (Destination Port) - 16비트 │
│ ───────────────────────────────────────── │
│ • 수신측 애플리케이션의 포트 번호 │
│ • 필수 필드 │
│ │
│ 예시: │
│ - DNS 서버: 53 │
│ - DHCP 서버: 67 │
│ - TFTP: 69 │
│ │
│ │
│ 3. 길이 (Length) - 16비트 │
│ ───────────────────────────────────────── │
│ • UDP 헤더 + 데이터의 전체 길이 (바이트) │
│ • 최소값: 8 (헤더만 있는 경우) │
│ • 최대값: 65535 (2^16 - 1) │
│ │
│ 계산: │
│ 길이 = UDP 헤더(8바이트) + 데이터 크기 │
│ │
│ 예시: │
│ - 데이터 100바이트 → 길이 = 8 + 100 = 108바이트 │
│ - 데이터 1000바이트 → 길이 = 8 + 1000 = 1008바이트 │
│ │
│ │
│ 4. 체크섬 (Checksum) - 16비트 │
│ ───────────────────────────────────────── │
│ • 데이터 오류 검출용 │
│ • IPv4에서는 선택사항 (0으로 설정 가능) │
│ • IPv6에서는 필수 │
│ • UDP 헤더 + 데이터 + 의사 헤더를 포함하여 계산 │
│ │
│ 목적: │
│ - 전송 중 데이터 손상 감지 │
│ - 잘못된 목적지 전달 방지 │
│ │
│ │
│ 의사 헤더 (Pseudo Header): │
│ ───────────────────────────────────────── │
│ 체크섬 계산 시 IP 헤더의 일부 정보 포함: │
│ • 출발지 IP 주소 │
│ • 목적지 IP 주소 │
│ • 프로토콜 (UDP = 17) │
│ • UDP 길이 │
│ │
│ → IP 주소 오류 감지 가능! │
│ │
└─────────────────────────────────────────────────────────────┘TCP 헤더와 비교
┌─────────────────────────────────────────────────────────────┐
│ TCP 헤더 vs UDP 헤더 │
├─────────────────────────────────────────────────────────────┤
│ │
│ TCP 헤더 (20~60 바이트): │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ 출발지 포트 (16비트) │ 목적지 포트 (16비트) │ │
│ ├─────────────────────────────────────────────────────┤ │
│ │ 순서 번호 (Sequence Number) - 32비트 │ │
│ ├─────────────────────────────────────────────────────┤ │
│ │ 확인 응답 번호 (ACK Number) - 32비트 │ │
│ ├──────┬──────┬────────────────────────────────────┤ │
│ │헤더 │예약 │플래그 │ 윈도우 크기 │ │
│ │길이 │(6bit)│(6bit) │ (16비트) │ │
│ ├──────┴──────┴───────┴──────────────────────────────┤ │
│ │ 체크섬 (16비트) │ 긴급 포인터 (16비트) │ │
│ ├─────────────────────────────────────────────────────┤ │
│ │ 옵션 (0~40 바이트) │ │
│ ├─────────────────────────────────────────────────────┤ │
│ │ 데이터 │ │
│ └─────────────────────────────────────────────────────┘ │
│ │
│ UDP 헤더 (8 바이트 고정): │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ 출발지 포트 (16비트) │ 목적지 포트 (16비트) │ │
│ ├─────────────────────────────────────────────────────┤ │
│ │ 길이 (16비트) │ 체크섬 (16비트) │ │
│ ├─────────────────────────────────────────────────────┤ │
│ │ 데이터 │ │
│ └─────────────────────────────────────────────────────┘ │
│ │
│ │
│ TCP에 있지만 UDP에 없는 것: │
│ ───────────────────────────────────────── │
│ ✗ 순서 번호 → 순서 보장 안 됨 │
│ ✗ 확인 응답 번호 → 신뢰성 보장 안 됨 │
│ ✗ 플래그 (SYN, ACK, FIN) → 연결 개념 없음 │
│ ✗ 윈도우 크기 → 흐름 제어 없음 │
│ ✗ 옵션 → 확장 기능 없음 │
│ │
│ → UDP는 최소한의 기능만 제공! │
│ │
└─────────────────────────────────────────────────────────────┘3. UDP 데이터그램
데이터그램 개념
┌─────────────────────────────────────────────────────────────┐
│ UDP 데이터그램 (Datagram) │
├─────────────────────────────────────────────────────────────┤
│ │
│ 정의: │
│ • UDP 헤더가 붙은 데이터 단위 │
│ • 독립적으로 전송되는 자기 완결적 패킷 │
│ • 다른 데이터그램과 무관하게 처리됨 │
│ │
│ │
│ 구조: │
│ ───────────────────────────────────────── │
│ │
│ [애플리케이션 계층] │
│ │ │
│ ↓ 데이터 │
│ ┌─────────────────────────────────────────┐ │
│ │ 애플리케이션 데이터 │ │
│ │ (예: DNS 쿼리) │ │
│ └─────────────────────────────────────────┘ │
│ │ │
│ ↓ UDP 헤더 추가 (전송 계층) │
│ ┌──────────┬──────────────────────────────┐ │
│ │UDP 헤더 │ 애플리케이션 데이터 │ │
│ │(8바이트) │ │ │
│ └──────────┴──────────────────────────────┘ │
│ ↑ │
│ └──────── UDP 데이터그램 ────────── │
│ │ │
│ ↓ IP 헤더 추가 (네트워크 계층) │
│ ┌─────┬──────────┬───────────────────────┐ │
│ │ IP │UDP 헤더 │ 애플리케이션 데이터 │ │
│ │헤더 │(8바이트) │ │ │
│ └─────┴──────────┴───────────────────────┘ │
│ ↑ │
│ └──────── IP 데이터그램 ──────────── │
│ │
└─────────────────────────────────────────────────────────────┘데이터그램 특징
┌─────────────────────────────────────────────────────────────┐
│ 데이터그램 vs 세그먼트 │
├─────────────────────────────────────────────────────────────┤
│ │
│ UDP 데이터그램: │
│ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ │
│ │
│ [데이터그램 1] [데이터그램 2] [데이터그램 3] │
│ │ │ │ │
│ ↓ ↓ ↓ │
│ 독립적 독립적 독립적 │
│ │
│ • 각 데이터그램은 서로 무관 │
│ • 순서 보장 없음 (3번이 1번보다 먼저 도착 가능) │
│ • 연결 상태 없음 │
│ • 손실되어도 재전송 안 함 │
│ │
│ │
│ TCP 세그먼트: │
│ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ │
│ │
│ [세그먼트 1] → [세그먼트 2] → [세그먼트 3] │
│ │ │ │ │
│ └───────────────┴───────────────┘ │
│ 연결됨 │
│ │
│ • 모든 세그먼트가 하나의 연결에 속함 │
│ • 순서 보장 (Seq 번호) │
│ • 연결 상태 유지 │
│ • 손실 시 재전송 │
│ │
└─────────────────────────────────────────────────────────────┘4. UDP 통신 과정
비연결형 통신
┌─────────────────────────────────────────────────────────────┐
│ UDP 통신 과정 │
├─────────────────────────────────────────────────────────────┤
│ │
│ TCP와 비교: │
│ │
│ [TCP - 연결 지향형] │
│ ───────────────────────────────────────── │
│ │
│ [클라이언트] [서버] │
│ │ │ │
│ │ 1. 연결 설정 (3-Way Handshake) │ │
│ ├────────────────────────────────────────→│ │
│ │ │ │
│ │ 2. 데이터 전송 (ACK 확인) │ │
│ ├────────────────────────────────────────→│ │
│ │←────────────────────────────────────────│ │
│ │ │ │
│ │ 3. 연결 종료 (4-Way Handshake) │ │
│ ├────────────────────────────────────────→│ │
│ │ │ │
│ │
│ → 총 7단계 (SYN, SYN+ACK, ACK, DATA, ACK, FIN, FIN+ACK) │
│ │
│ │
│ [UDP - 비연결형] │
│ ───────────────────────────────────────── │
│ │
│ [클라이언트] [서버] │
│ │ │ │
│ │ 데이터 전송 (그냥 보냄!) │ │
│ ├────────────────────────────────────────→│ │
│ │ │ │
│ │ 데이터 전송 │ │
│ ├────────────────────────────────────────→│ │
│ │ │ │
│ │ 끝! (확인 안 함) │ │
│ │ │ │
│ │
│ → 총 1단계 (DATA만) │
│ │
│ │
│ UDP가 빠른 이유: │
│ • 연결 설정 없음 → 시간 절약 │
│ • ACK 대기 없음 → 즉시 다음 데이터 전송 │
│ • 헤더 작음 → 오버헤드 감소 │
│ │
└─────────────────────────────────────────────────────────────┘UDP 전송 예시
┌─────────────────────────────────────────────────────────────┐
│ DNS 쿼리 예시 (UDP) │
├─────────────────────────────────────────────────────────────┤
│ │
│ [클라이언트] [DNS 서버] │
│ 192.168.1.10:52341 8.8.8.8:53 │
│ │ │ │
│ │ │ │
│ 1. DNS 쿼리 전송 │
│ ───────────────────────────────────────── │
│ │ │ │
│ │ UDP 데이터그램: │ │
│ │ ┌──────────────────────────────┐ │ │
│ │ │ UDP 헤더: │ │ │
│ │ │ 출발지: 52341 │ │ │
│ │ │ 목적지: 53 │ │ │
│ │ │ 길이: 40 │ │ │
│ │ │ │ │ │
│ │ │ 데이터: │ │ │
│ │ │ "google.com의 IP 주소는?" │ │ │
│ │ └──────────────────────────────┘ │ │
│ │ │ │
│ ├───────────────────────────────────→│ │
│ │ │ │
│ │ │ 쿼리 처리 중.. │
│ │ │ │
│ │
│ 2. DNS 응답 수신 │
│ ───────────────────────────────────────── │
│ │ │ │
│ │ UDP 데이터그램: │ │
│ │ ┌──────────────────────────────┐ │ │
│ │ │ UDP 헤더: │ │ │
│ │ │ 출발지: 53 │ │ │
│ │ │ 목적지: 52341 │ │ │
│ │ │ 길이: 44 │ │ │
│ │ │ │ │ │
│ │ │ 데이터: │ │ │
│ │ │ "142.250.185.78" │ │ │
│ │ └──────────────────────────────┘ │ │
│ │ │ │
│ │←───────────────────────────────────┤ │
│ │ │ │
│ │ 완료! │ │
│ │
│ │
│ 특징: │
│ • 연결 설정 없음 → 즉시 쿼리 전송 │
│ • 한 번의 요청-응답으로 완료 │
│ • 빠른 응답 (보통 수십 ms) │
│ • 실패 시 애플리케이션이 재시도 │
│ │
└─────────────────────────────────────────────────────────────┘5. 브로드캐스트와 멀티캐스트
브로드캐스트 (Broadcast)
┌─────────────────────────────────────────────────────────────┐
│ 브로드캐스트 (Broadcast) │
├─────────────────────────────────────────────────────────────┤
│ │
│ 정의: │
│ • 네트워크 내 모든 호스트에게 데이터 전송 │
│ • 1:N 통신 (하나가 모두에게) │
│ • UDP만 가능 (TCP는 불가능) │
│ │
│ │
│ 브로드캐스트 주소: │
│ ───────────────────────────────────────── │
│ │
│ 네트워크: 192.168.1.0/24 │
│ 브로드캐스트 주소: 192.168.1.255 │
│ │
│ │
│ 동작 방식: │
│ ───────────────────────────────────────── │
│ │
│ [송신자] │
│ 192.168.1.10 │
│ │ │
│ │ UDP 데이터그램 │
│ │ 목적지: 192.168.1.255:67 │
│ ↓ │
│ ┌──────────────┐ │
│ │ 스위치 │ │
│ └──────┬───────┘ │
│ │ │
│ ┌──────┴──────┬──────────┬──────────┐ │
│ ↓ ↓ ↓ ↓ │
│ [수신자1] [수신자2] [수신자3] [수신자4] │
│ 192.168.1.5 192.168.1.6 192.168.1.7 192.168.1.8 │
│ ✓ ✓ ✓ ✓ │
│ 모두 받음! │
│ │
│ │
│ 사용 예시: │
│ ───────────────────────────────────────── │
│ │
│ 1. DHCP (Dynamic Host Configuration Protocol) │
│ • 새 컴퓨터가 네트워크 접속 │
│ • IP 주소가 없음 → 브로드캐스트로 DHCP 서버 찾기 │
│ • "DHCP 서버 있어요?" → 모든 장비에게 전송 │
│ │
│ 2. ARP (Address Resolution Protocol) │
│ • IP 주소로 MAC 주소 찾기 │
│ • "192.168.1.5의 MAC 주소는?" → 브로드캐스트 │
│ │
│ 3. Wake-on-LAN │
│ • 원격으로 컴퓨터 켜기 │
│ • Magic Packet을 브로드캐스트로 전송 │
│ │
└─────────────────────────────────────────────────────────────┘멀티캐스트 (Multicast)
┌─────────────────────────────────────────────────────────────┐
│ 멀티캐스트 (Multicast) │
├─────────────────────────────────────────────────────────────┤
│ │
│ 정의: │
│ • 특정 그룹에 속한 호스트들에게만 데이터 전송 │
│ • 1:N 통신 (선택적) │
│ • UDP만 가능 │
│ │
│ │
│ 멀티캐스트 주소: │
│ ───────────────────────────────────────── │
│ • Class D 주소: 224.0.0.0 ~ 239.255.255.255 │
│ • 예약된 주소: │
│ - 224.0.0.1: 모든 호스트 │
│ - 224.0.0.2: 모든 라우터 │
│ - 224.0.0.9: RIP 라우터 │
│ │
│ │
│ 동작 방식: │
│ ───────────────────────────────────────── │
│ │
│ [송신자] │
│ 스트리밍 서버 │
│ │ │
│ │ UDP 데이터그램 │
│ │ 목적지: 239.1.1.1:5000 │
│ ↓ │
│ ┌──────────────┐ │
│ │ 라우터 │ │
│ │(멀티캐스트 │ │
│ │ 지원) │ │
│ └──────┬───────┘ │
│ │ │
│ ┌──────┴──────┬──────────┬──────────┐ │
│ ↓ ↓ ↓ ↓ │
│ [구독자1] [비구독자] [구독자2] [비구독자] │
│ 그룹 가입 ✓ ✗ 그룹 가입 ✓ ✗ │
│ ✓ ✓ │
│ 받음! 받음! │
│ │
│ │
│ 브로드캐스트 vs 멀티캐스트: │
│ ───────────────────────────────────────── │
│ │
│ 브로드캐스트: │
│ • 모든 장비에게 전송 (원하든 원하지 않든) │
│ • 네트워크 부하 증가 │
│ • LAN 내부만 가능 (라우터 통과 불가) │
│ │
│ 멀티캐스트: │
│ • 원하는 장비만 받음 (그룹 가입 필요) │
│ • 네트워크 효율적 │
│ • 라우터 통과 가능 (인터넷 가능) │
│ │
│ │
│ 사용 예시: │
│ ───────────────────────────────────────── │
│ │
│ 1. IPTV (Internet Protocol Television) │
│ • 실시간 TV 스트리밍 │
│ • 시청자만 멀티캐스트 그룹 가입 │
│ │
│ 2. 온라인 게임 │
│ • 같은 맵의 플레이어들에게 위치 정보 전송 │
│ │
│ 3. 화상 회의 │
│ • 참가자들에게만 영상/음성 스트리밍 │
│ │
└─────────────────────────────────────────────────────────────┘유니캐스트/브로드캐스트/멀티캐스트 비교
┌─────────────────────────────────────────────────────────────┐
│ 유니캐스트 vs 브로드캐스트 vs 멀티캐스트 │
├─────────────────────────────────────────────────────────────┤
│ │
│ 1. 유니캐스트 (Unicast) - 1:1 통신 │
│ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ │
│ │
│ [A] │
│ │ │
│ └──→ [B] │
│ │
│ 특징: │
│ • TCP, UDP 모두 가능 │
│ • 가장 일반적인 통신 방식 │
│ • 목적지 하나 │
│ │
│ │
│ 2. 브로드캐스트 (Broadcast) - 1:All 통신 │
│ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ │
│ │
│ [A] │
│ │ │
│ ├──→ [B] │
│ ├──→ [C] │
│ ├──→ [D] │
│ └──→ [E] │
│ │
│ 특징: │
│ • UDP만 가능 │
│ • 같은 네트워크(LAN) 내 모든 장비 │
│ • 라우터 통과 불가 │
│ │
│ │
│ 3. 멀티캐스트 (Multicast) - 1:Group 통신 │
│ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ │
│ │
│ [A] │
│ │ │
│ ├──→ [B] (가입 ✓) │
│ │ [C] (미가입 ✗) │
│ ├──→ [D] (가입 ✓) │
│ └──→ [E] (가입 ✓) │
│ │
│ 특징: │
│ • UDP만 가능 │
│ • 그룹에 가입한 장비만 수신 │
│ • 라우터 통과 가능 (설정 필요) │
│ │
└─────────────────────────────────────────────────────────────┘6. UDP 사용 사례
UDP를 사용하는 프로토콜
┌─────────────────────────────────────────────────────────────┐
│ UDP를 사용하는 주요 프로토콜 │
├──────────┬────────────────────────────────────────────────┤
│ 프로토콜 │ 사용 이유 │
├──────────┼────────────────────────────────────────────────┤
│ DNS │ • 빠른 이름 해석 필요 │
│ (53) │ • 작은 데이터 (쿼리/응답) │
│ │ • 실패 시 재시도 가능 │
├──────────┼────────────────────────────────────────────────┤
│ DHCP │ • 브로드캐스트 필요 │
│ (67,68) │ • IP 할당 전이라 TCP 불가능 │
│ │ • 간단한 요청/응답 │
├──────────┼────────────────────────────────────────────────┤
│ TFTP │ • 단순한 파일 전송 │
│ (69) │ • 임베디드 시스템 (적은 리소스) │
│ │ • 부팅 이미지 전송 │
├──────────┼────────────────────────────────────────────────┤
│ SNMP │ • 네트워크 장비 모니터링 │
│(161,162) │ • 주기적 상태 수집 │
│ │ • 빠른 응답 필요 │
├──────────┼────────────────────────────────────────────────┤
│ NTP │ • 시간 동기화 │
│ (123) │ • 정밀한 시간 측정 (TCP 오버헤드 회피) │
│ │ • 주기적 동기화 │
├──────────┼────────────────────────────────────────────────┤
│ RTP │ • 실시간 오디오/비디오 스트리밍 │
│ │ • 지연 최소화가 중요 │
│ │ • 일부 패킷 손실 허용 │
├──────────┼────────────────────────────────────────────────┤
│ VoIP │ • 음성 통화 │
│ │ • 실시간성 중요 │
│ │ • 재전송하면 오히려 끊김 발생 │
└──────────┴────────────────────────────────────────────────┘UDP가 적합한 경우
┌─────────────────────────────────────────────────────────────┐
│ UDP 사용 권장 상황 │
├─────────────────────────────────────────────────────────────┤
│ │
│ 1. 실시간성이 중요한 경우 │
│ ───────────────────────────────────────── │
│ • 온라인 게임 (플레이어 위치 업데이트) │
│ • 실시간 스트리밍 (영상, 음성) │
│ • VoIP (인터넷 전화) │
│ │
│ 이유: │
│ - 재전송하면 이미 지난 데이터 (의미 없음) │
│ - 약간의 손실은 허용 가능 │
│ - 지연이 더 큰 문제 │
│ │
│ │
│ 2. 작은 데이터를 빠르게 주고받는 경우 │
│ ───────────────────────────────────────── │
│ • DNS 쿼리 │
│ • DHCP 요청 │
│ • 상태 확인 (Ping, Heartbeat) │
│ │
│ 이유: │
│ - 연결 설정이 데이터보다 오버헤드가 큼 │
│ - 한 번의 요청/응답으로 완료 │
│ │
│ │
│ 3. 브로드캐스트/멀티캐스트가 필요한 경우 │
│ ───────────────────────────────────────── │
│ • DHCP (네트워크 내 모든 장비) │
│ • mDNS (로컬 네트워크 서비스 발견) │
│ • IPTV (같은 채널 시청자들) │
│ │
│ 이유: │
│ - TCP는 1:1 연결만 가능 │
│ - UDP만 1:N 통신 지원 │
│ │
│ │
│ 4. 손실을 애플리케이션에서 처리하는 경우 │
│ ───────────────────────────────────────── │
│ • 커스텀 재전송 로직 구현 │
│ • 게임 (최신 상태가 중요, 과거 상태 무의미) │
│ │
│ 이유: │
│ - TCP보다 유연한 제어 가능 │
│ - 애플리케이션 특성에 맞춤 최적화 │
│ │
└─────────────────────────────────────────────────────────────┘UDP가 부적합한 경우
┌─────────────────────────────────────────────────────────────┐
│ TCP 사용 권장 상황 │
├─────────────────────────────────────────────────────────────┤
│ │
│ 1. 데이터 손실이 절대 안 되는 경우 │
│ ───────────────────────────────────────── │
│ • 파일 다운로드 │
│ • 이메일 전송 │
│ • 금융 거래 │
│ • 데이터베이스 쿼리 │
│ │
│ → TCP 사용! │
│ │
│ │
│ 2. 순서가 중요한 경우 │
│ ───────────────────────────────────────── │
│ • HTTP 요청/응답 │
│ • 파일 전송 │
│ • 채팅 메시지 │
│ │
│ → TCP 사용! │
│ │
│ │
│ 3. 대용량 데이터 전송 │
│ ───────────────────────────────────────────── │
│ • 동영상 파일 업로드 │
│ • 백업 파일 전송 │
│ │
│ → TCP 사용! │
│ │
└─────────────────────────────────────────────────────────────┘7. UDP의 장단점
장점과 단점
┌─────────────────────────────────────────────────────────────┐
│ UDP 장점 │
├─────────────────────────────────────────────────────────────┤
│ │
│ ✓ 빠른 속도 │
│ • 연결 설정 없음 │
│ • ACK 대기 없음 │
│ • 즉시 데이터 전송 가능 │
│ │
│ ✓ 낮은 오버헤드 │
│ • 헤더 크기: 8바이트 (TCP: 20~60바이트) │
│ • 적은 처리 비용 │
│ • 적은 메모리 사용 │
│ │
│ ✓ 브로드캐스트/멀티캐스트 지원 │
│ • 1:N 통신 가능 │
│ • 효율적인 그룹 통신 │
│ │
│ ✓ 단순함 │
│ • 구현이 간단 │
│ • 디버깅 용이 │
│ │
│ ✓ 실시간 애플리케이션에 적합 │
│ • 지연 최소화 │
│ • 일정한 전송 속도 유지 가능 │
│ │
└─────────────────────────────────────────────────────────────┘
┌─────────────────────────────────────────────────────────────┐
│ UDP 단점 │
├─────────────────────────────────────────────────────────────┤
│ │
│ ✗ 신뢰성 없음 │
│ • 패킷 손실 가능 │
│ • 재전송 메커니즘 없음 │
│ • 애플리케이션이 직접 처리 필요 │
│ │
│ ✗ 순서 보장 없음 │
│ • 패킷이 순서 뒤바뀔 수 있음 │
│ • 애플리케이션이 순서 관리 필요 │
│ │
│ ✗ 흐름 제어 없음 │
│ • 수신측 버퍼 오버플로우 가능 │
│ • 송신 속도 조절 안 됨 │
│ │
│ ✗ 혼잡 제어 없음 │
│ • 네트워크 혼잡 시 계속 전송 │
│ • 혼잡 악화 가능 │
│ │
│ ✗ 연결 상태 없음 │
│ • 상대방 생존 여부 모름 │
│ • 애플리케이션이 상태 관리 필요 │
│ │
└─────────────────────────────────────────────────────────────┘8. 실무 활용
UDP 소켓 프로그래밍 예시
Python UDP 서버:
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
import socket
# UDP 소켓 생성
server_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# 주소와 포트 바인딩
server_socket.bind(('0.0.0.0', 9999))
print("UDP 서버 시작... 포트 9999")
while True:
# 데이터 수신 (연결 없이 바로 수신)
data, addr = server_socket.recvfrom(1024)
print(f"수신: {data.decode()} from {addr}")
# 응답 전송 (연결 없이 바로 전송)
response = f"받았어요: {data.decode()}"
server_socket.sendto(response.encode(), addr)
Python UDP 클라이언트:
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
import socket
# UDP 소켓 생성
client_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
server_address = ('localhost', 9999)
# 데이터 전송 (연결 없이 바로 전송)
message = "안녕하세요 UDP!"
client_socket.sendto(message.encode(), server_address)
# 응답 수신
data, server = client_socket.recvfrom(1024)
print(f"서버 응답: {data.decode()}")
client_socket.close()
TCP와 비교:
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
TCP 서버:
socket.socket(socket.AF_INET, socket.SOCK_STREAM) # TCP
server_socket.bind()
server_socket.listen() # 연결 대기
conn, addr = server_socket.accept() # 연결 수락
data = conn.recv(1024) # 연결을 통해 수신
conn.send(response) # 연결을 통해 전송
UDP 서버:
socket.socket(socket.AF_INET, socket.SOCK_DGRAM) # UDP
server_socket.bind()
# listen(), accept() 없음!
data, addr = server_socket.recvfrom(1024) # 바로 수신
server_socket.sendto(response, addr) # 바로 전송netstat으로 UDP 연결 확인
Windows:
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
> netstat -an -p UDP
활성 연결
프로토콜 로컬 주소 외부 주소 상태
UDP 0.0.0.0:53 *:*
UDP 0.0.0.0:67 *:*
UDP 0.0.0.0:123 *:*
UDP 192.168.1.10:52341 142.250.185.78:443
• UDP는 연결 상태가 없으므로 "상태" 열이 비어있음
• 외부 주소가 *:*인 경우 대기 중 (서버)
Linux:
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
$ ss -u -a
State Recv-Q Send-Q Local Address:Port Peer Address:Port
UNCONN 0 0 0.0.0.0:53 0.0.0.0:*
UNCONN 0 0 0.0.0.0:67 0.0.0.0:*
UNCONN 0 0 192.168.1.10:52341 142.250.185.78:443
$ netstat -u -a
• UNCONN: 비연결형 (UDP의 특성)
• Recv-Q/Send-Q: 수신/송신 대기 중인 데이터 크기Wireshark로 UDP 분석
Wireshark에서 UDP 패킷 확인:
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
No. Time Source Dest Protocol Info
1 0.000 192.168.1.10 8.8.8.8 DNS Standard query A google.com
2 0.015 8.8.8.8 192.168.1.10 DNS Standard query response
패킷 1번 상세:
┌───────────────────────────────────────────────────────────┐
│ User Datagram Protocol │
│ ├─ Source Port: 52341 │
│ ├─ Destination Port: 53 │
│ ├─ Length: 40 │
│ ├─ Checksum: 0x1a2b [correct] │
│ └─ [Stream index: 0] │
│ │
│ Data (32 bytes): │
│ • DNS Query for google.com │
└───────────────────────────────────────────────────────────┘
유용한 Wireshark 필터:
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
udp # 모든 UDP 패킷
udp.port == 53 # DNS 패킷
udp.port == 67 || udp.port == 68 # DHCP 패킷
udp.length > 1000 # 1000바이트 이상 UDP
ip.dst == 255.255.255.255 # 브로드캐스트
ip.dst >= 224.0.0.0 && ip.dst <= 239.255.255.255 # 멀티캐스트핵심 정리
| 개념 | 설명 |
|---|---|
| UDP | 비연결형, 빠르고 효율적인 전송 계층 프로토콜 |
| UDP 헤더 | 8바이트 고정 (출발지/목적지 포트, 길이, 체크섬) |
| UDP 데이터그램 | UDP 헤더가 붙은 데이터 단위 |
| 비연결형 | 연결 설정 없이 데이터 전송 (Connectionless) |
| 신뢰성 없음 | 패킷 손실, 순서 뒤바뀜 가능 (No Reliability) |
| 브로드캐스트 | 네트워크 내 모든 호스트에게 전송 (1:All) |
| 멀티캐스트 | 특정 그룹에 속한 호스트들에게 전송 (1:Group) |
| 빠른 속도 | 연결/ACK 없음, 낮은 오버헤드 |
UDP 핵심 개념
┌─────────────────────────────────────────────────────────────┐
│ UDP 요약 │
├─────────────────────────────────────────────────────────────┤
│ │
│ 1. 비연결형 (Connectionless) │
│ ───────────────────────────────────────── │
│ • 연결 설정 없음 → 즉시 전송 │
│ • 연결 종료 없음 → 오버헤드 최소화 │
│ │
│ 2. 신뢰성 없음 (Unreliable) │
│ ───────────────────────────────────────── │
│ • 패킷 손실 가능 → 재전송 안 함 │
│ • 순서 보장 안 됨 → 순서 뒤바뀔 수 있음 │
│ │
│ 3. 간단한 헤더 (8바이트) │
│ ───────────────────────────────────────── │
│ • 출발지 포트 (16비트) │
│ • 목적지 포트 (16비트) │
│ • 길이 (16비트) │
│ • 체크섬 (16비트) │
│ │
│ 4. 빠른 속도 │
│ ───────────────────────────────────────── │
│ • 낮은 지연 (Low Latency) │
│ • 낮은 오버헤드 (Low Overhead) │
│ • 실시간 애플리케이션에 적합 │
│ │
│ 5. 브로드캐스트/멀티캐스트 지원 │
│ ───────────────────────────────────────── │
│ • 1:N 통신 가능 │
│ • 효율적인 그룹 통신 │
│ │
│ │
│ 사용처: │
│ • DNS (빠른 이름 해석) │
│ • DHCP (브로드캐스트) │
│ • 스트리밍 (실시간성) │
│ • 온라인 게임 (낮은 지연) │
│ • VoIP (음성 통화) │
│ │
└─────────────────────────────────────────────────────────────┘용어 정리
- UDP (User Datagram Protocol): 비연결형, 신뢰성 없는 전송 계층 프로토콜
- 데이터그램 (Datagram): UDP 헤더가 붙은 독립적인 데이터 단위
- 비연결형 (Connectionless): 연결 설정 없이 데이터를 전송하는 방식
- 브로드캐스트 (Broadcast): 네트워크 내 모든 호스트에게 데이터 전송 (1:All)
- 멀티캐스트 (Multicast): 특정 그룹에 속한 호스트들에게 데이터 전송 (1:Group)
- 유니캐스트 (Unicast): 특정 하나의 호스트에게 데이터 전송 (1:1)
- 체크섬 (Checksum): 데이터 오류 검출을 위한 값
- 의사 헤더 (Pseudo Header): 체크섬 계산 시 IP 헤더 정보를 포함한 가상 헤더