brunch

You can make anything
by writing

C.S.Lewis

by 지나가는행인 Feb 07. 2022

스타크래프트 속 작은 네트워크 디테일

TCP와 UDP의 차이에 대해

1. 학창 시절 기숙사에서의 스타크래프트 - ‘우리는 방법을 찾을 것이다, 늘 그랬듯이’

필자의 개인적인 ‘방법을 찾은 사례’를 떠오른다면, 아무래도 학창 시절을 골라야 할 것 같다. 당시에 인터넷이 되지 않았던 기숙사에서 생활했었는데, 하필이면 여유시간이 가장 많은 심야 시간에 인터넷이 안 된다니… 심지어 당시에는 스마트폰도 없던 시절이라 일과를 마치고 기숙사로 돌아온 이후에는 할 수 있는 것이 정말 제한적이었다.


그러나 예나 지금이나 게임을 정말 좋아했던 필자와 주변 친구들은 그 와중에도 게임을 같이 할 수 있는 획기적인 방법을 찾았었다. 지금은 어떻게 했었는지도 기억이 가물가물하고 아직 가능한지도 모르겠지만, 당시에는 노트북으로 로컬 네트워크를 만들 수 있었으며, 다른 노트북이 그 네트워크에 접속하면 인터넷은 되지 않더라도, 서로 통신은 가능했다. 그 덕분에 LAN (local area network, 근거리 통신망)으로 서로 통신할 수 있었던 스타크래프트, 워크래프트는 인터넷 없이도 같이 할 수 있었다.


스타크래프트 멀티플레이어 접속 화면


최근에도 추억을 떠오르며 친구들과 스타크래프트를 몇 번 한 적이 있지만, 이 화면을 제대로 쳐다본 것은 처음인 것 같았다. 의외로 생각보다 자세하게 로컬 네트워크에 연결하기 위한 조건까지 설명까지 해주고 있다.


2. TCP와 UDP의 본격적 소개

그렇다면 이 UDP(User Datagram Protocol)와 TCP(Transmission Control Protocol)는 뭐고, 각각의 차이는 뭐일까? 먼저 네트워크 프로토콜 (network protocol)의 정의부터 살펴보면 이렇다.


네트워크에 연결된 컴퓨터 간의 메시지 흐름을 통제하고 관리하는 기본적인 절차나 규칙을 정해 놓은 규약 (네이버 국어사전)


다시 말해서, 프로토콜은 쌍방 교신에 있어서 서로가 합의한 규칙이다.


네트워크 통신을 한 사람이 다른 사람한테 메시지를 전달하는 것에 비유하자. 다만, 주변에 소음이 매우 많아서, 말이 제대로 안 들릴 가능성도 있다 (실제로 네트워크를 통해서 데이터를 주고받을 때, 제대로 전송되지 않는 경우가 발생할 수 있다). 이런 상황에서 UDP는 속도, TCP는 신뢰성 (데이터의 정확한 전송, 예시에 빗대면 말을 정확하게 전달하는 것)에 집중한다.


UDP가 더 빠를 수 있는 이유는, 일방향 통신이기 때문이다. 아까 사용한 메시지 전달 비유를 사용하자면, 소음이 가득한 곳에서 상대방이 놓치는 부분이 있는지 확인하지 않는 채 일방적으로 계속 말하는 것이다.


또 하나의 예시를 들면, 필자 대학생 시절, MT 등에서 하던 팀 게임 중에 메시지를 전달하는 게임이 있었다. 첫 팀원이 주어진 메시지를 확인하고 그것을 보지 않고 휴대폰 타자로 치고 다음 타자한테 넘기면서 한 바퀴를 쭉 도는 것이다. 그러면 항상 정말 재미있고 독특한 최종 메시지가 생겼었는데! 실제로 네트워크에서 컴퓨터 A가 컴퓨터 B까지 통신하기 위해서는 여러 라우터를 거쳐야 해서, UDP의 일방적인 메시지 전달에서도 이와 비슷하게 부정확하거나 누락된 정보가 발생하고, 이것을 확인하거나 방지하는 방법이 없다.



