junyeokk
Blog
Network·2025. 04. 20

UDP

인터넷에서 데이터를 주고받는 방식에는 여러 가지가 있다. 그 중에서도 UDPUser Datagram Protocol_{User \space Datagram \space Protocol}는 ‘빠르고 단순한’ 전송 방식으로 자주 사용된다. UDP는 User Datagram Protocol, 즉 사용자 데이터그램 프로토콜의 줄임말이다. 말 그대로 데이터를 ‘데이터그램’ 단위로 전송하는 프로토콜이다.

여기서 데이터그램이란 각 패킷이 서로 독립적으로 전송되는 방식을 의미한다.

UDP는 Connnectionless(비연결형) 프로토콜이다. TCP처럼 사전에 handshaking 과정이 없기 때문에, 각 패킷은 서로 논리적인 연결 없이 독자적으로 전송된다. UDP로 보낸 메시지는 잃어버릴 수도 있고 (손실 가능) 순서가 뒤바뀔 수도 있으며, 중복될 수도 있다.

각 패킷이 ‘자기 갈 길을 가는’ 방식, 그것이 바로 UDP다.

📡 UDP를 쓰는 이유

TCP처럼 신뢰성을 보장해주는 프로토콜이 있는데, 굳이 UDP를 쓸 이유가 있을까? 생각보다 많다.

  • 빠르다. 연결을 미리 설정할 필요 없이, 그냥 보내면 된다.
    • RTT(round-trip time) 지연 없음
  • 가볍다. 헤더가 단 8바이트. TCP보다 훨씬 작다.
    • 오버헤드가 적음
  • Congestion control이 없다. 네트워크 상황에 상관없이 데이터를 보낼 수 있다.
    • 좋게 말하면 자유롭지만, 나쁘게 말하면 무책임하다.
  • 구현이 간단하다. 상태 정보를 저장할 필요가 없어 서버 입장에서는 매우 편리하다.
  • 데이터그램 기반. 각 패킷에서 독립적으로 처리한다.
  • 신뢰성이 없다. 패킷 손실, 중복, 순서 바뀜에 대한 처리가 없다.

속도와 단순함이 중요할 때 UDP는 최고의 선택지가 될 수 있다. 이러한 특성들 덕분에 다양한 상황에서 쓰인다.

  • 스트리밍 서비스 (YouTube, Netflix 등)

    → 조금의 손실은 괜찮고, 지연은 치명적인 경우

  • DNS (도메인 네임 시스템)

    → 빠르게 질의응답이 필요

  • SNMP (네트워크 관리 프로토콜)

  • HTTP/3 (QUIC 기반)

    → 신뢰성은 애플리케이션이 직접 구현하고, 전송은 UDP로

📡 UDP Segment

UDP는 데이터를 어떻게 포장해서 보낼까? 아래와 같은 구조로 보낸다. 정말 간단하고 3개만 외우면 된다.

image.png
  • port number (포트 번호)
    • 송신자와 수신자의 포트
  • length (길이)
    • 전체 세그먼트(헤더 + 데이터)의 길이
  • checksum (체크섬)
    • 오류 검출용. 필수는 아니지만 대부분의 OS에서 계산함

송신자는 애플리케이션에서 메시지를 받고, UDP 세그먼트를 생성(포트 번호, 길이, 체크섬 포함)하고 IP 계층으로 전달 후 전송한다. 수신자는 IP 계층에서 세그먼트를 수신하고, 체크섬 검증으로 오류를 확인한다. 정상적으로 판단되면 포트 번호를 확인해서 적절한 애플리케이션으로 전달한다.

📡 UDP의 checksum

image.png

UDP는 완전히 무책임한 건 아니고, checksum(체크섬)을 통해 기본적인 오류 검출은 한다.

  • 1의 보수 덧셈 방식으로 세그먼트 전체를 더해서 체크섬 값을 만든다.
  • 수신 측에서도 같은 방식으로 계산해서 비교한다.

하지만 checksum은 몇몇 비트가 바뀌어도 같게 나올 수 있기 때문에 엄격하지 않다.

image.png

📡 흐름제어와 혼잡제어?

UDP는 TCP와 달리 흐름제어와 혼잡제어가 없다.

  • 흐름제어(Flow Control)
    • 수신자의 처리 속도를 고려해 송신 속도를 조절하는 기능 → 수신자 버퍼가 넘치는 걸 방지
  • 혼잡제어(Congestion Control)
    • 네트워크 전체가 과부하되지 않도록 트래픽을 조절하는 기능 → congestion collapse(혼잡 붕괴) 방지

UDP는 이 두 기능을 제공하지 않기 때문에, 상황에 따라 애플리케이션에서 직접 구현해야 한다. (HTTP/3의 QUIC)

📡 요약

항목내용
연결 방식Connectionless (비연결형)
신뢰성없음 (애플리케이션에서 구현해야 함)
속도매우 빠름
용도실시간 스트리밍, DNS, HTTP/3 등
헤더 크기작음 (8바이트)
혼잡 제어없음 (TCP는 있음)
오류 검출체크섬 (간단한 수준)