전송 계층
전송 계층은 프로세스 간 통신을 제공하고 흐름 및 오류 제어 메커니즘을 제공한다.
데이터 스트림을 application에서 전송 계층으로 전달하면
연결을 생성하고 스트림을 전송 가능한 단위로 쪼개어 번호를 붙인 후 하나씩 전송한다.
수신 측에서는 수신된 데이터 단위를 확인하고 오류 없는 데이터만 수신 프로세스에 전달하는 흐름을 제공한다.
하지만 UDP는 이런 과정을 거치지 않는다.
연결이 없는(connectionless) 비신뢰성(unreliable) 전송 프로토콜로 간주되어
데이터 단위를 송수신 과정에서 전달하여 신뢰성 있는 전송을 보장하지 않고, 매우 제한적인 오류 확인만 수행한다.
또한 호스트 간이 아닌 프로세스 간 통신을 제공하며 UDP 패킷에 맞게 데이터 단위를 작게 조정해야 한다.
신뢰성이 부족한 UDP를 굳이 사용하는 이유는 간단하고 가벼운 프로토콜에서 오는 장점이 있기 때문이다.
단순하고 낮은 오버헤드 덕분에 신뢰성을 크게 요구하지 않는 작은 메시지를 빠르게 전송할 수 있다.
보통 실시간 서비스를 위한 메시지 전송에 사용된다.
또한 TCP에 비해 송신자와 수신자 간의 상호작용 비용이 적기 때문에 작은 메시지 전송에서 매우 효율적이다.
UDP (User Datagram Protocol)의 역할
IP (Internet Protocol)는 컴퓨터 수준에서의 (호스트 간의) 데이터 전달을 처리하고 (특정 컴퓨터 식별)
UDP (User Datagram Protocol)는 데이터를 적절한 프로세스에 전달하는 역할을 담당한다.
(해당 호스트에서 실행 중인 특정 프로세스를 식별)
UDP는 특정 프로세스를 식별하기 위해 포트 번호를 사용하는데,
이를 통해 클라이언트와 서버 간 데이터 교환을 식별한다.
(클라이언트는 임시 포트 번호를 사용하고, 서버는 사전에 정의된 포트 번호를 사용한다.)
IP 주소가 네트워크에서 특정 컴퓨터를 식별하고, 데이터를 전달할 호스트를 선택하면
포트 번호는 해당 호스트에서 실행 중인 특정 프로세스를 식별하고
IP 헤더와 UDP 헤더를 결합하여 호스트와 프로세스 간 통신을 가능하게 해준다.
IANA (Internet Assigned Numbers Authority)로 포트 번호 분류하기
IANA에 의해 정의된 포트 번호는 3가지로 분류된다.
- Well-known Ports (잘 알려진 포트):
- 범위: 0에서 1,023까지.
- 특정 표준 서비스(예: HTTP, FTP 등)에 사용된다. (서버에서 사용)
- Registered Ports (등록된 포트):
- 범위: 1,024에서 49,151까지.
- IANA에 의해 제어되지는 않지만, 중복을 방지하기 위해 IANA에 등록해야 함
- Dynamic Ports (동적 포트):
- 범위: 49,152에서 65,535까지.
- 제어되지 않으며, 어떤 프로세스든 사용할 수 있는 임시 포트(클라이언트가 사용?)로 간주된다.
위의 분류 외에
0번에서 1023번 사이의 몇몇 Well-known Ports(잘 알려진 포트 번호)는 사전에 특정 서비스나 프로토콜에 대해 할당되어 정의되어 있다. (궁금하면 찾아보고)
이 포트번호와 IP 주소를 결합하여 소켓 주소 (Socket Address)를 만들어낼 수 있다.
소켓 주소는 네트워크 상의 특정 프로세스를 식별하기 위해 사용된다.
UDP는 소켓 주소를 통해 데이터가 어디에서 어디로 가야 하는지를 정확히 지정할 수 있다.
UDP 헤더의 주요 필드
출발지 포트 번호 (Source Port Number)
송신 측에서 사용하는 포트 번호이다.
(클라는 임시 포트번호, 서버는 정해진 포트번호 사용)
목적지 포트 번호 (Destination Port Number)
수신 측에서 실행 중인 프로세스에 사용되는 포트 번호다.
길이 (Length)
UDP 데이터그램의 전체 길이(헤더 + 데이터)를 나타낸다.
(IP는 UDP 길이에 IP 헤더 길이( Pseudoheader )까지 더한것)
Pseudoheader 구조
- 32비트 출발지 IP 주소
- 32비트 목적지 IP 주소
- 8비트 프로토콜 번호 (UDP의 경우 17)
- 16비트 UDP 총 길이
체크섬 (Checksum)
데이터그램 전반의 오류를 감지하는 데 사용된다.
그런데 UDP 체크섬은 IP 패킷 및 ICMP의 체크섬 계산과 다르다.
송신 측에서의 체크섬 계산 단계
- Pseudoheader를 UDP 데이터그램에 추가.
- 체크섬 필드를 0으로 초기화.
- 총 바이트 수를 16비트 단위로 나눔.
- 바이트 수가 홀수인 경우 0으로 패딩.
- 모든 16비트 값을 더하고, 1의 보수 연산 수행.
- 계산된 결과를 체크섬 필드에 삽입.
- Pseudoheader와 패딩을 제거.
- UDP 데이터그램을 IP 소프트웨어로 전달하여 캡슐화.
수신 측에서의 체크섬 계산 단계
- Pseudoheader를 UDP 데이터그램에 추가.
- 필요한 경우 패딩 추가.
- 총 비트를 16비트 단위로 나눔.
- 모든 16비트 값을 더하고, 1의 보수 연산 수행.
- 결과가 모두 0이라면 Pseudoheader와 패딩을 제거하고 데이터그램 수락.
UDP 체크섬 계산 예시
입력 데이터들
- Pseudoheader 정보:
- 출발지 IP 주소: 153.18.8.105
- 목적지 IP 주소: 171.2.14.10
- 프로토콜 번호: 17 (UDP)
- UDP 길이: 15 (헤더 + 데이터)
- UDP 헤더 정보:
- 출발지 포트 번호: 1087
- 목적지 포트 번호: 13
- 체크섬: 0 (계산 시에는 0으로 초기화)
- UDP 데이터:
- 문자열 TESTING으로 표현.
위 데이터들을 입력했으면 각 필드 값을 16비트 이진수로 변환한다.
이 때 데이터의 길이가 홀수일 경우, 마지막에 0을 추가하여 패딩한다.
이후, 체크섬을 계산한다.
Pseudoheader와 UDP 헤더, 데이터와 같은 모든 필드를 순서대로 배열하고
모든 16비트 값을 1의 보수 덧셈을 사용해 합한다.
덧셈 결과가 16비트를 초과하면 초과한 비트를 끝에 다시 더한다.
최종 합산 결과에 1의 보수 연산을 하여 이 값을 UDP 체크섬 값에 넣는다.
UDP에서 전송되는 각 데이터그램은 독립적인 데이터그램으로 간주하기 때문에
데이터그램 간의 순서는 보장할 수 없고, 각각 다른 경로를 통해 전송될 수 있다.
또한 흐름 및 오류 제어가 없기 때문에
수신 측에서는 메시지 오버플로우가 발생할 수 있고, 송신 측은 데이터가 손실되거나 중복되었는지 확인할 수 없다.
그래서 UDP를 사용하는 프로세스는 별도의 흐름 제어 및 오류 제어 메커니즘을 구현해야 한다.
이것이 Encapsulation과 Decapsulation이다.
애플리케이션 계층에서 생성된 메시지가 UDP 헤더(소스, 목적지 포트번호 등)과 결합되어 UDP 데이터그램을 형성하면
이 UDP 데이터그램은 IP 헤더와 프레임 헤더로 캡슐화되어 네트워크를 통해 전송된다.
이 때 중요한 것은 여러 애플리케이션의 데이터가 동일한 네트워크를 공유할 수 있도록
각 애플리케이션에 고유한 포트 번호가 부여됐다는 것이다.
수신 측에서는 캡슐화된 데이터그램의 목적지 포트 번호를 통해 올바른 애플리케이션으로 데이터가 전달된다.
프레임 헤더, IP 헤더가 순차적으로 제거되고 UDP 헤더와 데이터는 프로세스에 전달된다.
Multiplexing (다중화)
캡슐화 단계에서 소스 포트와 목적지 포트가 UDP 헤더에 포함됐다.
이 과정에서 각 데이터그램은 고유한 포트 번호로 구분될 수 있고,
포트 번호를 사용하여 여러 프로세스를 식별할 수 있다.
UDP는 별도의 연결 설정 없이 데이터를 전송하는 connectionless 프로토콜이므로
포트 번호를 통해 Multiplexing (다중화)을 할 수 있게 됐다.
다중화를 통해 송신 시 여러 프로세스를 포트 번호로 구분하여 데이터그램을 네트워크로 보낼 수 있다.
수신 측에서는 하나의 UDP 프로토콜이 IP 계층으로부터 데이터를 수신한다.
데이터그램 헤더를 확인하여 오류를 검사하고, 포트 번호를 기반으로 데이터그램을 적합한 수신 프로세스에 전달한다.
UDP의 큐 동작 예시

