여기에서는 대표적인 전송 계층 프로토콜 중 하나인 UDP(User Datagram Protocol)를 이용한 소켓 프로그래밍을 다룰 것이다.
TCP와 UDP는 전송 계층 프로토콜이라는 점에서 다음과 같은 공통점을 가지고 있다.
아래는 TCP와 UDP의 차이점이다.
항목 | TCP | UDP |
---|---|---|
1 | 연결형(connection-oriented) 프로토콜 - 연결 설정 후 통신 가능 | 비연결형(connectionless) 프로토콜 - 연결 설정 없이 통신 가능 |
2 | 신뢰성 있는 데이터 전송 - 데이터를 재전송함 | 신뢰성 없는 데이터 전송 - 데이터를 재전송하지 않음 |
3 | 일대일 통신(unicast) | 일대일 통신(unicast) 일대다 통신(broadcast, multicast) |
4 | 데이터 경계 구분 안 함 - 바이트 스트림(byte-stream) 서비스 | 데이터 경계 구분함 - 데이터그램(datagram) 서비스 |
UDP는 신뢰성 없는 데이터 전송을 하므로 오류를 체크하지 않을 것이라고 생각할 수 있지만 UDP는 TCP처럼 체크섬(checksum)을 이용해 데이터 오류를 체크한다. 하지만 TCP와 달리 UDP는 데이터 재전송과 데이터 순서 유지 작업을 하지 않기 때문에 신뢰성 없는 데이터 전송을 하는 것이다.
UDP는 도착한 데이터에 오류가 있다고 생각되면 이 데이터를 응용 프로그램에 전달하지 않고 그대로 삭제한다. 또한 TCP는 순서 유지를 위해 각 바이트마다 번호를 부여하지만 UDP는 비슷한 기능을 제공하지 않는다.
UDP를 이용해 신뢰성 있는 데이터 전송을 하려면 '데이터 재전송 + 순서 유지'라는 두 가지 기능을 구현해야 한다. 또한 UDP를 이용해 대량의 데이터(bulk data)를 주고 받으려면 '흐름 제어(flow control: 상대의 여유 버퍼 용량에 따라 데이터 송신량을 조절함)' 기능도 구현하는 것이 좋다. UDP에는 TCP와 같은 흐름 제어 기능이 없어 통신 상대의 현재 상태와 관계 없이 대량의 데이터를 보낼 경우, 여유 버퍼 공간의 부족으로 데이터가 버려질 수 있다.
UDP의 항목별 특징을 소켓 함수 관점에서 정리하면 다음과 같다.
connect()
함수를 사용하지 않는다.connect()
함수를 사용할 수 있지만 UDP는 연결 설정 개념이 없기 때문에 connect()
함수를 호출하여도 특별한 패킷 교환이 일어나지는 않는다.UDP 서버는 TCP 서버와 달리 멀티 스레드 등의 프로그래밍 기법을 사용하지 않고도 한 소켓으로 여러 클라이언트를 처리할 수 있다.
(7-1 그림)
위 그림은 UDP 서버과 UDP 클라이언트가 통신을 수행하는 원리를 보여준다.
IPv4 기반으로 동작하는 간단한 UDP 서버-클라이언트를 작성하고 테스트해보자
(7-2 그림)
작성된 서버와 클라이언트 예제의 동작은 위의 그림과 같다.
작성된 코드는 아래와 같다.
https://github.com/LEEBONGHAK/TCP-IP_window_socket/tree/main/Chapter07/UDPIPv4
참고 자료
김성우 저, "TCP/IP 윈도우 소켓 프로그래밍", 한빛아카데미, 2018