현생/TCP 소켓 프로그래밍

6-3. UDP의 데이터 송수신 특성 - 데이터의 경계 [UDP/IP][C][LINUX]

푸더기 2022. 1. 18. 23:03
반응형


UDP는 TCP와 달리 데이터의 경계가 존재하는 프로토콜입니다. 따라서 데이터의 송수신 과정에서 호출하는 입출력 함수의 호출 횟수가 큰 의미를 갖습니다.
그렇기 때문에 데이터를 전부 수신하기 위해선 입력함수의 호출횟수와 출력함수의 호출횟수는 완벽하게 일치해야합니다.
만약 데이터를 수신하는 호스트A와 데이터를 송신하는 호스트B가 다음과 같이 송수신을 한다고 합시다.

//호스트 A// 
for(int i=0; i<3; i++){ 
	sleep(5); 
    ... 
    str_len = recvfrom(sock, message, BUF_SIZE, 0, (struct sockaddr*)&your_adr,&adr_sz);
    printf("... %s ...", message); 
}
//호스트 B// 
sendto(sock,msg1, sizeof(msg1),0, ...); 
sendto(sock,msg1, sizeof(msg2),0, ...); 
sendto(sock,msg1, sizeof(msg3),0, ...);

호스트B는 바로 sendto함수를 3번 호출해서 데이터를 송신하지만 호스트A는 5초간격으로 데이터를 수신합니다.
만약 데이터의 경계가 없는 TCP라면 단 한번의 입력함수 호출로 모든 데이터를 수신할 수 있지만, UDP는 데이터의 경계가 존재하므로 3번의 sendto 호출이 있었으니 3번의 recvfrom 호출이 있어야 모든 데이터를 읽어들일 수 있습니다.

따라서 UDP 기반의 데이터 송수신과정에서는 입출력 함수의 호출횟수를 일치시켜야 합니다.

UDP 소켓이 전송하는 패킷을 가리켜 데이터그램이라고도 하는데, UDP의 데이터 전송특성상 하나의 패킷이 하나의 데이터이므로 데이터그램이라고 표현하기도 합니다.

반응형