Daytime Client (클라이언트 측)
- 포트 번호: 52000 (임시 포트)
- 큐 종류:
- Outgoing Queue (송신 큐): 클라이언트가 데이터를 송신 대기열에 저장한 뒤, 네트워크를 통해 전송
- Incoming Queue (수신 큐): 서버로부터 도착한 데이터를 수신 대기열에 저장
Daytime Server (서버 측)
- 포트 번호: 13 (잘 알려진 포트)
- 큐 종류:
- Outgoing Queue (송신 큐): 서버에서 클라이언트로 응답 메시지를 대기열에 저장
- Incoming Queue (수신 큐): 클라이언트로부터 도착한 요청 메시지를 처리
UDP의 구성 요소
Control-block Table (제어 블록 테이블)
포트 상태를 추적한다.
Control Block Table 예시
State | Process ID | Port Number | Queue Number |
IN-USE | 2,345 | 52,010 | 34 |
IN-USE | 3,422 | 52,011 | - |
FREE | - | - | - |
IN-USE | 4,652 | 52,012 | 38 |
FREE | - | - | - |
Input Queues (입력 큐)
각 프로세스마다 하나의 입력 큐가 할당된다.
Control-block Module (제어 블록 모듈)
제어 블록 테이블을 관리하는 모듈이다.
프로세스 시작 시 운영 체제에서 프로세스 ID와 포트 번호를 수신한다.
여기에서 클라와 서버에 포트번호를 할당한다.
데이터 입력 모듈
IP 계층에서 데이터를 수신한 후,
입력 모듈이 데이터를 제어 블록 테이블을 참조하여 올바른 입력 큐로 전달한다.
(INPUT 모듈이 테이블에 포트번호를 검색하여 해당 큐 번호에 데이터그램 전달)
데이터 출력 모듈
출력 큐에서 데이터를 가져오면, 제어 블록 테이블에 따라 데이터를 전송한다.