> [!abstract] > SGCC는 자체적으로 마인크래프트 서버를 만들어 운영하고 있습니다. 월간 SGCC 9월호에서는 이 서버에 접속하는 과정에 숨어있는 원리를 설명하며 그처럼 간단한 과정에도 서버와 네트워크에 대한 다양한 지식이 숨어있다는 것을 보여드리고자 합니다. 서버와 네트워크는 컴퓨터공학을 전공하고 있더라도 대단히 막연한 주제일 수 있지만, 사실 우리의 일상생활에 굉장히 밀착되어 있는 주제이며 이에 대한 지식은 현대인의 매우 중요한 덕목 가운데 하나다. SGCC에는 자체 마인크래프트 서버가 있어서 동아리 내에서 마인크래프트를 즐기는 사람들은 이 서버를 통해 만나는데, 이번 월간 SGCC에서는 이 서버에 접속하는 과정을 파헤치며 우리 생활을 감싸고 있는 서버와 네트워크에 대하여 가볍게 알아볼 것이다. ![[MinecraftHomeScreen.png]] 마인크래프트를 켰을 때 처음 마주하게 되는 화면이다. 여기서 보통 온라인 플레이를 한다고 하면 '멀티플레이'나 'Minecraft Realms'를 이용하게 된다. SGCC의 서버는 Minecraft Realms가 아닌 독자적인 서버를 통해 제공되기 때문에 접속하기 위해서는 멀티플레이 버튼을 눌러보면 된다. <div style="page-break-after: always;"></div> # 멀티플레이 마인크래프트 멀티플레이의 특징 중 하나는 제작사가 관여하지 않는 제삼자 서버를 통해 제공된다는 점이다. 그런데 여기서 서버란 도대체 무엇일까? > [!info] tl;dr > 서버는 네트워크를 통해 접근할 수 있는 공간이다. 물리적인 부분만 보자면 서버는 기본적으로 다른 컴퓨터지만, 네트워크에 연결되어 서버의 역할을 수행하기 때문에 우리가 직접 서버 역할을 하는 컴퓨터에 연결되어 있지 않아도 다른 방법을 통해 접근할 수 있다. ## 서버와 네트워크 ![[SimpleNetwork.png]] 서버*Server*는 한 컴퓨터가 해내지 못하는 일을 여러 컴퓨터를 연결하는 방법으로 해내기 위해 존재한다. 수십년 전부터 공간의 제약에서 벗어나 개별적인 컴퓨터를 서로 연결해 작업하는 시스템이 고안됐는데, 이것이 바로 컴퓨터 네트워크*Computer Network*라는 시스템이다. 서버는 바로 이 컴퓨터 네트워크에서 개인이 감당하기 어려운 여러가지 작업을 대신하며 동시에 정보를 제공하는 일종의 도서관과 같은 역할을 한다. <div style="page-break-after: always;"></div> ## Client-Server Model ![[ClientServerModel.png]] 컴퓨터 네트워크의 가장 일반적인 형태 중 하나는 클라이언트-서버 모델이다. 이 모델에서 네트워크에 참여하는 컴퓨터들은 클라이언트와 서버로 구분되고, 클라이언트가 네트워크를 통해 서버에 정보를 요청하면 서버가 네트워크를 통해 그 정보를 클라이언트에게 반환한다. 도서관에 대출을 요청하면 그 책을 빌려주는 것과 마찬가지다. # 서버 찾아 삼만리 실제로 SGCC의 마인크래프트 서버는 동아리방 내의 아주 작은 미니PC를 사용한다. 이 미니PC가 마인크래프트 서버를 제공하고, 우리는 네트워크를 통해 이 서버에 접속하게 되는 것이다. 이제 실제로 SGCC의 마인크래프트 서버에 접속해보자. 아까 그 화면에서 진행 버튼을 누르면 이런 화면이 보인다. ![[MinecraftMultiplaySearching.png]] "로컬 네트워크에서 게임을 찾는 중"이라는 말과 함께 여러 버튼이 보인다. 여러가지를 설명하기 전에 우선 이 로컬 네트워크*Local Network*이 무엇인지부터 알아보자. <div style="page-break-after: always;"></div> > [!info] tl;dr > 로컬 네트워크는 서버와 같은 와이파이나 같은 공유기를 사용해야 접속할 수 있다. 집에서도 SGCC의 마인크래프트 서버에 접속하고 싶다면 다른 방법을 사용해보자. ## Local Area Network 여기서 말하는 로컬 네트워크는 정확히 말하자면 LAN*Local Area Network*을 의미한다. LAN은 근거리 통신망, 그러니까 접속 가능한 범위가 작은 네트워크를 의미한다. 물론 이렇게 '좁다'고만 말하면 구체적으로 얼마나 좁은 건지 모르니 당연히 다른 기준이 있다. ![[WirelessAndWiredLANs.png]] LAN에 접속하려면 위 그림처럼 서버 역할을 하는 컴퓨터와 같은 와이파이 혹은 같은 회선*circuit*을 사용해야 한다. 만약 다른 Wifi를 사용하거나 다른 회선을 사용하고 있다면 LAN에 접근할 수 없다. 그래서 LAN은 집이나 사무실, PC방과 같은 작은 범위를 넘어서지 못한다. ## Wide Area Network ![[LANAndWAN.png]] 그런 우리가 인터넷에 접속할 수 있는 것은 LAN보다 더 큰 범위의 네트워크에 접속할 수 있기 때문이다. 이 네트워크는 WAN*Wide Area Network*이라 부르며, 광대역 통신망으로 국가나 도시, 대륙과 같이 매우 넓은 범위의 네트워크를 의미한다. 이 네트워크는 LAN과 LAN을 연결하는 네트워크로, 그 회선을 관리하는 것이 바로 ISP*Internet Service Provider* 사업자, 즉 KT, LG U+, SK텔레콤과 같은 이동통신사들이다. # 서버 접속 ![[MinecraftServerConnect.png]] 이제 서버에 실제로 접속해보자. SGCC 마인크래프트 서버에 접속하기 위해서는 '직접 연결' 버튼을 누르고 '서버 주소'라는 것을 입력해야 한다. 왜 서버 주소를 입력해야 하는 걸까? 그리고 그 서버 주소라는 것은 도대체 무엇일까? 그 모든 해답은 인터넷 통신의 구조에 담겨 있다. > [!info] tl;dr > 네트워크를 바라보는 두 가지 관점이 있다. 하나는 네트워크에서 통신이 발생하는 과정을 7개의 수준으로 나눈 OSI*Open System Interconnection* 참조 모델로, **OSI 7계층**이라고 한다. 또 하나의 관점은 실제로 통신이 이루어지는 과정을 나타내는 **TCP/IP 프로토콜 스택**이다. > > 데이터는 네트워크를 통해 패킷*Packet*의 형태로 전파되며, 각 계층에는 저마다의 시스템이 있다. 그중 IP 주소는 다른 네트워크로 통신하기 위한 가장 기본적인 규격이며, 이 IP주소를 통해 서버에 접근할 수 있다. <div style="page-break-after: always;"></div> ## OSI 7계층과 TCP/IP 프로토콜 스택 네트워크를 바라보는 두 가지 관점이 있다. 하나는 네트워크에서 통신이 발생하는 과정을 7개의 수준으로 나눈 OSI*Open System Interconnection* 참조 모델로, **OSI 7계층**이라고 한다. ![[OSIModelSimple.png]] OSI 7계층은 다시 두 가지 계층으로 나눌 수 있는데, 1~4계층, 즉 피지컬-데이터 링크-네트워크-트랜스포트 계층을 합쳐 **데이터 플로 계층**(Data Flow Layer) 혹은 **하위 계층**(Lower Layer)이라 부르고, 나머지 세션-프레젠테이션-애플리케이션 계층을 합쳐 **애플리케이션 계층**(Application Layer) 혹은 **상위 계층**(Upper Layer)이라 부른다. 데이터 플로 계층은 데이터를 상대방에게 잘 전달하는 역할을 가지고 있으며, 애플리케이션 계층은 데이터 플로 계층을 고려하지 않고 데이터를 표현하는 데 초점을 맞춘다. ![[TCPIPModel.png]] 또 하나의 관점은 실제로 통신이 이루어지는 과정을 나타내는 **TCP/IP 프로토콜 스택**이다. OSI 7계층이 실제 네트워크의 통신과는 조금 다른 개념적인 이해였다면 TCP/IP 프로토콜 스택은 실제 통신에서 사용되는 프로토콜을 기준으로 삼는다. 네트워크를 따로 공부하지 않아도 많이 들어봤을 IP, HTTP, 이더넷*Ethernet*도 모두 TCP/IP 프로토콜 스택의 일부다. ![[OSITCPComparison.png]] 둘을 비교하자면 이런 느낌이다. 용어가 일부 겹쳐서 헷갈릴 수도 있겠지만, OSI 7계층 모델과 TCP/IP 모델은 컴퓨터 네트워크를 바라보는 서로 다른 두 관점이다. <div style="page-break-after: always;"></div> ## Encapsulation & Decapsulation ![[osi_img_01.png]] 현대 네트워크는 데이터를 **패킷**(packet)이라는 단위로 쪼개어 보내는데, 이런 기법으로 하나의 통신이 회선 전체를 점유하지 않고 동시에 여러 단말이 통신할 수 있도록 해준다. 그리고 데이터를 다시 사용하기 위해 데이터를 받는 쪽에서는 패킷을 다시 큰 데이터 형태로 결합해 사용한다. 애플리케이션에서 패킷을 데이터 플로 계층으로 내려보내면서 패킷에 **헤더**(header)라 불리는 정보를 덧붙이게 되는데, 이 과정을 **인캡슐레이션**(Encapsulation)이라 부른다. 데이터를 받는 측에서는 이렇게 인캡슐레이션 과정을 거친 데이터를 역순으로 해체하게 되는데, 이 과정을 **디캡슐레이션**(Decapsulation)이라 부른다. 디캡슐레이션 과정에서는 데이터에 붙어있는 헤더를 해체하며 헤더에 적힌 정보를 토대로 패킷을 재조합한다. ![[OSIModel.png]] 앞서 간단하게 봤던 OSI 모델을 확장하면 이런 느낌이다. 각 계층*Layer*에는 저마다의 통신 프로토콜이 있고, 이를 활용하면 광대한 네트워크의 세계에서도 길을 잃지 않고 데이터를 주고 받을 수 있다. ## IP 주소 OSI 7계층 모델에서 주소를 가지는 계층은 2계층인 데이터 링크*Data Link* 계층과 3계층인 네트워크*Network* 계층이다. 이 중에서 우리는 3계층의 주소인 IP 주소를 사용해 서버에 접속할 것이다. 오늘날 가장 흔하게 사용하는 IP 주소 체계는 IPv4로, IPv4 기반의 IP 주소는 32비트의 길이를 가지며 표기할 때는 4개의 옥텟을 `.`으로 구분하여 표기한다. 각각 IP 주소가 `128.119.91.53`과 `74.125.39.99`인 두 컴퓨터 간의 통신을 간략하게 표현하면 다음 그림과 같다. ![[ConnectionInfoInNetwork.png]] `128.119.91.53`이 클라이언트의 주소이며 `74.125.39.99`이 서버의 주소다. 클라이언트가 서버에 접근하기 위해서는 패킷에 관련 정보를 담아야 한다. 여기에는 출발지와 도착지의 IP 주소 뿐만 아니라 포트 번호*Port Number*, 그리고 통신 프로토콜까지 포함된다. 이 중에서 포트 번호는 장치 내외의 많은 애플리케이션을 구분하기 위한 것으로, 같은 IP 주소를 가지고 있더라도 그곳에서 제공 중인 여러 서비스를 구분하여 원하는 서비스에 원하는 데이터를 보내기 위한 정보이며, 프로토콜 종류가 직접적인 데이터로 할당되어 있지는 않지만, 통신 과정에서 구성하게 되는 패킷 내부 구성이 곧 이 프로토콜의 종류다. ## 포트 번호가 필요한 이유 OSI 모델 기준 3계층까지의 목표는 데이터가 목적지를 잘 찾아가도록 하는 것이다. 그러나 앞서 본 TCP와 같은 4계층 프로토콜은 목적지를 찾아가기 위한 것이 아니다. 4계층의 목적은 애플리케이션에서 사용하는 프로세스를 정확히 찾아가고 데이터를 분할한 패킷을 잘 쪼개 보내고 잘 조립하기 위한 것이다. ![[InternetProtocolGraph.png]] 마인크래프트에서 사용하는 프로토콜은 TCP*Transport Control Protocol*과 UDP*User Datagram Protocol*다. TCP와 UDP는 4계층에서 사용하는 대표적인 두 프로토콜로, 둘 다 포트 번호를 필요로 한다. 일반적으로 TCP/IP에서는 클라이언트-서버 방식으로 서비스를 제공하고 클라이언트용 프로그램과 서버용 프로그램을 구분해 개발하는데, 이때문에 출발지의 포트 번호와 도착지의 포트 번호를 구분해 처리할 필요가 있다. 즉, 우리가 서버에 접속할 때도 서버의 IP 주소 뿐만이 아니라 서버가 어느 포트에서 제공되는지 또한 알고 있어야 한다는 뜻이다. ### 패킷의 세부 구성 패킷은 헤더*Header*와 페이로드*Payload*로 구분할 수 있다. 아래는 TCP 기준으로 패킷의 구조를 설명하고 있지만, UDP 또한 헤더의 내부 구조가 다를 뿐 나머지는 동일하다. 컴퓨터 네트워크에서 데이터를 분류할 때 각 계층에서는 바로 이 헤더를 보고 받아야 할 데이터인지 아니면 버려야 할 데이터인지 판단하고, 받아야 한다면 어디로 보내야 할지도 판단한다. ![[FrameAndPacket.png]] 포트 번호는 바로 이 헤더에 있으며, 현재로서는 우리가 직접 입력해야 한다. ## IP Address:Port Number SGCC의 마인크래프트 서버는 `163.239.88.120`의 IP 주소와 65523이라는 포트 번호를 가지고 있다. IP 주소와 포트 번호는 `:`로 구분한다. 이제 실제로 접속해보자. ![[MinecraftServerAddress.png]] 잠시 기다리면 다음과 같이 SGCC 마인크래프트 서버 접속에 성공한 것을 확인할 수 있다. ![[MinecraftServerEnter.png]] # 마치며 여기까지가 서버를 둘러싼 컴퓨터과학 이야기의 초간단 버전이다. 사실 서버에 대해 잘 알지 못하더라도 마인크래프트 서버를 구축하는 데에는 별로 큰 힘을 들일 필요가 없다. [PAPER](https://papermc.io)처럼 마인크래프트 서버를 간단하게 만들어주는 서비스가 이미 존재하기도 하고, 제작사인 모장 스튜디오 또한 'Minecraft Realms'라는 이름으로 유저들이 무리없이 사용할 수 있는 공식적인 서버를 제공하고 있다. 그러나 그 안에 숨어있는 기술에 대한 이야기는 앞으로 일어날 수 있는 다양한 문제를 헤쳐나가는 데 큰 힘이 되어줄 것이다. --- # 출처 - [Reliable Hack: Does Minecraft Server use TCP or UDP?](https://cloudpap.com/blog/does-minecraft-server-use-tcp-or-udp/) - _IT 엔지니어를 위한 네트워크 입문_ (2020). (주)도서출판길벗. - Peterson, L.L. and Davie, B.S. (2022) _Computer Networks: A Systems Approach_. Cambridge, MA. - Serpanos, D. and Wolf, T. (2011) _Architecture of Network Systems_. 1st edn. Morgan Kaufmann (The Morgan Kaufmann Series in Computer Architecture and Design). - Tanenbaum, A.S., Feamster, N. and Wetherall, D.J. (2021) _Computer Networks_. 6th edn. Pearson.