1. 개요
User Datagram Protocol, UDP컴퓨터가 다른 컴퓨터와 데이터 통신을 하기 위한 규약(프로토콜)의 일종이다. UDP는 세계 통신표준으로 개발된 OSI 모형에서 4번째 계층인 전송 계층(Transport Layer)에서 사용하는 규약이다. 동일 계층에서 사용하는 또 다른 프로토콜로 TCP가 존재한다.
2. 개발 배경
네트워크로 통신을 하는 데 있어서 신뢰성을 얻기 위해 프로그램들은 TCP로 통신을 하고 있었다. TCP는 데이터 신뢰성을 보장하기 위한 방식이기 때문에 누락된 데이터를 모두 받기 위한 메커니즘이 정의되어 있다. 이것이 이메일이나 파일전송과 같은 분야에서는 필수불가결의 요소였으나 실시간 스트리밍 서비스에서는 걸림돌로 작용하고 있었다. 간단히 전체 영상에서 점 하나 못 받은 것 때문에 버퍼링 돌린다고 재생이 중지되기 일쑤였고, TCP는 혼잡제어를 위해 보내는 양도 조절하기 때문에 영상 데이터의 퀄리티가 안정적이지 못했다. 결국 이를 해결하기 위하여 제시된 것이 UDP이다.3. 특징
간단하게 TCP의 모든 신뢰성 기능이 없다고 보면 된다. 상대와 접속했고, 전송속도를 48 kbps로 설정했으면 48 kbps로 데이터를 전송하기만 한다. 받는 쪽에서 데이터를 제대로 받고 있는지조차도 신경 안 쓴다. 그렇기 때문에 UDP로 자료를 제공할 경우 32 kbps, 48 kbps, 64 kbps와 같이 다양한 전송률 옵션을 선택하는 형태로 제공된다.신뢰성이 보장되지 않기 때문에 UDP로 데이터를 보내면 손실되는 데이터가 발생할 수 있다.[1] 하지만 동영상의 경우를 생각할 때 데이터가 심하게 손실됐다면 화면이 깨지거나 안 나올 수도 있지만, 데이터 몇 개 소실되어봤자 전체 화면에서 일부 구역이 제대로 안나오는 수준에 불과하다.[2] 그렇기에 사람들이 크게 불평하지 않을 수준의 영상만 제공할 수 있다면 느린 TCP를 쓸 이유가 없는 셈이다. 그래서 실시간 스트리밍을 하는 곳에서 주로 사용한다.
UDP 헤더에는 목적지주소, 데이터순서, checksum과 실데이터만 포함되고, 확인응답 같은 것이 없기 때문에 TCP보다 용량이 가볍고 송신속도가 빠르다. 하지만 확인응답을 하지 못하기때문에 신뢰도가 TCP보다 떨어지게 된다. 따라서 UDP는 비연결형이라 부르며 TCP는 연결형이라 구분한다.
UDP에는 스스로 속도제어를 하는 기능이 없다. 따라서 초기 TCP가 겪었던 문제를 고스란히 안고 있다. 한 회선에서 몇몇 사람들이 UDP로 사용하면, 결국 소수에 의해 대역폭이 점유당해 다른 사람들이 통신을 못하는 상황이 빚어질 수 있다. 그렇기 때문에 네트워크 관리자 측에서 UDP가 쓸 수 있는 대역폭을 강제로 제한해버리거나 아예 UDP로 일정량 이상의 데이터가 들어오면 자동으로 차단하게 만드는 등의 방법을 쓰고 있다. 네트워크 관리자 입장에서는 이래저래 필요악으로 취급하고 있다. 국내 ISP의 경우 UDP 통신을 별도로 제한을 걸고 있지는 않지만, 학교나 회사와 같은 곳에서는 UDP에 제한을 거는 경우가 많다.
4. 활용되는 분야
스트리밍 분야나 VoIP, mVoIP에서 사용되고 있다. 실시간성 보장이 중요하기 때문에 TCP로 하면 매우 비효율적인 시스템이 된다.온라인 게임의 서버-클라이언트 통신에도 대부분 UDP가 사용된다. 이 경우는 데이터가 빠짐없이 전송되는 것보다는 빠른 응답속도가 중요하기 때문에 사용된다. 온라인게임에서 유저가 스킬을 연타하는데 중간에 키보드 입력 한두 개가 빠졌다고 그 뒤의 입력이 전부 스톱 되면 유저는 답답함을 느낄 것이다. 때문에 게임 서버는 입력데이터 전송은 UDP에 맡기고 대부분 손실되는 키 입력을 자체적으로 복구하거나 아예 무시해버리는 방법을 사용하는 경우가 많다. 데이터를 보낼 때 중복으로 두 개 정도 보내서 패킷 하나쯤 손실됐더라도 다음 패킷에서 복구하도록 하는 메커니즘도 사용된다. 키 입력 데이터는 중복 좀 있다고 어마무지하게 커지지 않으니까. 다만 사용자 정보나 텍스트 같이 무결성이 중요한 데이터는 TCP 전송을 사용한다. 이것이 가능한 이유는 데디케이트 서버라서 핵심 로직이 모두 서버에서 실행되기 때문이다.
사실 UDP도 얼마든지 신뢰성있는 네트워크를 구축할 수 있다. TCP에서 하는 신뢰성 작업을 프로그래머가 직접 코딩해서 구현하면 된다. 보통 TCP로 쓰면 효율이 떨어져서 쓰기 싫은데, 신뢰성을 보장해줘야 되는 상황일 경우 사용하는 방법이다. TCP에 쓰이는 흐름 제어 및 신뢰성 제어 알고리즘은 현대에 들어서는 성능 상으로 지나치게 비효율적이라는 평을 받고 있어 개발자들이 UDP 소켓에서 더 효율적인 알고리즘으로 TCP의 기능을 구현하려는 시도가 이어지고 있다. 실제 일부 P2P 시스템에서는 UDP를 사용하면서 동시에 신뢰성을 보장하는 별도의 통신방식을 개발하여 사용하기도 한다. 가장 유명한 것으로 일부 비트토렌트 클라이언트에서 사용하는 μTP가 있다. 차세대 통신 프로토콜인 QUIC와 HTTP/3 역시 UDP를 사용한다. TLS의 기능을 UDP에 구현한 보안 소켓인 DTLS (Datagram Transport Layer Security)가 등장하였다.
5. 기타
데이터 신뢰성 문제가 있는 프로토콜이라 우스갯소리로 Unreliable Damn Protocol(믿지 못할 빌어먹을 프로토콜)의 축약어라 부르는 경우도 있다.UDP라는 독자적인 규약으로 떨어져 나오긴 했으나 사실 TCP도 UDP처럼 사용할 수 있다. 프로그램을 구현할 때 TCP의 각 기능을 사용할 것인지 말 것인지를 옵션으로 지정할 수 있는데 이걸 꺼버리면 된다. 다만 이렇게 하더라도 TCP 헤더의 길이나 형식은 유지되기 때문에 UDP보다 훨씬 더 큰 크기의 데이터를 사용하게 된다.
네트워크 관련 용어를 잘 모르는 사람들 중에서도 UDP라는 단어를 접해보는 경우가 많았는데, 스타크래프트에서 멀티플레이 선택 화면에 Local Area Network (UDP)라는 것이 있기 때문이다. 같은 네트워크에 있는 컴퓨터끼리 스타크래프트를 할 수 있는 옵션인데, 원래는 IPX만 지원했다가 나중에 패치로 UDP도 추가된 것이다.