2021-03-01 발표
개요
가장 기억에 남는 기술 면접 질문은?
그거야...
"TCP와 UDP 차이점을 설명해보세요"
- 왜? ⇒ 지금까지 본 면접 중에서 이거 안물어본 적이 없었음(기출 100%)
- 그럼에도 드는 의문점: 난 클라이언트 개발자 지원했는데 왜 이걸 계속 물어보는 거야?
- 내가 TCP UDP 직접 만들 것도 아닌데 이게 그렇게 중요해?
- 학교에서 네트워크 수업 잘 들었는지 확인하려는 거야?
- 그냥 CS 상식 확인하려고?
이번 세미나의 목적
- TCP UDP 지식 한 번 쫙 정리해서 앞으로 볼 면접에서 답변 잘하기
- 게임 클라이언트 직무에서 이 지식이 필요한 이유 생각해보기(면접관이 맨날 물어보는 이유)
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 감지에 활용할 수 있다.
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
예시 면접 답변
- TCP와 UDP는 Sender/Receiver 응용 프로세스 사이의 통신 서비스를 제공하는 Transport Layer에서 사용되는 프로토콜입니다.
- 먼저, TCP는 Connection 지향 프로토콜로, Handshake 통신을 통해 Sender/Receiver 사이에 Point to Point Connection을 형성하여 데이터를 주고받습니다.
- TCP는 Error/Loss 패킷을 감지하여 Sender에게 재전송을 요청하는 Error Control 과정을 통해, 데이터 전달의 신뢰성(Reliability)과 전달 순서(Ordering)를 보장합니다.
- 또한, Receiver의 버퍼 상태에 따라 Sender의 전송 속도를 조절하는 Flow Control과, 네트워크 혼잡도 상태 등을 반영하여 Sender의 전송속도를 조절하는 Congestion Control 기능을 지원합니다.
- 하지만, 많은 기능을 제공하는 만큼 그 구조와 동작 방식이 매우 복잡하며, 오버헤드가 커서 UDP보다 속도가 떨어집니다.
- 반면, UDP는 Connectionless 프로토콜로, Handshake 통신을 통한 Connection을 요구하지 않으며, TCP보다 훨씬 단순한 구조와 방식으로 데이터를 주고받습니다.
- 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
- Kurose, J. F.& Ross, K. W. (2016). Computer Networking: A Top-Down Approach (7th ed.). Pearson Education.
- 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 자료에서 가져왔습니다.