세미나 1주차 : TCP VS UDP

devjhin0904·2021년 2월 28일
0
post-thumbnail

2021-03-01 발표

개요

가장 기억에 남는 기술 면접 질문은?


그거야...

"TCP와 UDP 차이점을 설명해보세요"

  • 왜? ⇒ 지금까지 본 면접 중에서 이거 안물어본 적이 없었음(기출 100%)
  • 그럼에도 드는 의문점: 난 클라이언트 개발자 지원했는데 왜 이걸 계속 물어보는 거야?
    • 내가 TCP UDP 직접 만들 것도 아닌데 이게 그렇게 중요해?
    • 학교에서 네트워크 수업 잘 들었는지 확인하려는 거야?
    • 그냥 CS 상식 확인하려고?

이번 세미나의 목적

  1. TCP UDP 지식 한 번 쫙 정리해서 앞으로 볼 면접에서 답변 잘하기
  2. 게임 클라이언트 직무에서 이 지식이 필요한 이유 생각해보기(면접관이 맨날 물어보는 이유)

Transport Layer


  • 뜻: 전송 계층

IP 5계층 모델과 Transport 레이어의 위치

  • 구조: 네트워크 계층 구조에서 Application과 Network(Internet) 계층 사이에 있는 레이어

    ⇒ Application 계층과 직접 맞닿아 있는 유일한 계층.

  • 역할: Sender와 Reciever 프로세스 사이의 통신을 담당.

  • 사용 프로토콜: TCP, UDP

TCP와 UDP


  • Transport 계층에서 사용되는 IP 네트워크 기반 프로토콜.
  • Network Layer의 IP를 통해서 전달된 패킷을 추적하고 관리하는 역할
  • Header는 Port Number 정보를 가짐.
    • Port Number로 Socket을 구분할 수 있기 때문에 동일한 IP에서 2개 이상의 Socket 통신이 가능함(Multiplexing/Demultiplexing)

TCP


  • Transmission Control Protocol
  • 뜻: 전송이 제어되는 프로토콜

TCP Segment 구조

  • TCP는 데이터를 특정 크기의 Segment 단위로 쪼개서 전달함.
    • 각 Segment마다 TCP Header를 부착하여 IP 레이어로 보낸다.
    • 보통 Segment 크기는 IP Packet 크기보다 작게 설정되기 때문에 한번 더 쪼개지는 일은 없다.
  • 실제 데이터의 의미적인 경계를 고려하지 않고 쪼갠다.
    • 즉, Segment 하나가 온전한 Message를 가지지 못함
    • 모든 Segment를 재조립해야 온전한 Message를 구성할 수 있다.

(1) Connection-Oriented

  • Point to Point 통신
    • 1명의 Sender와 1명의 Reciever 사이의 1:1 통신.
    • Connection을 형성하기 때문에 양방향적 통신이 가능.
  • Handshaking
    • Sender와 Reciever가 Control 메시지를 교환하면서 서로 통신이 가능한 상태인지 확인하고, Connection을 형성 또는 해제하는 과정
    • 사용 알고리즘: 3-Way Handshaking(연결 형성 시), 4-Way Handshaking(연결 해제 시)

(2) Reliablity & Ordering

  • Reliablity: 데이터가 Error와 Loss없이 전달됨을 보장함.
    • 주의: Packet Error/Loss가 전혀 발생하지 않는다는 말은 아님.
    • 대신 Loss/Error를 탐지하여 Sender에게 재전송을 요청하는 Recovery 과정을 통해 Reliability를 보장한다.
  • Ordering: 데이터를 전달받는 순서를 보장함.
    • 실제로 전달받는 패킷 순서는 다를 수 있지만, TCP 차원에서 정리해서 전달해줌.

(3) Flow Control

  • Receiver에서 처리할 수 있는 양보다 Sender에서 전송하는 메세지 양이 지나치게 많을 경우, Receiver에서 Buffer Overflow가 발생할 수 있음.
  • Flow Control: Receiver 상황에 따라 Sender의 전송을 조절하여 Overflow를 방지한다.
    • 주로 사용되는 알고리즘: Sliding Window
      • 간단히 설명하면, Reciever에서 설정한 Sliding Window 사이즈에 해당하는 영역 내에서만 전송이 가능함.

(4) Congestion Avoidance

  • Congestion: 데이터 전송량이 너무 많아 Network가 감당하기 어려운 상태
    • 심해질수록 Packet Loss, Queueing Delay가 증가함(Router 차원)
  • TCP Congestion Control: Sender의 Transmission Rate를 적절히 조정하여 Congestion을 피한다.
    • 주로 사용되는 알고리즘: AIMD
      • 간단히 설명하면, Transmission Rate를 조금씩 올리면서 전송하다가 Packet Loss가 감지되면 Transmission Rate를 확 깎는 것을 반복하는 방식

