출처: TCP/IP 윈도우 소켓 프로그래밍(https://product.kyobobook.co.kr/detail/S000001636201)
1. UDP
TCP와 UDP는 전송 계층 프로토콜로 다음과 같은 공통점을 가진다.
- 포트 번호를 이용해 주소를 지정한다.
- 데이터 오류를 체크한다. IP의 패킷 전송 기능을 기반으로 동작하는데 전송 중 여러 원인으로 오류가 발생할 수 있다. IP는 프로토콜 동작에 필수적인 IP 헤더에 대해서만 오류를 체크하고 데이터는 체크하지 않는다. TCP, UDP는 헤더와 데이터에 대한 오류도 체크한다.
위와 같은 공통점을 제외하면 서로 상당히 다른 특징을 가지고 있다.
TCP
- 연결형 프로토콜로 연결 설정 후 통신이 가능하다.
- 신뢰성 있는 데이터 전송을 보장한다.(데이터 재전송)
- 일대일 통신(unicast)
- 데이터 경계 구분 안 함(바이트 스트림 서비스)
UDP
- 비연결형 프로토콜로 연결 설정 없이 통신이 가능하다.
- 신뢰성 없는 데이터 전송이다.(데이터 재전송 하지 않음)
- 일대일통신, 일대다통신(broadcast, multicast)
- 데이터 경계 구분함(데이터그램 서비스)
UDP의 신뢰성 없는 데이터 전송의 의미는 데이터 오류를 체크하지 않는 것이 아니다. 앞에서 말 한 것처럼 UDP는 TCP와 마찬가지로 체크섬(checksum)을 이용해 데이터 오류를 체크한다. 이 과정에서 데이터 오류가 발생하면 해당 데이터를 응용 프로그램에 전달하지 않고 폐기해린다.
신뢰성 없는 데이터 전송은 데이터 전송 과정에서 데이터 재전송과 데이터 순서 유지 작업을 하지 않는 특성 때문이라고 볼 수 있다. 따라서 UDP에서 신뢰성 있는 데이터 전송을 하려면 데이터 재전송 + 데이터 순서 유지 기능을 추가해야 하며, 흐름 제어가 없기 때문에 대량의 데이터 전송이 필요한 경우에는 흐름 제어 기능도 추가해주는 것이 좋다.
UDP의 이러한 특징을 소켓 함수 관점에서 정리하면 다음과 같다.
- 연결 설정이 필요 없기 때문에
connect
함수를 사용하지 않아도 된다. - 프로토콜 수준에서 신뢰성 있는 데이터 전송을 보장하지 않기 때문에, 필요하다면 응용 프로그램 수준에서 신뢰성 있는 데이터 전송 기능을 구현해야 한다.
- 간단한 소켓 함수 호출 절차만 따르면 다자 간 통신을 쉽게 구현할 수 있다.
- 응용 프로그램에서 데이터 경계 구분을 위한 별도의 작업을 할 필요가 없다.
2. UDP 서버 클라이언트 동작 원리
UDP 서버는 멀티스레드를 사용하지 않아도 하나의 소켓으로 여러 클라이언트를 처리할 수 있다. 이는 UDP 서버는 다음과 같이 통신을 수행하기 때문이다.
- 서버는 소켓을 생성하고 클라이언트가 데이터를 보내기를 기다린다.(특정 포트 점유 중)
- 첫 번째 클라이언트(UDP)는 연결 설정 없이 서버와 데이터를 곧바로 주고 받는다.
- 다음 클라이언트도 연결 설정 없이 서버와 데이터를 곧바로 주고 받는다.
- 경우에 따라 하나의 클라이언트가 소켓을 두 개 이상 사용해 서버와 통신할 수도 있다.
3. UDP 소켓함수
UDP 소켓과 연관된 운영체제의 구조체에는 TCP 소켓과는 달리 송신 버퍼가 없다. UDP는 신뢰성 있는 데이터 전송을 보장하지 않기 때문이다.( = 송신 버퍼는 데이터 재전송, 흐름 제어 등의 기능을 할 때도 사용한다.)
UDP 응용 프로그램에서 네트워크 통신을 수행하려면 다음과 같은 요소가 결정되어야 한다.
- 프로토콜: 통신 규약으로 소켓을 생성할 때 결정한다.
- 지역 IP 주소와 포트 번호: 서버 또는 클라이언트 자신의 주소다.
- 원격 IP 주소와 원격 포트 번호: 서버 또는 클라이언트가 통신하는 상대의 주소다.
UDP 서버 클라이언트에서 사용하는 소켓 함수는 지역/원격 주소와 포트 번호를 결정하기 위한 절차이다.
'네트워크 > 윈도우 소켓 프로그래밍' 카테고리의 다른 글
UDP 소켓 함수 (0) | 2024.04.18 |
---|---|
스레드 동기화 - 임계 영역, 이벤트 (0) | 2024.04.08 |
멀티스레드 TCP 서버 (0) | 2024.04.08 |
멀티 스레드 서버를 위한 스레드 기초 (0) | 2024.04.08 |
응용 프로그램 데이터 전송 (0) | 2024.04.08 |