UDP

1 개요

스타 멀티플레이 맨 밑에 있는 것
User Datagram Protocol의 축약어로 컴퓨터가 다른 컴퓨터와 데이터 통신을 하기 위한 규약(프로토콜)의 일종이다. UDP는 세계 통신표준으로 개발된 OSI 모형에서 4번째 계층인 전송 계층(Transport Layer)에서 사용하는 규약이다. 동일 계층에서 사용하는 또다른 프로토콜로 TCP가 존재한다.

2 개발동기와 특징

네트워크로 통신을 하는데 있어서 신뢰성을 얻기 위해 프로그램들은 TCP로 통신을 하고 있었다. TCP는 데이터 신뢰성을 보장하기 위한 방식이기 때문에 누락된 데이터를 모두 받기위한 메커니즘이 정의되어 있다. 이것이 이메일이나 파일전송과 같은 분야에서는 필수불가결의 요소였으나 실시간 스트리밍 서비스에서는 걸림돌로 작용하고 있었다. 간단히 전체 영상에서 점 하나 못받은 것 때문에 버퍼링돌린다고 재생이 중지되기 일쑤였고, TCP는 혼잡제어를 위해 보내는 속도 역시 조절하기 때문에 영상 데이터의 퀄리티가 오락가락하는 그야말로 삽질의 연속이었다. 결국 이를 해결하기 위하여 제시된 것이 UDP이다.

UDP의 특징은 간단하게 TCP의 모든 신뢰성 기능이 없다고 보면된다. 그냥 상대와 접속했고, 전송속도를 48Kbps로 설정했으면 닥치고 48Kbps로 데이터를 전송하기만 한다. 받는 쪽에서 데이터를 제대로 받고 있는지 조차도 신경안쓴다. 제대로 못받는 건 네트워크 사정이나 받는 쪽 문제이지 보내는 쪽에서는 신경 쓸 일이 아니다. 그렇기 때문에 UDP로 자료를 제공할 경우 예를 들어 32Kbps, 48Kbps, 64Kbps와 같이 다양한 전송률 옵션을 주고 "이걸로 받을 수 있으면 한 번 받아보시던지"란 식의 다소 무책임한 형태로 제공된다.

결국 신뢰성이 보장되지 않기 때문에 UDP로 데이터를 보내면 손실되는 데이터가 발생한다. 하지만 동영상의 경우를 생각할 때 데이터가 왕창 소실됐다면 괴이한 화면이 나올 수도 있지만, 데이터 몇 개 소실되어봤자 전체 화면에서 점 몇 개가 제대로 안나오는 수준에 불과하다. 그렇기에 사람들이 크게 불평하지 않을 수준의 영상만 제공할 수 있다면 TCP를 쓸 이유가 없는 셈이다. 그렇기에 실시간 스트리밍을 하는 곳에서 주로 사용한다.

이로 인해 UDP 헤더를 까보면 목적지주소,데이터순서, checksum과 실데이터만 포함되고, 확인응답 같은 것이 없기 때문에 TCP보다 용량이 가볍고 송신속도가 빠르다. 하지만 확인응답을 하지 못하기때문에 신뢰도가 TCP보다 떨어지게 된다. 따라서 UDP는 비연결형이라 부르며 TCP는 연결형이라 구분한다.

그리고 UDP에는 스스로 속도제어를 하는 기능이 없다. 따라서 초기 TCP가 겪었던 문제를 고스란히 안고 있다. 한 회선에서 몇몇 사람들이 UDP로 사용하면, 결국 소수에 의해 대역폭이 점유당해 다른 사람들이 통신을 못하는 상황이 빚어질 수 있다. 그렇기 때문에 네트워크 관리자 측에서 UDP가 쓸 수 있는 대역폭을 강제로 제한해버리거나 아예 UDP로 일정량 이상의 데이터가 들어오면 자동으로 차단하게 만드는 등의 방법을 쓰고 있다. 네트워크 관리자 입장에서는 이래저래 필요악으로 취급하고 있다. 참고로 국내 ISP의 경우 UDP 통신을 별도로 제한을 걸고 있지는 않지만, 학교나 회사와 같은 곳에서는 UDP에 제한을 거는 경우가 많다.

3 활용되는 분야

앞서 언급한 것처럼 스트리밍 분야나 VoIP, mVoIP에서 사용되고 있다. 이쪽은 실시간성 보장이 중요하기 때문에 TCP로 하면 매우 비효율적인 시스템이 된다.

또한 온라인 게임의 서버-클라이언트 통신에도 대부분 UDP가 사용된다. 이 경우는 데이터가 빠짐없이 전송되는 것보다는 빠른 응답속도가 중요하기 때문에 사용된다. 온라인게임에서 유저가 스킬을 연타하는데 중간에 키보드 입력 한두개가 빠졌다고 그 뒤의 입력이 전부 스톱 되면 유저는 답답함을 느낄 것이다. 때문에 게임 서버는 입력데이터 전송은 UDP에 맡기고 대부분 손실되는 키 입력을 자체적으로 복구하거나 아예 무시해버리는(…) 방법을 사용하는 경우가 많다. 데이터를 보낼 때 애초에 중복으로 두 개 정도 보내서 패킷 하나쯤 손실됐더라도 다음 패킷에서 복구하도록 하는 메커니즘도 사용된다. 키입력 데이터는 중복 좀 있다고 어마무지하게 커지지 않으니까. 다만 UDP로 전송하는 것은 응답성이 중요한 유저 입력과 서버의 반응 정도이고 중요한 데이터는 TCP 전송을 함께 사용한다.

더불어 UDP도 얼마든지 신뢰성있는 네트워크를 구축할 수 있다. 무슨 소리냐면 TCP에서 하는 신뢰성 작업을 프로그래머가 직접 코딩해서 구현하면 된다. 다이나믹 로동(...) 보통 TCP로 쓰면 효율이 떨어져서 쓰기 싫은데, 신뢰성을 보장해줘야 되는 상황일 경우 사용하는 방법이다. 실제 일부 P2P 시스템에서는 UDP를 사용하면서 동시에 신뢰성을 보장하는 별도의 통신방식을 개발하여 사용하기도 한다. 가장 유명한 것으로 일부 비트토렌트 클라이언트에서 사용하는 μTP가 있다.

4 그 외 이야기

데이터 신뢰성 문제가 있는 프로토콜이라 우스갯소리로 Unreliable Damn Protocol(믿지 못할 빌어먹을 프로토콜)의 축약어라 부르는 경우도 있다.

UDP라는 독자적인 규약으로 떨어져 나오긴 했으나 사실 TCP도 UDP처럼 사용할 수 있다. 프로그램을 구현할 때 TCP의 각 기능을 사용할 것인지 말 것인지를 옵션으로 지정할 수 있는데 이걸 꺼버리면 된다(…). 다만 이렇게 하더라도 TCP 헤더의 길이나 형식은 유지되기 때문에 UDP보다 훨씬 더 큰 크기의 데이터를 사용하게 된다.