본문 바로가기

개발 노트/네트워크

[프로토콜] UDP Header / UDP 동작

반응형

❏ UDP


❍ 사용자 데이터그램 프로토콜(User Datagram Protocol, UDP)은 인터넷 프로토콜 스위트의 주요 프로토콜 가운데 하나입니다. TCP와 함께 데이터 그램으로 알려진 단문 메시지를 교환하기 위해서 사용됩니다. UDP Universal Datagram Protocol 이라고 일컫기도 합니다.


 UDP의 전송 방식은 너무 단순해서 서비스의 신뢰성이 낮고, 데이터 그램 도착 순서가 바뀌거나, 중복되거나, 통보 없이 누락시키기도 합니다. UDP는 일반적으로 오류의 검사와 수정이 필요 없는 애플리케이션에서 수행할 것으로 가정합니다.


 UDP를 사용하는 네트워크 애플리케이션에는 도메인 이름 서비스(DNS), IPTV, 음성 인터넷 프로토콜(VoIP), TFTP, IP터널, 그리고 많은 온라인 게임 등이 있습니다.


 UDPTCP와 같은 Transport Layer에 위치합니다. TCP가 연결지향적이고 신뢰할 수 있는 데이터의 흐름을 제공하는 반면 UDP는 비연결지향성(connectionless)이며, 데이터의 흐름을 신뢰할 수 없다는 특징이 있습니다.


 UDP Header 구조


 UDP 헤더 구조


- Source Port / Destination Port

Source Port는 메시지를 보내는 측에서 통신을 위해 사용하는 Port 번호

Destination Port는 목적지, 즉 메시지를 받는 측의 통신 Port 번호


- Total Length

헤더와 데이터를 합한 사용자 데이터그램의 전체 길이를 정의합니다. UDP 데이터그램의 헤더인 8바이트부터 65507바이트 사이의 값이 됩니다.


- Checksum

→ 헤더와 데이터를 모두 포함한 사용자 데이터그램 전체에 대해 오류를 탐지하기 위해 사용됩니다.


 UDP 동작


 비연결형 서비스

- UDP에 의해 보내어진 각 사용자 데이터그램은 서로 독립적이라는 것을 의미합니다. 동일한 발신지 프로그램으로부터 동일한 목적지 프로그램으로 전송되더라도 서로 다른 데이터그램들 사이에는 아무런 연관 관계가 없습니다. 사용자 데이터그램에는 번호가 붙지 않으며 연결 설정, 종료 과정이 없습니다.


 흐름제어와 오류제어

- 흐름제어도 없고 윈도우 메커니즘도 없으므로 수신 측에서 들어오는 메시지로 인해 오버플로우가 발생할 수 있습니다. 검사합을 제외하고 UDP에는 오류제어 메커니즘이 없습니다. 이것은 메시지가 없어지거나 중복되었는지 송신자가 알 수 없다는 것입니다. 수신자가 Checksum을 사용하여 오류가 있음을 발견하면 사용자 데이터그램은 폐기가 됩니다.


 캡슐화와 역 캡슐화


- 캡슐화

→ 프로세스가 UDP를 통하여 보낼 메시지가 있을 때 UDP로 메시지와 한 쌍의 소켓 주소 그리고 데이터의 길이를 보냅니다. UDP는 데이터를 받은 후 UDP 헤더를 추가하고 소켓 주소들과 함께 사용자 데이터그램을 IP로 보냅니다. IP는 자신의 헤더를 추가하는데 이 헤더에서 Protocol Field의 값을 17로 설정하여 데어터가 UDP로부터 왔음을 알립니다. 이 후 데이터 링크 계층, 물리 계층을 거쳐 원격 시스템으로 보냅니다. 이러한 일련의 과정을 캡슐화라 합니다.


- 역 캡슐화

→ 메시지가 목적지 호스트에 도착하면 물리 계층, 데이터 링크 계층은 헤더와 트레일러 들을 없앤 후 데이터를 IP로 보냅니다. IP 소프트웨어는 IP단계의 검사를 수행하고 만약 오류가 없으면 헤더를 없앤 후 송신자/수신자 IP주소와 함께 사용자 데이터그램을 UDP로 보냅니다. UDP는 검사합을 사용하여 전체 사용자 데이터그램을 검사하여 오류가 없으면 헤더를 없앤 후 송신자 소켓 주소와 함께 응용 데이터를 프로세스에 전달합니다. 수신된 메시지에 대해 응답을 보낼 필요가 있을 경우에 대비하여 송신자 소켓 주소가 프로세스에 전달됩니다. 이 과정을 역 캡슐화라 합니다.


 다중화와 역 다중화


- 다중화

→ 송신자 측에서 사용자 데이터 그램을 보내고자 하는 프로세스가 여러 개 있더라도 UDP는 하나만 있습니다. 이것은 다--일 관계입니다. 포트 번호가 서로 다른 프로세스들로부터 메시지를 수신하면, UDP에는 헤더를 추가한 후 IP로 사용자 데이터 그램을 보냅니다.


- 역 다중화

→ 수신자 측에서 사용자 데이터 그램을 받고자 하는 프로세스가 여러 개 있더라도 UDP는 하나만 있습니다. 이것은 일대다 관계입니다. UDP는 사용자 데이터그램을 IP로부터 받아 오류를 점검하고 헤더를 없앤 후 포트 번호에 의거하여 각 메시지를 적절한 프로세스로 보냅니다.


 큐잉


- 클라이언트에서 프로세스가 시작될 때 이 프로세스는 운영체제에 포트 번호를 요청합니다. 구현에 따라 각 프로세스에 연계된 입력 큐와 출력 큐가 같이 생성되기도 하고 입력 큐만 생성되기도 합니다.


- 프로세스가 여러 프로세스와 통신하기를 원한다 하더라도 하나의 포트 번호만을 배정받으며 결과적으로 하나의 입력 큐와 출력 큐만을 받습니다. 대부분의 경우 클라이언트가 획득한 큐는 임시 포트 번호로 식별되며 프로세스가 수행되는 동안 큐도 동작을 하고, 프로세스가 종료되면 큐는 제거됩니다.


- 클라이언트의 출력 큐에는 오버플로우가 발생할 수 있으며, 발생하면 운영체제는 클라이언트 프로세스에게 기다리라고 요청합니다.


- 메시지가 클라이언트에 도착하면 UDP는 사용자 데이터그램에 지정된 포트 번호에 대한 입력 큐가 생성되어 있는지 점검합니다. 큐가 있으면 UDP는 수신된 사용자 데이터그램을 큐의 끝에 추가하고, 없으면 사용자 데이터그램을 폐기하고 ICMP 프로토콜에 “port unreachable”메시지를 서버로 보낼 것을 요청합니다.


- 서버에 메시지가 도착하면 UDP는 사용자 데이터그램의 목적지 포트 번호 필드에 지정된 포트 번호를 위한 입력 큐가 생성되어 있는지 점검하며, 큐가 있으면 UDP는 수신된 사용자 데이터그램을 큐의 끝에 추가합니다. 입력 큐가 없거나 오버플로우가 발생하면 UDP는 사용자 데이터그램을 폐기한 후 ICMP 프로토콜에 “port unreachable” 메시지를 클라이언트로 보낼 것을 요청합니다.


반응형