9.9. UDP – 패킷을 보내고 잘 되기를 바라기

UDP, 즉 사용자 데이터그램 프로토콜(User Datagram Protocol)은 전송 계층이 제공하는 두 서비스 중 더 단순한 쪽입니다. UDP 전송 한 번은 하나의 데이터그램입니다 – IP와 포트로 주소가 지정되어 단독으로 네트워크에 던져지는, 자기 완결적인 바이트 덩어리입니다. 프로토콜은 가능하면 그것을 전달합니다. 전달할 수 없으면 재시도하지도, 송신자에게 경고하지도, 데이터그램 간의 어떤 순서도 보존하지 않습니다.

9.9.1. UDP가 IP에 더하는 것

UDP는 IP 위의 얇은 계층입니다. 원시 IP 전달에 세 가지를 추가합니다:

  • 양쪽 끝의 포트 번호. 이를 통해 데이터그램이 목적지 호스트 자체가 아니라 그 호스트의 올바른 프로그램에 전달될 수 있습니다(포트 참조).

  • 길이 필드. 이를 통해 수신자는 페이로드를 정확히 몇 바이트 읽어야 하는지 알 수 있습니다.

  • 헤더와 페이로드에 대한 작은 체크섬. 이를 통해 수신자는 손상된 데이터그램을 감지하고 버릴 수 있습니다.

그게 전부입니다. IP가 했거나 하지 않았던 나머지 모든 것을 UDP는 그대로 유지합니다. 데이터그램은 재시도되지 않습니다. 순서가 뒤바뀐 채 도착할 수 있습니다. 하부 네트워크의 특성 때문에 중복될 수 있습니다. 네트워크가 혼잡하거나, 목적지의 버퍼가 가득 찼거나, 중간의 라우터 중 하나가 그렇게 결정하면 조용히 버려질 수 있습니다.

왼쪽에 송신자, 오른쪽에 수신자가 있는 다이어그램. 송신자에서 수신자로 향하는 세 개의 화살표가 "datagram 1", "datagram 2", "datagram 3"이라고 표시되어 있습니다. datagram 2의 화살표는 그 위에 X 표시가 있는 점선으로 나타나, 손실을 나타냅니다.

각 UDP 데이터그램은 독립적으로 전송됩니다. 그중 하나가 전송 중에 손실되어도, 송신자나 수신자에게 그 사실을 알리는 것은 아무것도 없습니다 – 그 공백은 조용합니다.

9.9.2. 왜 이것을 사용하는가

UDP가 그렇게 신뢰할 수 없다면, 도대체 왜 그것이 존재할까요? 세 가지 이유가 있습니다.

  • 속도와 오버헤드. UDP 전송은 패킷 하나가 나가는 것입니다. 핸드셰이크도, 확인 응답도, 유지해야 할 연결 상태도 없습니다. 지연 시간과 대역폭 비용이 최소입니다.

  • 독립적인 메시지. 어떤 트래픽은 상태 갱신 스트림으로, 모든 메시지가 새로운 스냅샷이고 오래된 것은 쓸모가 없습니다. “나는 아직 살아 있고, 여기 현재 측정값이 있습니다”를 매초 발행하는 카메라는 각 새로운 측정값을 전달하는 데 관심이 있을 뿐, 손실된 측정값을 다시 재생하는 데는 관심이 없습니다.

  • 멀티캐스트. 하나의 UDP 데이터그램을 여러 수신자에게 한 번에 보낼 수 있습니다. (TCP는 그렇게 할 수 없습니다. 모든 TCP 연결은 정확히 두 종단점 사이의 것입니다.) 서비스 검색, 다수의 리스너에 대한 텔레메트리, 비디오 스트리밍에 유용합니다.

네트워크 상태가 좋고 송신자의 손실 허용도가 높은 경우, UDP가 적합한 답입니다. 전달과 순서가 보장되어야 하는 경우, UDP는 그 위에 또 다른 신뢰성 계층이 필요하거나, 아니면 애플리케이션이 그냥 TCP를 사용해야 합니다.

9.9.3. 사용하지 말아야 할 때

그 반대 또한 명확히 해 둘 가치가 있습니다. UDP는 다음과 같은 경우에 잘못된 선택입니다:

  • 모든 바이트가 중요할 때. 구성 데이터, 코드 업데이트, 서명된 트랜잭션 – 바이트 하나가 누락되면 결과가 틀려지는 모든 경우입니다.

  • 순서가 중요할 때. UDP 데이터그램 2가 데이터그램 1보다 먼저 도착할 수 있습니다.

  • 메시지가 클 때. 큰 페이로드는 애플리케이션이 더 작은 데이터그램으로 분할해야 합니다. 전송 계층은 그렇게 해 주지 않습니다. 조각 중 하나라도 손실되면 메시지 전체가 불완전해집니다.

이 중 어느 하나라도 해당되면, 대신 TCP를 사용하세요.

9.9.4. 카메라에서의 구체적인 예

실제 환경에서 UDP 트래픽의 카메라 측 예시:

  • 검색. 카메라가 시작 시 로컬 네트워크에 “누가 여기 있는가” 데이터그램을 브로드캐스트하면, 다른 장치들이 응답합니다.

  • 텔레메트리. 카메라는 매초 한 번씩 현재 센서 측정값이 담긴 작은 데이터그램을 수집기에 보냅니다. 가끔 샘플 하나를 잃어도 어차피 다음 것이 1초 안에 도착하므로 문제가 되지 않습니다.

  • 시간 동기화. 네트워크 시간 프로토콜인 NTP는 UDP 위에서 동작합니다. 클라이언트가 작은 요청을 보내면 서버가 현재 시간으로 응답합니다. 응답이 손실되면 클라이언트는 나중에 다시 요청하면 됩니다.

  • DNS 조회. 네트워크에 “이 이름은 어떤 IP로 매핑되는가?”를 묻는 것도 UDP 위에서 동작합니다. (이름과 DNS에서 다룹니다.)

데이터그램을 보내고 받는 Python API는 전송 계층의 나머지 이야기가 갖춰진 뒤 UDP 소켓에서 다룹니다.