TCP 장점

다양한 기능 제공

  • UDP와 비교했을 때 사용하기 편리한 특성(Reliable, Ordered)을 가짐
  • Flow/Congestion Control 등의 최적화 기능

개발의 편리함

  • 위의 기능들을 직접 구현할 필요 없이 사용할 수 있다.
  • 괜히 TCP/IP가 인터넷 표준이 아님.

TCP 단점

느린 속도

  • 많은 기능을 제공하는 만큼 오버헤드도 크다.
    • Handshake 과정에서 발생하는 지연시간
    • Packet Loss/Error 발생시, 재전송/재수신에 드는 지연 시간
    • Flow/Congestion Control에 따라 속도가 감소할 수 있음.

상황에 따라서는 불필요한 기능

  • TCP가 제공하는 기능들로 이득을 볼 여지가 적다면, TCP 사용은 성능 낭비에 불과함.
  • 물론 TCP의 동작을 On/Off할 수 있는 Option이 있긴 하지만, 그럴바에는 다른 프로토콜을 사용하는 것이 효율적일 수도 있음.

Broadcast/Multicast 미지원

  • 1:1 Connection 특성상 Broadcast/Multicast 전송 기능을 기본적으로 제공하지 않음

TCP 활용 예시

(1) 응답 시간에 덜 민감한 Application

  • Turn-based RPG 게임 등
  • 또는, TCP의 응답시간을 감수할 수 있는 Realtime 게임

(2) Reliable이 매우 중요한 Application

  • 대부분의 컨텐츠(채팅, 게임 등등)
  • 파일 전송 등 Error와 Loss가 허용되지 않는 데이터

UDP


User Datagram Protocol

UDP Datagram 구조

  • 서로 독립적인 Datagram 단위로 데이터를 전달.
    • Datagram 하나가 온전한 메세지를 담음.
  • Datagram을 적절하게 구분하는 것은 사용자(User)의 역할
    • 그래서 이름이 User Datagram Protocol 임.

Connectionless

  • Sender, Receiver 사이에 Handshaking 등의 Connection 형성 과정이 없다.
  • 따라서, 일방향적 통산만 가능.

Unrealiable & Unordered

  • Packet Loss에 대한 Recovery 작업 없음.
  • 대신, UDP 헤더의 16 bit Checksum을 제공하여 Error 감지에 활용할 수 있다.
    • 단, 100% 신뢰는 불가능.

No Congestion/Flow Control

  • Reciever의 Buffer OverFlow와 Network Congestion 에 따른 특별한 처리 없이 바로바로 보낸다.

UDP의 장점

(1) 빠른 속도

  • 제공하는 기능이 별로 없어서 오버헤드가 적다.
  • 초기 Connection 형성 과정(Handshake)이 없기 때문에 이로 인한 Delay 없음
  • Flow/Congestion Control에 따른 처리에 대한 오버헤드 없음.
  • Reliable/Ordering을 보장하기 위한 오버헤드 없음

(2) 간단한 구조와 동작원리

  • 작은 Header Size (8Byte)
    • TCP는 Segment 하나에 최소 20Byte에서 60byte 까지도 늘어날 수 있다.
  • TCP의 필요없는 기능들을 강제로 사용할 필요 없음

(3) Broadcast와 Multicast 전송 지원

  • 1:1 통신만 지원하는 Point to Point 방식이 아니기 때문에 1:1, 1:N, N:M 전송이 가능함.

UDP 단점

(1) 제공하는 기능이 적음

  • Reliability와 Ordering 보장 안함.
    • Packet Loss/Error 자동 처리 없음. CheckSum은 신뢰하기에는 부족함.
  • Flow/Congestion Control 없음.
  • TCP와 달리 Packet 조립/재조립 자동으로 안해줌

(2) 개발의 어려움

  • 위에서 언급한 기능들이 UDP 통신에서 필요한 경우, 직접 구현해야 됨.'
  • TCP의 복잡성을 생각해보면, 결코 쉬운 일이 아님.

UDP 활용 예시

(1) 응답 시간에 매우 민감한 Application

  • Realtime Application
    • 예: FPS, MMORPG와 같이 빠른 응답시간을 요구하는 게임 장르

(2) Reliable이 덜 중요한 Application

  • 동영상 등의 Streaming Multimedia, DNS(Domain Name Service) 등

다시 TCP VS UDP 질문으로 돌아와서..


