[정리] UDP의 기능과 패킷 구조

UDP(User Datagram Protocol)는 transport layer에서 동작하는 비연결지향형 프로토콜이다.


연결지향형인 TCP와는 달리 단순 오류검출 기능만을 지원하기 때문에 흐름제어나 오류제어등의 기능은 어플리케이션에서 담당해야만 한다. 이러한 이유로 UDP는 best-effort protocol로도 불린다. UDP는 그 특성 때문에 다른 전송 프로토콜에 비해 오버헤드가 적다. 따라서 브로드캐스트나 멀티캐스트, 소량의 데이터 전송 시에는 UDP를 이용하는 것이 효율적이다. 


[그림 1] UDP 구조


Source Port : 해당 패킷을 만든 송신자의 어플리케이션 포트번호를 나타낸다.


Destination Port : 해당 패킷을 수신할 어플리케이션의 포트번호를 나타낸다.


Length : UDP 헤더와 데이터를 포함한 전체 길이를 byte단위로 표시한다.


Checksum : 데이터가 전송 중에 손상되지 않고 원본과 동일한지 여부를 확인하는 기능을 제공한다. 만일 checksum값이 inco-rrect일 경우 송신자에게 패킷의 재전송을 요구한다. 옵션이지만 RFC1122에서는 사용할 것을 권장하고 있으며 현재는 호스트에 의해 기본적으로 동작하게 요구되고 있다. checksum은 NAT를 수행 할 때를 제외하곤 송신지에서 계산되어 수신지에서 검사된다. 


[그림 2] DNS 패킷 내용


위의 그림은 UDP를 사용하는 대표적 서비스인 DNS 패킷의 일부이다. [그림 1]에 나와있는 구조들을 모두 확인 할 수 있다. checksum의 값이 validation disabled되어 있는데 이는 와이어샤크에서 퍼포먼스의 이유로 인해 checksum 계산을 disable 하였기 때문이다. IP 프로토콜에서는 checksum을 정상적으로 확인 할 수 있다. 


관련 내용 : 

http://packetlife.net/blog/2008/aug/23/disabling-checksum-validation-wireshark/


MTU(Maximum Transmission Unit) 크기를 초과하는 UDP 패킷은 단편화 되어 전송이 된다. TCP처럼 sequence number 헤더가 없는 UDP의 재조립은 IP 헤더의 identification 필드를 이용해 이루어진다.