Network TCP와 UDP

|

개인적인 연습 내용을 정리한 글입니다.
더 좋은 방법이 있거나, 잘못된 부분이 있으면 편하게 의견 주세요. :)


소켓을 공부하려다 보니 TCP/UDP 개념이 필요하게 되었습니다.
그 이유는 위 두개의 프로토콜이 소켓에서 데이터를 보내기 위해 사용하는 프로토콜이기 때문이죠!

TCP(스트림-양방향/연결형)

인터넷 상에서 데이터를 메시지 형태로 보내기 위해 IP와 함께 사용하는 프로토콜

일반적으로 TCP와 IP는 같이 사용이 되는데, 이때 IP는 데이터의 배달을 처리한다면 TCP는 패킷을 추적 및 관리하게 됩니다.
이때 패킷이란 데이터 조각을 의미합니다. 인터넷 내에서 데이터를 전송하기 위해서는 데이터를 통쨰로 전송하지 않고 경로배정(라우팅)을 효율적으로 하기위해 데이터를 여러 조각으로 나누어 전송을 하게 됩니다. 이때 조각조각 나뉘어진 데이터를 패킷이라고 합니다. 이렇게 조각조각 나누어진 패킷에는 각각의 번호가 부여되고 해당 번호를 통해 데이터가 온전하게 전달되었는지를 확인할 수 있게 됩니다.

이러한 TCP의 특징은 아래와 같습니다.

  1. 3-Way Handshake
  2. 연결형 서비스로 가상회선 방식을 제공
  3. 흐림제어 및 혼잡제어
  4. 높은 신뢰성
  5. UDP보다 낮은 속도

1. 3-Way Handshake

첫번째 특징으로 3-Way Handshake는 목적지와 수신지를 정확히 하여 정확한 전송을 보장하기 위해 하는 방식을 의미합니다.
이러한 정확한 전송을 보장하기 위해 Ack와 재전송 을 이용한답니다.

TCP는 패킷을 받을 때마다 Ack라는 별도의 패킷을 만들어 보냅니다. 이때 Ack는 Acknoledge의 약자로 말 그래도 잘 받았다! 라는 의미로 사용합니다. 즉 송신자가 패킷을 보내면 수신자는 n번 패킷 잘 받았으니 n+1번 패킷 보내주세요 라는 Ack를 보내게 됩니다. 즉 이를 통해 데이터가 잘 오고 갔음을 체크할 수 있게 됩니다. 재 전송이라는 것은 말그대로 Ack가 오지않았을때 송신자가 다시 수신자에게 패킷을 보내는 것을 의미합니다. 이때 Ack가 오지않는 경우는 다음과 같은 두가지 경우입니다.

  1. 수신자가 패킷을 받지 못해 정말로 Ack를 보내지 못한 경우
  2. 수신자가 패킷을 잘 받아서 Ack를 보냈지만 중간에 Ack가 유실된 경우

둘중 어떤 경우로 인해 Ack가 안온지는 알 수 없지만, 송신자는 일정 시간동안 Ack가 오지않으면 패킷을 재전송합니다.
비효율적으로 보일지는 몰라고 데이터를 못받을 일은 없으니 확실히 안정적이게 됩니다.

2. 연결형 서비스로 가상회선 방식을 제공

가상회선을 제공한다는 것은 아래 사진과 같습니다.

이렇게 위 사진에서도 볼 수 있듯 패킷 1,2,3은 사이좋게 정해진 파란색(가상회선)으로 전달되어지고 있습니다.
바로 저 파랑색 선이 가상회선(논리적 경로)가 되는 것입니다.

TCP에서 가상회선을 배정해주기 때문에 패킷들은 이 회선을 따라 움직이기만 하면 됩니다.
이를 통해 알 수 있는것은 데이터들이 전달될때 패킷이라는 데이터 조각으로 조각조각 나누어 전달되는것처럼 보여도 사실상 가상회선을 따라 데이터들이 순차적으로 움직이고 있기 때문에 패킷의 순서가 뒤바뀔일도 없게 되는 것이죠.

3. 흐름제어 및 혼잡제어

TCP는 흐름제어와 혼잡제어가 가능합니다.

  • 혼잡제어: 데이터를 송신하는 곳과 수신하는 곳의 데이터 처리속도를 조절합니다. 이를 통해 수신자의 버퍼 오버플로우를 방지할 수 있게 되죠
    • 송신자가 미친듯이 데이터를 보내버리면 수신자에게 데이터 처리를 하는데 문제가 생길 수 있기 때문에 이를 조절해줍니다.
  • 혼잡제어: 네트워크 내 패킷 수가 넘치지 않게 방지합니다. 패킷의 수가 너무 많아지면 패킷을 조금만 전송하여 네트워크의 혼잡을 막는것이죠

이렇게 TCP는 기능은 많아보이지만 그만큼 CPU의 부담도 커지기때문에 속도가 느려진다는 단점이 존재합니다.

따라서 TCP는 연속적으로 데이터를 주고받을 때 보다는 신뢰성 있는 연결을 중시할 때 사용된다고 합니다.
연속적으로 데이터를 주고받는 다는 것은 쉽게 말해 영상같은 실시간 스트리밍 데이터를 주고받을 때를 생각하면 쉽게 이해할 수 있습니다. 영상 스트리밍의 경우 1초만에도 수많은 데이터 즉 엄청나게 많은 프레임 패킷을 받게 됩니다. 이럴때 프레임 패킷 하나가 손실되었다고 해서 다시 손실된 데이터를 요청한다면, 실시간이라는 것이 결국 의미가 없어지게 될 것입니다. 이때는 프레임패킷 하나 손실되었다 해서 재요청을 하는것보다는 무시하고 계속 재생되는 것이 중요할 테니까요.

UDP(데이터그램-비연결형)

UDP에서는 데이터를 데이터그램 단위로 처리하는 것이 특징입니다.

이 데이터그램은 독립적인 데이터 단계를 지니는 패킷을 의미하는데, UDP도 데이터를 받기 위해 TCP와 같이 IP를 사용합니다. 다만 소켓을 만들어 서로 연결을 맺는 구조가 아닌 소켓을 만들어 그냥 UDP서버 IP, Port로 데이터를 보내버리는 개념입니다. 따라서 UDP 서버 하나에 여러 클라이언트들이 붙어 데이터를 받을 수 있게 되는 것을 의미합니다. 즉 명시적으로 연결을 맺지 않는 비 연결형 소캣이라고도 부릅니다.

일반적으로 TCP를 전화에, UDP를 편지로 비교한다고 합니다.

  • TCP의 경우 상대방의 번호(IP, Port)를 통해 전화를 걸어 연결이 되면 서로 의사소통을 주고 받죠
    • 들었니? > 아니! 다시말해줘
  • UDP의 경우 상대방의 번호(IP, Port)만 알면 그냥 편지에 데이터를 써서 우체통에 넣어버립니다.
    • 수신자는 자신의 편지통에 편지가 왔는지 직접 확인할때까지는 알수가 없고, 송신자 또한 편지를 보내긴 했지만 실제 그 편지를 받았는지도 읽었는지도 중간에 사라져버렸는지도 확인할 수도 관심도 없습니다.

이러한 UDP는 TCP와 달리 비연결형 소켓이기 때문에 연결을 위해 할당되는 논리적 경로가 없는것이 특징입니다.

TCP와 달리 파란색 가상선이 존재하지 않는 것을 볼 수 있습니다.

그렇기 때문에 UDP는 데이터들이 서로 다른 경로로 전송이 되고 각각의 패킷은 독립적인 관계이면서 실제 보낸 순서대로 도착하지 않을 수도 있습니다.
이런 패킷들을 데이터그램이라 하고 이러한 방식은 UDP라고 합니다.

이러한 UDP의 특징은 아래와 같습니다.

  1. 비연결형 서비스로 데이터 그램방식을 제공
  2. 정보를 주고받을 때 Handshake와 같은 신호절차를 거치지 않음
  3. 최소한의 에러만 검출
  4. 데이터가 제대로 도착할수도, 중간에 유실될 수도, 순서가 바뀌어 도착할수도 있음
  5. TCP보다 빠른 속도
  6. 낮은 신뢰성

UDP의 경우 연결을 맺고 끊는 과정이 존재하지 않고, Ack를 보내지도 않으며, 패킷 순서를 부여하여 추적 관리하거나 혼잡, 흐름 제어도 하지 않기 때문에 속도가 빠르고 네트워크 부하도 적습니다. 그러나 중간에 패킷 손실과 같은 것을 체크할 수도 없기 때문에 데이터 전송면에서 신뢰성이 떨어지는 것도 사실입니다.

따라서 TCP와 반대로 UDP는 신뢰성보다 연속성이 중요한 서비스에서 사용되는것이 옳습니다.