[Network] TCP와 UDP의 차이

서정범·2023년 4월 27일
0

네트워크

목록 보기
21/26

TCP와 UDP는 전송 계층의 프로토콜입니다.

먼저, 둘의 차이점을 확인하기 전에 전송 계층에서 수행하는 역할을 이해해야 합니다.

전송 계층(Transport Layer)

전송 계층에서는 데이터를 어떻게 보낼 것인지 결정하는 역할을 수행합니다.

데이터를 전송하는데 있어서 중요한 것이 무엇이 있을까요? 저는 일단 이 두가지로 구분지을 수 있다고 생각합니다.

  • 신뢰성
  • 빠른 전송

이 두 가지로 구분되어서 TCP와 UDP를 구분지을 수 있을 것입니다.

TCP는 신뢰성이 있는 데이터를 보장하지만 그만큼 소요되는 지연이 많아집니다.

예를 들어서, 우리가 웹페이지를 접속해서 웹페이지 소스를 받으려고 생각해 봅시다.

웹페이지 소스를 받는 과정에서 데이터 손실이 일어난 상태로 받는다면 온전한 홈페이지 화면을 볼 수 없을 수 있습니다.

반면, UDP의 경우 다소 데이터 손실이 일어나도 빠른 전송을 우선시 합니다.

예를 들어서, 우리가 실시간 스트리밍을 본다고 생각해 봅시다.

우리는 이러한 플랫폼을 이용하면서 굉장히 부드러운 화면으로 제공되는 영상을 볼 수 있습니다.

TCP는 혼잡 제어라는 기능 때문에 시청자가 많아질 경우 버퍼링이 심하게 걸리거나, 전혀 실시간이지 않은 영상을 뒤늦게 받을 수 있습니다.

물론, UDP의 경우에는 데이터의 속도만 우선시 해서 데이터의 손실은 고려하지 않기 때문에 버퍼링이 일어나기도 하지만, TCP보다 플랫폼 특성에 잘 맞기 때문에 이용합니다.

이렇게 둘이 구분이 됩니다.

교과서적인 프로토콜의 특징들은 더이상 정형화된 개념이라고 보기 힘들다고 생각하는 것이 필자 생각입니다.

실제로 데이터의 신뢰성 자체를 중요시 여기는 HTTP 통신도 현재에 이르러서는 HTTP/3.0이 등장하면서 HTTP 통신은 UDP 기반에서 작동합니다.

사실 UDP는 앞서 말했던 것처럼 TCP가 신뢰성 있는 데이터를 전송하기 위한 작업들을 피하면서 빠른 전송을 가능케하는 것이 특징입니다.

하지만, 이것은 UDP가 신뢰성 있는 데이터절대 전송할 수 없다를 의미하는 것이 아닙니다.

구현되어 있는 기능을 제공하지 않는 것뿐이지 결국 UDP에서도 해당 기능들을 구현할 수 있습니다.

현재까지 계속해서 사용해왔던 정형화된 프로토콜은 시간이 지나면서 하드웨어에서 제공하는 리소스의 성능이 발전되었기 때문에 그 이상의 성능을 가진 다양한 프로토콜이 등장하게 됩니다.

교과서적인 내용에 얽매이지 말아야하는 시기가 왔습니다.

물론, 아직까지 계속해서 사용되고 있고, 발전하고 있는 단계인데다가 과거의 기술을 알고 넘어가는 것이 미래의 기술에 대한 이해를 높여주기 때문에 확실히 이해는 하고 갈 필요가 있다고 생각하는 것이 필자의 생각입니다.

TCP

앞서 TCP는 신뢰성 있는 데이터를 주고 받기 위해서 사용된다고 했습니다.

그걸 위해서 존재하는 기능들을 설명하겠습니다.

역시, UDP와 확실히 대비되는 특징은 3-way handshake입니다. 이 기능이 TCP를 연결 지향형 프로토콜로 만들어 줍니다.

연결을 하고 나서는 연결된 소켓으로 서로의 데이터만 주고 받을 수 있습니다.

데이터를 안전하게 보내기 위해서는 확인 절차가 필요합니다. 데이터가 잘 도착했는지 확인할 필요가 있는 것이죠.