TCP는 반면에 안정적인 방법으로 연결을 시작하고, 중간에 지속해서 내용 전달이 제대로 되었는지 확인한다. 먼저 TCP하면 뺄 수 없는, 개발자 면접에 자주 등장하는 three-way handshake, four-way handshake를 살펴보자.


3. TCP 통신

앞서 말했듯이, TCP는 꼼꼼하게 통신 상태를 확인하며 정보를 주고받는 프로토콜이다. 그래서 한 쪽에서 정보를 보내면, 상대방은 반드시 이 정보를 어디까지 받았는지 확인용 답신을 한다. 그래서 연결을 시작하는 단계부터도 이런 쌍방 통신이 이루어지는데, 이것이 바로 three-way handshake다.


아까의 비유를 이어서, 메시지 전달하고자 하는 전령이 있다. UDP 때는 상대방이 들을 수 있는지 확인하지 않았다면, 이번에는 말을 걸면서 상대가 대화할 준비가 되었는지 확인을 먼저 한다. 정확히는 아래와 같은 방법을 통해 연결한다:


1) 전령이 말을 걸면서 대화할 준비가 되었는지 물어본다.

2) 상대방이 확인하며 본인도 준비되었다고 답신을 보낸다.

3) 전령이 상대방의 메시지를 받고, 확인했다고 답신을 보낸다.


Three-Way Handshake

* 해당 예시 및 그림은 비전공자, 입문의 쉬운 이해를 위한 설명으로, 더 자세한 내용을 원하시면 추가로 찾아보길 권장합니다.


비슷한 방식으로, 연결을 해지하는 방법은 4-way handshake라 한다. 순서는 아래와 같다: 


1) 전령의 연결 종료 선언

2) 수신자가 확인 답신

3) 수신자가 연결 해지 준비됐다고 답신

4) 전령이 확인했다고 회신


Four-Way Handshake

* 해당 예시 및 그림은 비전공자, 입문의 쉬운 이해를 위한 설명으로, 더 자세한 내용을 원하시면 추가로 찾아보길 권장합니다.


TCP 기반 통신 시, 실제로 통신하는 과정에도 이와 비슷하게 지속해서 데이터를 어디까지 받았는지를 지속해서 업데이트한다.


4. 마치며

글을 마치며 네트워크와 관련된 간단한 게임 정보를 공유하고 싶었다. 비교적 최근 게임인 리그오브레전드(롤), 배틀그라운드 등에서는 한 명의 인터넷 상태가 안 좋으면 게임 내에서 당사자만 버벅거린다. 그 이유는, 인터넷이 안 좋은 플레이어는 서버에 계속 이동 혹은 공격하겠다는 신호를 보내지만, 인터넷 연결이 안 좋아서 여러 차례 보내더라도 서버에서 해당 신호를 원활하게 받지 못하기 때문이다. 그런데도 일부 명령어는 확인이 되어서, 조금씩 움직이거나 공격하기 때문에 다른 플레이어에게 이것은 버벅거리는 행동으로 보인다.


스타크래프트와 워크래프트는 연결 오류를 판단하는 방법이 조금 독특한데, 한 명의 인터넷이 안 좋으면 모든 플레이어가 그 플레이어의 인터넷 속도에 맞게 게임이 느려진다. 심할 때는 플레이어를 기다리고 있다고 뜨면서 인터넷이 느린 플레이어의 닉네임이 뜬다. 그래서 1:1로 플레이할 때는 서로의 닉네임이 뜨면서, 누구 때문에 느린 것인지 알 수가 없다.


서로 탓하는 유명한 스파이더맨 밈


그렇다면 오래 전 게임들과 최근 게임의 연결 방식이 다를까? 이 차이는 그저 게임 구현 방식에 의한 것으로, 그렇지는 않다. 아무리 UDP가 더 빠르다고 하더라도, 렉이 안 걸리는 대신에 내 명령어가 가끔씩 무시당하면, 아무 소용이 없기 때문이다. 그래서 게임은 물론이고, 실제로 대부분의 네트워크 통신은 TCP 기반으로 진행된다.

매거진의 이전글 비트플립(Bitflip)과 컴퓨터 자연재해
브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari