반응형
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의 데이터 전송특성상 하나의 패킷이 하나의 데이터이므로 데이터그램이라고 표현하기도 합니다.
반응형
'현생 > TCP 소켓 프로그래밍' 카테고리의 다른 글
7. TCP 기반의 Half-close : shutdown() [TCP/IP][C][LINUX] (0) | 2022.01.21 |
---|---|
6-4 UDP에서의 connect (connected UDP 소켓) [UDP/IP][C][LINUX] (0) | 2022.01.18 |
6-2. UDP 기반 간단한 서버와 클라이언트 구현 [UDP/IP][C][LINUX] (0) | 2022.01.18 |
6-1. UDP 소켓의 특성 [UDP/IP] (0) | 2022.01.18 |
5-3 TCP의 내부 동작 원리 (TCP 흐름 제어) [TCP/IP] (0) | 2022.01.17 |