그것을 위해서 순서 번호(sequence number)을 이용합니다. 이와 더불어서 효과적인 전송을 위해서 파이프라이닝(pipelining), GBN + SR 방식을 이용합니다. 또한, 데이터의 손실이 일어난 것을 확인하기 위해서 TimeOut, 3-duplicated ACK를 사용합니다.

데이터의 안전성은 이것으로 보장됩니다.

데이터의 안정성이 보장되었다고, 그냥 보내면 될까요? 되도록이면 데이터의 손실은 피하는 것이 좋습니다. 데이터의 손실이 일어날 경우 TCP는 보내는 양을 확 떨구기 때문에 이러한 이벤트 발생은 되도록이면 피해야 합니다.

그것을 위해서 데이터 전송 상황을 파악할 필요가 있습니다.

생각해봅시다. 데이터의 손실이 왜 일어나는 것일까요? 만약 내가 서버와 통신하는데 네트워크가 너무나도 깔끔한 상황이라면 오류가 거의 나오지 않을 것입니다.

네트워크 상에서 나만이 해당 네트워크를 이용하는 것이 아닙니다. 그렇기에 모두가 네트워크를 쓰고 있다는 것을 고려해야 합니다. 또한, 내 컴퓨터와 서버의 컴퓨터의 성능 차이도 존재하기 때문에 이러한 요소들을 고려해줄 필요가 있습니다.

먼저, 첫번째로 성능 차이로 인해서 발생하는 데이터 처리 속도를 고려해 봅시다.

이것을 위해서는 TCP 흐름제어 기능이 존재합니다.

송신측과 수신측의 데이터 처리 속도가 다르다면, 우리는 둘 다 고려를 해야 할까요? 아닙니다.

송신측의 데이터 전송 속도가 너무 빠르든, 수신측의 데이터 처리 속도가 더 빠르든 결국 받는 사람 입장에 맞춰서 보내기만 한다면 문제가 발생하지는 않을 것입니다.

TCP 흐름제어는 수신측의 데이터 처리 속도를 수치값, rwnd(receive window)로 표현을 해서 이것에 맞춰서 보내도록 송신측의 데이터 전송 속도를 조절합니다.

두번째로 네트워크 상에서 발생하는 네트워크 트래픽을 고려해 봅시다.

네트워크를 어느정도 공부한 사람이라면 송신측이 데이터를 보낼 때 송신측에서 수신측까지 다이렉트로 전달되는 것이 아니라 중개 서버, 라우터 등을 거치면서 전달되는 것을 알고 있을 것입니다.

이때 사용하는 라우터가 나만의 라우터가 아니기 때문에, 다른 호스트들과 공유되고 있습니다.

라우터에는 여러 입력 포트가 있고, 각각의 입력 포트마다 버퍼가 존재하는데 문제가 되나? 라고 생각할 수 있습니다.

사실 라우터에도 여러 입력 포트가 존재하고, 여러 사용자가 입력 포트를 나눠서 쓴다고 생각하면 좀 편하겠지만, 사실 그렇지 않고 하나의 입력 포트를 여러 호스트가 같이 사용한다고 합니다.

라우터는 입력 버퍼가 가득찰 경우 데이터를 버리는 방식(혹은 이전의 데이터를 버린다)을 사용하기 때문에 버퍼를 공유해서 사용하면 당연히 이 부분을 고려하지 않을 수가 없는 것이죠.

결국 우리는 이것을 해결하기 위해서 혼잡 제어 기능을 사용합니다.

혼잡 제어는 크게 3가지 기능을 갖추고 있습니다.

느린 시작(Slow Start), 혼잡 회피(Congestion Avoidence), 빠른 회복(Fast Recovery)를 사용합니다. 사실, 혼잡제어에서 빠른 회복은 필수 요소는 아니지만 나머지 두 기능은 필수 요소입니다.

이렇게 TCP의 주요 기능들을 살펴봤습니다.

제가 서술했던 내용들을 읽어왔다면, TCP의 주요 동작들이 전부 신뢰성 있는 데이터 전송을 위한 기능들임을 눈치챘을 것입니다.

UDP

