ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • TCP/IP 소켓 프로그래밍 - 6장 : UDP 기반 서버/클라이언트
    네트워크 2024. 6. 18. 02:34


    6장

    06-1 UDP에 대한 이해

    데이터 송수신은 TCP 소켓을 생성해 TCP 방식으로 진행하는 것 또는

    UDP 소켓을 생성해 UDP 방식으로 진행해야한다.

     

    UDP 프로토콜은 TCP 프로토콜과 달리 상대방의 수신여부를 알 수 없다.

    그러나, TCP보다 훨씬 간결한 구조로 설계되어 있어, 구현이 쉽다. 훨씬 빠르다.

     

    생각만큼 데이터의 손실이 자주 발생하는 것도 아니다.

    TCP와 UDP를 구분짓는 가장 큰 차이점은 흐름제어에 있다.

    IP의 역할은 호스트 B를 떠난 UDP 패킷 (또는 TCP 패킷)을 호스트 A에게 전달되도록 하는 것이다.

    UDP의 역할은 그렇게 전달된 UDP 패킷을 호스트 A내 존재하는 UDP 소켓 중 하나에게 최종 전달하는 것이다.

     

    다시 말하면, UDP의 가장 중요한 역할은 호스트로 수신된 패킷을 PORT 정보를 참조해 최종목적지인 UDP 소켓에 전달하는 것이다.


    UDP의 사용

    압축파일의 경우에는 패킷 1개의 손실이 큰 문제를 일으킬 수 있어 TCP를 사용해야 한다.

    인터넷 기반 실시간 영상 또는 음성 전송의 경우, UDP를 사용할 수 있다.

     

    알아둘 점은, UDP가 TCP에 비해서 언제나 빠른 속도를 내는 것은 아니라는 점이다.

     

    TCP가 UDP에 비해 느린 이유는 2가지가 있다.

    1. 데이터 송수신 이전, 이후에 연결 설정(three-way handshaking) , 해제 과정 (four-way handshaking)
    2. 데이터 송수신 과정에서 신뢰성 보장을 위한 흐름제어 ( seq 번호 붙이기, 재전송, ack 보내기, timer 등)

    UDP가 TCP보다 훨씬 효율적이고 빠르게 동작할 수 있는 환경은

    1. 송수신하는 데이터의 양이 적고
    2. 잦은 연결을 필요로 할 때이다.

    06-2 UDP 기반 서버/ 클라이언트의 구현

    UDP에서 서버와 클라이언트는 서로 연결되어 있지 않다.

    TCP처럼 연결 설정과정이 필요없고, 따라서 listen 함수와 accept함수가 불필요하다.

     

    UDP 소켓의 생성과 데이터의 송수신 과정만 있으면 된다.

    UDP에서는 서버, 클라이언트 상관없이 하나의 소켓만 있으면 된다.

     

    TCP에서는 소켓과 소켓의 관계가 일대일이었지만,

    UDP에서는 하나의 소켓으로 둘 이상의 호스트와 통신이 가능하다.

     

    TCP 소켓은 상대방 소켓과 연결된 상태이기 때문에,

    데이터 전송 시에는 주소 정보를 따로 추가하는 과정이 필요 없다.

     

    그러나, UDP 소켓은 연결상태가 아니므로,

    데이터를 전송할 때마다 목적지 주소정보를 별도로 추가해주어야 한다.

     

    #include <sys/socket.h>
    
    ssize_t sendto(int sock, void *buff, size_t nbytes, int flags, struct sockaddr *to, socklen_t addrlen);
    
    //성공 시 전송된 바이트 수, 실패 시 -1 리턴

    위 코드는 UDP에서 데이터 전송할 때 사용하는 함수이다.

    TCP의 write함수와는 다르게, 목적지의 주소 정보를 인자로 담는 것에 주목하자.

     

    #include <sys/socket.h>
    
    ssize_t recvfrom(int sock, void *buff, size_t nbytes, int flags, struct sockaddr *from, socklen_t *addrlen);
    
    //성공 시 수신한 바이트 수, 실패 시 -1 리턴

    위 코드는 UDP에서 데이터 수신할 때 사용하는 함수이다.

     

    UDP와 TCP의 비교

    UDP와 TCP를 비교해 정리하면 아래 표와 같다.

     

      UDP TCP
    연결지향적 X O
    흐름 제어(flow control) X O
    속도 빠름 느림
    신뢰성(reliability) 낮음 높음
    sequencing X O
    데이터 전송 시 목적지 주소 정보 별도 추가 필요 필요 없음.
    소켓과 소켓의 관계 한 소켓으로 여러 호스트와 소통 가능 한 소켓은 상대 호스트의 한 소켓과만 소통 가능
    연결 및 해제 과정 필요 없음. three-way handshaking 같은 별도의 연결 및 해제 과정 필요
     

     

    UDP 클라이언트 소켓의 주소 정보 할당

     

    모든 소켓에는 IP와 port가 할당되어야 한다.

    직접 할당하느냐, 자동으로 할당하느냐의 차이뿐이다.

     

    UDP 에서는

    1. sendto 함수호출 이전에 bind 함수를 통해 주소정보를 할당하거나
    2. sendto 함수호출 시 주소 정보 할당이 되지 않았다면, 처음 sendto함수가 호출될 시, 해당 소켓에 IP와 Port가 자동으로 할당된다.

    코드를 찾아보면 socket을 생성만 했을 뿐, 별도의 주소 정보를 할당하는 과정이 불필요하다.


    06-3 UDP의 데이터 송수신 특성과 UDP에서의 connect 함수 호출

    TCP 기반에서는 데이터에 경계가 존재하지 않는다.

     

    바꿔 말하면,

    “데이터 송수신 과정에서 호출하는 입출력함수의 호출 횟수는 별 의미가 없다”는 뜻이다. (read/write)

     

    UDP는 데이터의 경계가 존재하는 프로토콜이므로, 호출하는 입출력함수의 횟수가 매우 중요하다.

    입력함수의 호출횟수와 출력함수의 호출횟수가 일치해야,

    송신된 모든 데이터를 완벽히 수신할 수 있다.

     

    UDP 소켓이 전송하는 패킷을 데이터그램이라고도 한다.

    TCP 패킷은 데이터의 일부일 때가 일반적이라면,

    UDP 패킷은 하나의 데이터 그 자체라는 의미가 있다.

     

    Connected UDP 소켓과 Unconnected UDP 소켓

    목적지 정보가 등록되어 있지 않은 소켓을 ‘unconnected 소켓’,

    목적지 정보가 등록되어 있는 소켓을 ‘connected 소켓’이라고 한다.

     

    UDP 소켓은 기본적으로 unconnected 소켓이지만, 하나의 호스트와 오래 데이터를 송수신해야하면,

    connected 소켓으로 만드는 것도 고려해볼 수 있다.

     

    connect함수를 호출해주기만 하면 connected 소켓이 된다.

     

    connected UDP 소켓은 송수신의 대상이 정해졌기 때문에,

    write, read 함수 호출로도 데이터 송수신이 가능해진다.



Designed by Tistory.