Today I Learned
TCP/IP 소켓 프로그래밍(5) 본문
01. TCP보다 UDP가 빠른 이유는 무엇인가? 그리고 TCP는 데이터의 전송을 신뢰할 수 있지만 UDP는 신뢰할 수 없는 이유는 또 무엇인가?
- TCP보다 UDP가 빠른 이유는 UDP 소켓의 특성에 있다. UDP는 TCP보다 훨씬 간결한 구조로 설계되어 있기 때문이다.
ACK와 같은 응답 메시지를 보내는 일도 없으며, SEQ와 같이 패킷에 번호를 부여하는 일도 없다.
- 앞서 TCP는 신뢰성이 없는 IP를 기반으로 신뢰성 있는 데이터의 송수신을 위해 '흐름제어(Flow Control)'를 한다고 하였다. 바로 이 흐름제어가 UDP에는 존재하지 않기 때문에 신뢰할 수 없는 이유이다. TCP만큼은 아니지만 생각만큼 데이터의 손실이 자주 발생하는 것은 아니라고 한다.
02. 다음 중 UDP의 특성이 아닌 것을 모두 고르면?
a. UDP는 TCP와 달리 연결의 개념이 존재하지 않는다. 따라서 반드시 TCP에서 보인 것처럼 1대 1의 형태로 데이터를 송수신하지 않을 수 있다.
b. UDP 기반으로 데이터를 전송할 목적지가 두 군데라면, 총 두개의 소켓을 생성해야 한다.
c. UDP 소켓은 TCP 소켓이 할당한 동일한 번호의 PORT에 재할당이 불가능하다.
d. UDP 소켓과 TCP 소켓은 공존할 수 있다. 따라서 필요하다면 한 호스트상에서 TCP 방식과 UDP 방식의 데이터 송수신을 모두 진행할 수 있다.
e. UDP 소켓을 대상으로도 connect 함수를 호출할 수 있는데, 이러한 경우 UDP 소켓도 TCP 소켓과 마찬가지로 Three-way handshaking 과정을 거치게 된다.
03. UDP 데이터그램이 최종 목적지인 상대 호스트의 UDP 소켓에 전달되는데 있어서, IP가 담당하는 부분과 UDP가 담당하는 부분을 구분 지어 설명해보자.
- 예를 들어, 호스트 A를 떠난 UDP 패킷이 호스트 B에게 전달되도록 하는 것이 IP의 역할이다. 이렇게 전달된 UDP 패킷(데이터그램)을 호스트 B에 존재하는 UDP 소켓 중 하나에게 최종 전달하는 것이 UDP의 역할이다. 즉, 호스트로 수신된 패킷(데이터그램)을 PORT 정보를 참조하여 최종 목적지인 UDP 소켓에 전달하는 것이다.
04. UDP는 일반적으로 TCP보다 빠르다. 그러나 송수신하는 데이터의 성격에 따라서 그 차이는 미미할 수도 있고, 반대로 매우 클 수도 있다. 그렇다면 어떠한 상황에서 UDP는 TCP보다 매우 좋은 성능을 보이는지 설명해보자.
- 실시간 영상 및 음성을 전송하는 경우
멀티미디어 데이터는 그 특성상 일부가 손실되어도 크게 문제되지 않는다. 잠깐의 화면 떨림, 또는 아주 작은 잡음 정도는 그냥 넘어갈만하다. 하지만 실시간으로 서비스를 해야 하므로 속도가 상당히 중요한 요소가 된다. 이러한 경우가 UDP 기반의 구현을 고려할만한 상황이다. 따라서 송수신하는 데이터의 양은 작으면서 잦은 연결이 필요한 경우에는 UDP가 TCP보다 훨씬 효율적이고 빠르게 동작한다.
05. 클라이언트 TCP 소켓은 connect 함수를 호출할 때 자동으로 IP와 PORT가 할당된다. 그렇다면 bind 함수를 호출하지 않는 UDP 소켓은 언제 IP와 PORT가 할당되는가?
- UDP 프로그램에서는 데이터를 전송하는 sendto 함수호출 이전에 bind 함수를 호출해서 주소정보를 할당해야 한다. 물론 bind 함수는 TCP 프로그램의 구현에서 호출되었던 함수이다. 그러나 이 함수는 TCP와 UDP를 가리지 않으므로 UDP 프로그램에서도 호출 가능하다. 만약에 sendto 함수호출 시까지 주소정보가 할당되지 않았다면, sendto 함수가 처음으로 호출되는 시점에 해당 소켓에 IP와 PORT번호가 자동으로 할당된다. 또한 이렇게 한번 할당되면 프로그램이 종료될 때까지 주소정보가 그대로 유지되기 때문에 다른 UDP 소켓과 데이터를 주고받을 수 있다.
06. connect 함수의 호출문장은 TCP 클라이언트의 경우 반드시 삽입해야 하는 문장이다. 그러나 UDP의 경우는 선택적으로 삽입이 가능하다. 그렇다면 UDP에서 connect 함수를 호출하면 어떠한 이점이 있는가?
- UDP 소켓은 기본적으로 unconnected 소켓이다. 이러한 UDP 소켓은 다음과 같은 상황에서는 매우 불합리하게 동작한다.
IP 211.210.147.82, PORT 82번으로 준비된 총 세 개의 데이터를 세 번의 sendto 함수호출을 통해서 전송한다.
이 경우 데이터 전송 세 단계(UDP 소켓에 목적지의 IP와 PORT번호 등록 -> 데이터 전송 -> UDP 소켓에 등록된 목적지 정보 삭제)를 3회 반복해야 한다. 그래서 하나의 호스트와 오랜 시간 데이터를 송수신해야 한다면, UDP 소켓을 connected 소켓으로 만드는 것이 효율적이다. 데이터 전송 세 단계가 UDP 데이터 전송과정의 약 1/3에 해당한다고 하니, 이 시간을 줄임으로 적지 않은 성능향상을 기대할 수 있다.
'TCP IP' 카테고리의 다른 글
TCP/IP 소켓 프로그래밍(4) (0) | 2022.08.16 |
---|---|
TCP/IP 소켓 프로그래밍(3) (0) | 2022.08.09 |
TCP/IP 소켓 프로그래밍(2) (0) | 2022.08.05 |
TCP/IP 소켓 프로그래밍(1) (0) | 2022.08.04 |