UDP 서버-클라이언트 구조

bolee·2022년 4월 24일
0
post-custom-banner

여기에서는 대표적인 전송 계층 프로토콜 중 하나인 UDP(User Datagram Protocol)를 이용한 소켓 프로그래밍을 다룰 것이다.

UDP 프로토콜 개요

TCP와 UDP는 전송 계층 프로토콜이라는 점에서 다음과 같은 공통점을 가지고 있다.

  • 포트 번호를 이용해 주소를 지정한다. 즉, 두 응용 프로그램이 TCP나 UDP를 이용해 통신하려면 반드시 포트 번호를 결정해야 한다.
  • 데이터 오류를 체크한다. TCP, UDP는 IP의 패킷 전송 기능을 기반으로 동작하는데, 전송 중 오류가 발생할 때 IP는 프로토콜 동작에 필수적인 IP 헤데에 대해서만 오류를 체크하고 데이터는 체크하지 않는다. 하지만 TCP와 UDP는 헤더와 데이터에 대한 오류도 체크한다.

아래는 TCP와 UDP의 차이점이다.

항목TCPUDP
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의 항목별 특징을 소켓 함수 관점에서 정리하면 다음과 같다.

  1. 열결 설정을 하지 않으므로 connect()함수를 사용하지 않는다.
    몇 가지 이유로 connect()함수를 사용할 수 있지만 UDP는 연결 설정 개념이 없기 때문에 connect()함수를 호출하여도 특별한 패킷 교환이 일어나지는 않는다.
  2. 프로토콜 수준에서 신뢰성 있는 데이터 전송을 보장하지 않으므로, 필요하다면 응용 프로그램 수준에서 신뢰성 있는 데이터 전송 기능을 구현해야 한다.
  3. 간단한 소켓 함수 호출 절차만 따르면 다자 간 통신을 쉽게 구현할 수 있다.
  4. TCP와 달리 응용 프로그램이 데이터 경계 구분을 위한 작업을 별도로 할 필요할 없다.

UDP 서버-클라이언트 동작 원리

UDP 서버는 TCP 서버와 달리 멀티 스레드 등의 프로그래밍 기법을 사용하지 않고도 한 소켓으로 여러 클라이언트를 처리할 수 있다.

(7-1 그림)

위 그림은 UDP 서버과 UDP 클라이언트가 통신을 수행하는 원리를 보여준다.

  • (a): 서버는 소켓을 생성하고 클라이언트가 데이터를 보내기를 기다린다. 이때 서버가 사용하는 소켓은 특정 포트 번호와 결합되어 있어 이 포트 번호로 도착한 데이터만 수신할 수 있다.
  • (b): 첫 번째 클라이언트는 연결 설정 없이 서버와 데이터를 곧바로 주고받는다.
  • (c): 첫 번째 클라이언트는 연결 설정 없이 서버와 데이터를 곧바로 주고받는다. TCP 서버와 달리 UDP 서버는 소켓을 한 개만 사용한다.
  • (d): UDP 서버-클라이언트가 통신하는 일반적인 상황이다. 'UDP 클라이언트 #n'처럼 한 클라이언트가 소켓을 두 개 이상 사용해 서버와 통신할 수도 있다.

UDP 서버-클라이언트 실습

IPv4 기반으로 동작하는 간단한 UDP 서버-클라이언트를 작성하고 테스트해보자

(7-2 그림)

작성된 서버와 클라이언트 예제의 동작은 위의 그림과 같다.

  • UDP 서버: 클라이언트가 보낸 데이터를 받고(recvfrom), 이를 문자열로 간주해 무조건 화면에 출력한다.(printf) 그리고 받은 데이터를 변경 없이 다시 클라이언트에 보낸다.(sendto) 받은 데이터를 그대로 다시 보낸다는 뜻으로 에코 서버(echo server)라 부른다.
  • UDP 클라이언트: 사용자가 키보드로 입력한(fgets) 문자열을 서버에 보낸다.(sendto) 서버에가 데이터를 그대로 돌려보내면, 클라이언트는 이를 받아(recvfrom) 화면에 출력한다.(printf) 에코 서버와 통신한다는 의미로 에코 클라이언트(echo client)라 부른다.

작성된 코드는 아래와 같다.

https://github.com/LEEBONGHAK/TCP-IP_window_socket/tree/main/Chapter07/UDPIPv4

참고 자료
김성우 저, "TCP/IP 윈도우 소켓 프로그래밍", 한빛아카데미, 2018

post-custom-banner

0개의 댓글