들어가며
UDP는 비연결지향형 방식이다. 간단한 특징을 읊어보면
- 전송 도중 데이터가 손실될 수 있다.
- 속도가 빠르다
로 볼 수 있다. 그럼 UDP는 어떤식으로 동작하길래 속도가빠른걸까??
UDP 내부 동작 원리
UDP는 TCP와 달리 흐름제어를 하지 않는다. UDP 동작 과정을 그림으로 이해해보자.
UDP 통신엔 IP의 역할, UDP의 역할이 나뉜다.
IP의 역할: 정해진 경로로 송신하고자하는 곳 까지 전송
UDP의 역할: 송신하고자하는 Host에서 어느 Port의 소켓으로 전송할 것 인지 정하고 전송
UDP의 특징
UDP가 TCP보다 빠르다
UDP가 TCP보다 빠른이유는 단지 이 두 가지 때문이다.
- 데이터 송수신 전/후에 하는 연결설정, 해제 과정이 없다.
- 데이터 송수신 과정에서 발생하는 신뢰성보장을 위한 흐름제어가 없다.
UDP는 하나의 소켓만 필요로한다
TCP통신에선 소켓과 소켓의 관계가 1대1로 이뤄지기 때문에 서버에선, 문지기역할을 하는 소켓, 클라이언트와 연결할 소켓을 추가적으로 만들어줘야했다. 하지만 UDP는 그렇지않다. 하나의 소켓만으로도 여러 Host와 통신이 가능하다.
데이터의 경계선이 존재한다.
TCP통신의 경우 데이터의 경계선이 없어, 3번에 걸쳐 보낸 데이터도 recv함수 한 번만으로 3번 분량의 데이터를 받을 수 있었다. 하지만 UDP의 경우 다른 Host와 연결되어있지 않아, 데이터의 경계선이 존재한다.
그 말은 즉, 3번의 송신이 있었다면, 3번의 수신을 해주어야한다는 것이다.
Connected UDP 소켓
UDP소켓의 전송 과정은 세 가지 이다.
- UDP 소켓에 목적지의 IP,PORT 등록
- 데이터 전송
- UDP 소켓에 등록된 목적지 정보 삭제
이 과정을 알고, 이 상황을 본다면 비효율적이라는 것을 알 수 있다.
IP 211.210.147.82에 PORT 82번으로 100개의 데이터를 전송한다.
100번이나 3개의 과정을 실행해야한다. 이것을 해결하기 위한 것이 Connected UDP 소켓이다.
생성 방법
※윈도우 기준으로 작성된 코드입니다.
소켓을 SOCK_DGRAM 타입으로 생성한 후, connect를 진행하면된다.
SOCKADDR_IN adr;
SOCKET sock = socket(PF_INET, SOCK_DGRAM, 0);
memset(&adr, 0, sizeof(adr));
adr.sin_family = AF_INET;
adr.sin_addr.s_addr = ....;
adr.sin_port = ....;
connect(sock, (sockaddr*)&adr, sizeof(adr));
마무리
UDP가 TCP보다 속도가 빠르다고, UDP가 더 우월한 방법인 것은 아니다. 또한 UDP가 데이터가 손실된다고 TCP가 더 우월한 방법인 것도 아니다. UDP는 데이터 손실이 그렇게 많이 일어나지 않는다.
그래서 TCP의 경우 데이터가 손실되면 안되는 압축파일을 다운 받는 경우에 많이 사용한다. UDP의 경우 실시간 스트리밍 같은 곳에 많이 사용된다! 각 특징들을 잘 알고 때에 맞는 방법을 사용해야한다!
참고
'TCP-IP 소켓 프로그래밍' 카테고리의 다른 글
주소할당 에러(Binding Error)를 이해해보자 (1) | 2023.09.04 |
---|---|
TCP 소켓의 우아한 연결종료(Half-close)를 이해해보자 (1) | 2023.08.31 |
TCP의 내부 동작 원리를 이해해보자 (1) | 2023.08.28 |
TCP/IP 프로토콜을 이해해보자 (1) | 2023.08.28 |
빅 엔디안(Big Endian)과 리틀 엔디안(Little Endian)을 이해해보자 (1) | 2023.08.26 |