UDP (User Datagram Protocol)
UDP는 트랜스포트 계층 프로토콜이 할 수 있는 최소 기능으로 동작한다.
- 다중화/역다중화 기능과 간단한 오류 검사 기능을 제외하면 IP에 아무것도 추가하지 않는다.
- 애플리케이션 프로세스로부터 메시지를 가져와서 다중화/역다중화 서비스에 대한 출발지 포트 번호 필드와 목적지 포트 번호 필드를 첨부하고 다른 두 필드를 추가할 후에 최종 세그먼트를 네트워크 계층으로 넘겨준다.
- 세그먼트가 수신 호스트에 도착하면, UDP는 세그먼트의 데이터를 해당하는 애플리케이션 프로세스로 전달하기 위해 목적지 포트 번호를 사용한다.
- UDP는 세그먼트를 송신하기 전에 송신 트랜스포트 계층 개체들과 수신 트랜스포트 계층 개체들 사이에 핸드셰이크를 사용하지 않는다. 이런 이유로 UDP를 비연결형(connectionless)이라고 한다.
- DNS는 전형적으로 UDP를 사용하는 애플리케이션 계층 프로토콜의 예다.
많은 애플리케이션에서 TCP보다 UDP가 더 선호되는 이유
- 무슨 데이터를 언제 보낼지에 대해 애플리케이션 레벨에서 더 정교한 제어
UDP하에서 애플리케이션 프로세스가 데이터를 UDP에게 전달하자마자 UDP는 데이터를 UDP 세그먼트로 만들고, 그 세그먼트를 즉시 네트워크 계층으로 전달한다. 이에 반해 TCP는 혼잡 제어 메커니즘을 갖고 있는데, 이는 링크가 과도하게 혼잡해지면, TCP 송신자를 제한한다. 실시간 애플리케이션은 최소 전송률을 요구할 떄도 있고, 지나치게 지연되는 세그먼트 전송을 원하지 않으며, 조금의 데이터 손실은 허용할 수도 있으므로, TCP의 서비스 모델은 이러한 애플리케이션의 요구와는 맞지 않는다.
- 연결 설정이 없음
TCP는 데이터 전송을 시작하기 전에 3 방향 핸드셰이크를 사용한다. 반면 UDP는 공식적인 사전준비 없이 전송하기 때문에 연결 설정을 위한 어떤 지연도 없다.
- 연결 상태가 없음
TCP는 종단 시스템에서 연결 상태를 유지한다. 이에 반해 UDP는 연결 상태를 유지하지 않아 일반적으로 좀 더 많은 액티브 클라이언트를 수용할 수 있다.
- 작은 패킷 헤더 오버헤드
TCP는 세그먼트마다 20바이트의 헤더 오버헤드를 갖지만, UDP는 단지 8바이트의 오버헤드를 갖는다.
UDP 세그먼트 구조
UDP 체크섬
UDP 체크섬은 오류 검출을 위한 것이다. 세그먼트가 출발지로부터 목적지로 이동했을 때, UDP 세그먼트안의 비트에 대한 변경사항이 있는지 검사하는 것이다.
송신자 측에서 UDP는 세그먼트 안에 있는 모든 16비트 워드의 합산에 대해 1의 보수를 수행하며, 합산 과정에서 발생하는 오버플로는 윤회식 자리올림을 한다. 이 결과값이 UDP 세그먼트의 체크섬 필드에 삽입된다.
수신자에서는 체크섬을 포함한 모든 16비트 워드들이 더해진다. 만약 패킷에 어떤 오류도 없다면, 수신자에서의 합은 모든 비트가 1이 될 것이다. 만약 비트 중 하나라도 0이 있다면 오류가 발생했음을 할 수 있다. 하지만 체크섬 방식에는 취약한 점이 하나 있다. 수신 받은 패킷에 오류가 있더라도 모든 워드를 더했을 때 모든 비트가 1이 되는 상황이 있을 수 있기 때문이다.
UDP는 체크섬으로 오류 검사를 제공하지만, 오류를 회복하기 위한 어떤 일도 하지 않는다. 손상된 세그먼트를 그냥 버리기도 하고, 경고와 함께 손상된 세그먼트를 애플리케이션에게 넘겨주기도 한다.