본문 바로가기

Game Server

[C++/게임서버] TCP VS UDP

지난 글까지 소켓에 대해 이야기를 했으니, 그럼 이 소켓을 통해서 네트워크 상에서 어떻게 컴퓨터가 데이터를 보낼 것인가에 대해 적어보겠다.

 

예로 들어 내가 A 아파트 208호에 사는데, B 아파트에 101호에 보낸다고 가정하자. 그럼 택배 배송 회사는 상품에 대해 배송 정책을 정하고, 보내는 최종 주소를 지정한 뒤, 그 최종 경로에 대한 단지 경로를 설정하고, 그 이후 택배 운송을 시작할 것이다.

 

이는 네트워크 상에서도 마찬가지다. A 스위치와 맞물린 1번째 컴퓨터가 있다고 가정하자. 그럼 데이터를 보낸다면, 스위치를 통해서, 라우터로 간다. 그리고 TCP 계층인 어플리케이션 -> 트랜스포트 -> 네트워크 -> 데이터링크 -> 피지컬 계층을 거쳐 B 스위치에 맞물린 1001번째 컴퓨터로 갈 것이다. 


이 과정에서 TCP라는 프로토콜과 UDP라는 프로토콜이 등장한다. 먼저 TCP부터 설명하도록 하겠다.

TCP란 Transmission Control Protocol의 약자이다. 이는 한국어로 말하면 전송 제어 프로토콜이다. 이 프로토콜은 연결 지향성이다. 연결을 위해 할당되는 논리적인 경로가 있으며, 전송 순서가 보장된다. 

 

그리고 TCP는 느리지만 안전하다. 분실이 일어난다면, 책임지고 다시 전송하며, 물건을 주고 받을 상황이 아니라면 일부만 보내고(흐름/혼잡 제어), 그러다보니 속도가 UDP에 비해 느린 편이다. (그렇다고 진짜 느린 것이 아니다!)

 

데이터가 경계가 없다보니 만약 내가 받을 때 HELLO WORLD를 받는다면 HELLO / WORLD 이런 식으로도 HELLO WOR / LD 이런 식으로도 받을 수 있다.

 

흐름제어가 있기 때문에 만약 클라이언트의 sendbuffer에서 서버의 recvbuffer로 데이터를 보낼 때 만약 서버의 recvbuffer가 꽉찬 경우 기다렸다가 보내는 식이기 때문에, 네트워크 회선을 아낄 수 있다는 장점이 있다.


UDP는 위험한 총알 배송과 같다. 연결이라는 개념이 없으며 전송 순서가 보장되지도 않고, 패킷간의 경계의 개념이 존재를 하는 편이다. 

 

UDP는 분실에 대한 책임도 없고, 일단 보내고 생각하는 편이다. 그리고 이런 단순한 편이기 때문에 속도가 TCP에 비해서 빠른 편이다. 

 

UDP는 데이터의 경계가 있기 때문에 무조건 HELLO / WORLD로 보낸다면 받는 쪽도 순서는 다르더라도 이런 식으로 받게 된다.

 

흐름제어가 있기 때문에 만약 클라이언트의 sendbuffer에서 서버의 recvbuffer로 데이터를 보낼 때 만약 서버의 recvbuffer가 꽉찬 경우에도 일단 보내고 이 과정에서 패킷을 유실할 수 있다는 단점이 있다.