9.9. UDP – 패킷을 보내고 잘 되기를 바라기¶
UDP, 즉 사용자 데이터그램 프로토콜(User Datagram Protocol)은 전송 계층이 제공하는 두 서비스 중 더 단순한 쪽입니다. UDP 전송 한 번은 하나의 데이터그램입니다 – IP와 포트로 주소가 지정되어 단독으로 네트워크에 던져지는, 자기 완결적인 바이트 덩어리입니다. 프로토콜은 가능하면 그것을 전달합니다. 전달할 수 없으면 재시도하지도, 송신자에게 경고하지도, 데이터그램 간의 어떤 순서도 보존하지 않습니다.
9.9.1. UDP가 IP에 더하는 것¶
UDP는 IP 위의 얇은 계층입니다. 원시 IP 전달에 세 가지를 추가합니다:
양쪽 끝의 포트 번호. 이를 통해 데이터그램이 목적지 호스트 자체가 아니라 그 호스트의 올바른 프로그램에 전달될 수 있습니다(포트 참조).
길이 필드. 이를 통해 수신자는 페이로드를 정확히 몇 바이트 읽어야 하는지 알 수 있습니다.
헤더와 페이로드에 대한 작은 체크섬. 이를 통해 수신자는 손상된 데이터그램을 감지하고 버릴 수 있습니다.
그게 전부입니다. IP가 했거나 하지 않았던 나머지 모든 것을 UDP는 그대로 유지합니다. 데이터그램은 재시도되지 않습니다. 순서가 뒤바뀐 채 도착할 수 있습니다. 하부 네트워크의 특성 때문에 중복될 수 있습니다. 네트워크가 혼잡하거나, 목적지의 버퍼가 가득 찼거나, 중간의 라우터 중 하나가 그렇게 결정하면 조용히 버려질 수 있습니다.
각 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 소켓에서 다룹니다.