UDP는 신뢰성 있는 데이터 전송 보다는 빠른 데이터 전송에 초점을 둡니다.

UDP는 네트워크 계층과 마찬가지로 호스트에게 "최선형" 전달 서비스로 데이터를 전달합니다.

위에서 봤던 TCP의 연결 설정을 UDP에서는 하지 않습니다.

서버에서 소켓을 열고 받을 준비를 하고, 클라이언트는 일단 보냅니다. 이게 도착을 할지 손실이 일어날지 생각하지 않고 일단 보냅니다.

그렇기 때문에 UDP는 빠른 전송이 가능합니다.

물론, UDP에서도 오류 검출 기능이 존재합니다. UDP 체크섬을 통해서 오류 검출을 하지만 이것은 정확한 방법이 아니기 때문에 데이터의 신뢰성을 보장하지는 않습니다.

기능이 적은 만큼 UDP는 TCP보다 적은 크기의 헤더를 가지고 있습니다.

특정 상황

이렇게 차이점을 정리 했는데, 다음과 같은 상황을 생각해 볼 수 있습니다.

만약 한 호스트는 실시간 스트리밍을 이용하여 UDP 기반으로 하는 패킷을 전송 받고 있고, 다른 한 호스트는 TCP 기반으로 데이터를 전송 받고 있다고 가정해 봅시다. 이때 전송되는 데이터는 같은 라우터를 사용하고 같은 입력포트를 거쳐서 데이터가 전달됩니다. 이 상황에서 큐에서 overflow가 발생한 상황입니다. 이러한 경우에는 어떻게 작동될까요?

솔직히 이 부분부터는 저의 생각과 구글링 + chatGPT의 의견으로 이루어져 있기 때문에 정확한 정보가 아닐 수 있다는 점 적어놓고 시작합니다.

다음과 같은 상황에서 스트리밍 서버에서 취할수 있는 3가지 방법이 있다고 합니다.

  1. 패킷 재전송 기능 활성화: UDP 기반으로 전송되는 패킷이 손실이 일어나도 데이터 재전송 작업은 일어나지 않습니다. 그래서 서버측에서 해당 패킷을 다시 전송하도록 요청하고, 이를 수신하는 클라이언트 측에서는 재전송된 패킷을 처리하여 스트리밍 서비스를 계속 이용할 수 있다고 합니다.
  2. 품질 서비스(QoS) 기능 활용: QoS 기능을 사용하여 UDP 기반을 전송되는 실시간 스트리밍 패킷에 우선순위를 부여하고, 패킷이 손실되더라도 더 높은 우선순위를 갖는 패킷을 먼저 처리함으로써 스트리밍 서비스의 연속성을 유지할 수 있습니다.
  3. TCP 기반 데이터 전송의 혼잡 제어 기능 활용: TCP는 혼잡 제어 기능을 갖추고 있어서, 데이터 손실이 발생한 경우 전송 속도를 조절하여 데이터 손실을 최소화할 수 있습니다. 이러한 기능을 활용하여 데이터 손실을 최소화하고, 실시간 스트리밍과 TCP기반 데이터 전송을 모두 지원하는 서비스를 제공할 수 있습니다.

사실 여기서, TCP 기반으로하는 패킷에 대한 처리가 나오지 않았는데, 기본적으로 이러한 상황이 발생하면 TCP는 혼잡 제어 기능이 수행됩니다. 혼잡 제어 기능을 수행하면서, 데이터의 속도를 조절해서 혼잡을 회피할 수 있는 방식으로 피해가는 것입니다.

이렇게 되면 UDP 기반으로 하는 데이터 전송에서는 데이터 속도를 줄이지 않고, TCP 기반으로 하는 데이터 전송에서만 데이터 속도를 줄이지 않는 것이냐? 라고 생각할 수 있습니다. 맞습니다.

UDP는 데이터 전송 속도를 제어하지 않기 때문에 속도를 줄이지 않을 것이고, 결국 TCP만 속도를 줄이게 되는 것이죠. 우리가 대용량 파일을 다운로드 할 때 다운로드 속도에서 큰 차이가 발생하는 것이 이 이유 때문일 수도 있습니다.


Reference

profile
개발정리블로그

0개의 댓글