그러면 UDP에서는 TCP의 기능을 절대 못 쓰는 건가요?

  • 그건 아님. UDP 프로토콜 차원에서 해당 기능들을 제공하지 못한다는 것일 뿐.
    • 대표적인 예시: League of Legends 는 UDP 기반으로 제작
    • Realtime AOS 장르 게임에서는 Reliable Transport가 거의 필수적일텐데, 어떻게 UDP로 구현한거지?
  • 방법1: UDP를 사용하되, TCP의 응용 기능들을 Application Layer 단에서 직접 구현.
    • 문제점: Poor TCP Implementation over UDP
      • 어설프게 구현하면 그냥 TCP 가져다 쓰는 것만도 못하다는 말.
  • 방법2: TCP와 UDP을 동시에 사용.
    • 필요에 따라서 전달 방식을 취사 선택.
    • 이론상 완벽한 것 같지만, 실제 적용은 결코 쉽지 않다고 함.
      • 구현이 굉장히 복잡해지고 동시에 사용했을 때 발생하는 성능 저하 이슈 발생 가능

결론: 아 그래서 TCP와 UDP 중 뭐가 더 좋냐구요?

  • 딱 잘라 말할 수 없음.
    • 두 프로토콜의 장단점이 명확해서 전략적인 결정이 필요.
    • 앞서 말했듯이, UDP위에 TCP 기능을 구현할 수 있기 때문에 결정하기 더 어려움...
    • TCP VS UDP 선택 논란이 끊임없이 지속되는 이유.
  • 고려사항 1: 전달할 데이터의 특성.
    • 응답 시간에 민감한 데이터인가?
    • Reliable/Ordering이 반드시 보장되어야 하는 데이터인가?
  • 고려사항 2: 프로젝트의 규모와 성격
    • 이론적으로는 UDP를 응용해서 프로젝트에 최적화된 Transport 시스템을 직접 구축하는게 성능적인 면에서는 최적이라고 볼 수 있겠지만, 많은 Workload가 요구되는 작업.
    • 프로젝트 규모나 성격에 따라서는 이런 시스템을 개발할 여력이 없거나 굳이 필요하지 않을 수 있다.
  • 게임 데이터와 프로젝트의 특성을 파악하여 최적의 전송방식을 결정하는 것은 Client 프로그래머의 역할이 될 수 있다.
    • 면접에서 왜 맨날 물어봤는지 이제 알겠지?

Summary


예시 면접 답변

  1. TCP와 UDP는 Sender/Receiver 응용 프로세스 사이의 통신 서비스를 제공하는 Transport Layer에서 사용되는 프로토콜입니다.
  2. 먼저, TCP는 Connection 지향 프로토콜로, Handshake 통신을 통해 Sender/Receiver 사이에 Point to Point Connection을 형성하여 데이터를 주고받습니다.
  3. TCP는 Error/Loss 패킷을 감지하여 Sender에게 재전송을 요청하는 Error Control 과정을 통해, 데이터 전달의 신뢰성(Reliability)과 전달 순서(Ordering)를 보장합니다.
  4. 또한, Receiver의 버퍼 상태에 따라 Sender의 전송 속도를 조절하는 Flow Control과, 네트워크 혼잡도 상태 등을 반영하여 Sender의 전송속도를 조절하는 Congestion Control 기능을 지원합니다.
  5. 하지만, 많은 기능을 제공하는 만큼 그 구조와 동작 방식이 매우 복잡하며, 오버헤드가 커서 UDP보다 속도가 떨어집니다.
  6. 반면, UDP는 Connectionless 프로토콜로, Handshake 통신을 통한 Connection을 요구하지 않으며, TCP보다 훨씬 단순한 구조와 방식으로 데이터를 주고받습니다.
  7. UDP는 데이터 전달의 신뢰성(Reliability)과 전달 순서(Ordering)를 보장하지 않으며, Flow Control과 Congestion Control 기능을 지원하지 않습니다. 대신, TCP보다 훨씬 더 적은 기능을 제공하는 만큼 오버헤드가 적어 TCP보다 속도가 빠릅니다.
  • 필요에 따라서 Segment /Datagram 또는 단방향/양방향 언급 추가

더보기

쓰다보니 TCP의 세그먼트와 UDP의 데이터그램과 같은 전송단위 개념이 헷갈렸는데, 아래 글들을 좀 보니깐 이해가 되었음.

https://se-sik.tistory.com/32

https://github.com/martinkang/Study/blob/master/LinuxNetworkProgramming/TCP-UDP-difference.md

Reference

  1. Kurose, J. F.& Ross, K. W. (2016). Computer Networking: A Top-Down Approach (7th ed.). Pearson Education.
  2. Gaffer On Games: UDP VS TCP. https://gafferongames.com/categories/game-networking/

Copyright

이 글에서 사용되는 자료 이미지들은 Kurose, J. F.& Ross, K. W. (2016). Computer Networking: A Top-Down Approach (7th ed.). Pearson Education.에서 제공하는 PPT Slide 자료에서 가져왔습니다.

profile
유니티/c#/c++/VR 게임 클라이언트 개발에 관심있는 학생입니다.

0개의 댓글