(새 프로젝트에는 5.1에서 도입된 새로운 네트워킹 시스템을 사용해야 합니다. 다음 내용은 이전 네트워킹 시스템을 사용하는 레거시 프로젝트를 대상으로 작성되었습니다.)
모든 개별 네트워킹 서버의 소스 코드는 Unity 웹사이트에서 다운로드할 수 있습니다. 여기에는 연결 테스터, 퍼실리테이터, 마스터 서버, 프록시 서버 등이 포함됩니다.
모든 소스 패키지는 기초적인 네트워킹 함수를 처리하고 네트워킹 서버에서 사용되는 플러그인을 제공하는 RakNet 3.732 네트워킹 라이브러리를 포함합니다.
패키지에는 다음 세 가지 타입의 프로젝트 파일이 포함되어 있으며, 바로 컴파일이 가능합니다.
Xcode와 Visual Studio 프로젝트는 바로 열어서 컴파일하고 빌드할 수 있습니다. Makefile로 빌드하려면 “make”를 실행하면 됩니다. Linux와 Mac OS X에서는 표준 컴파일 설정으로 작동해야 하며, gcc 가 있어도 작동해야 합니다. Linux에서는 ncurses 라이브러리를 설치해야 할 수도 있습니다.
마스터 서버는 내부 데이터베이스 구조를 사용하여 호스트 정보를 추적합니다.
호스트는 RUM_UPDATE_OR_ADD_ROW 메시지 식별자 및 모든 호스트 정보가 포함된 메시지를 전송합니다. 이는 LightweightDatabaseServer.cpp 파일의 OnReceive() 함수에서 처리됩니다. 모든 메시지가 처음에 표시되는 곳이므로 메시지의 처리 방식 추적을 시작하기 좋은 위치입니다. MasterServer.RegisterHost 함수를 사용할 때 설정되는 각 _ 게임 타입_의 데이터베이스 구조 내부에 테이블이 생성됩니다. 모든 게임 타입은 테이블에 그룹화되며, 테이블이 없을 경우 CreateDefaultTable() 함수에서 동적으로 생성됩니다.
호스트 정보 데이터는 마스터 서버에서 수정됩니다. 마스터 서버에서 볼 수 있듯이 등록되는 게임의 IP 주소 및 포트 정보는 호스트 데이터에 입력됩니다. 이렇게 하면 호스트가 사설 주소(NAT 주소)를 가진 경우 정확한 외부 IP와 포트를 감지할 수 있습니다. 게임 서버가 보낸 호스트 데이터의 IP와 포트는 사설 주소와 포트이며, 나중에 사용하기 위해 저장됩니다. 클라이언트가 게임 서버용 호스트 데이터를 요구하고 서버에 동일한 IP 주소가 있다는 것을 마스터 서버가 감지할 경우 외부 주소 대신 서버의 사설 주소를 사용합니다. 이는 클라이언트와 서버가 동일한 로컬 네트워크에 있어 NAT 주소와 동일한 라우터를 사용하는 경우를 처리하기 위한 것입니다. 제대로 작동하기 위해서는 클라이언트와 서버가 동일한 외부 주소를 가지고, 이 주소를 통해 서로 연결될 수 없으며 사설 주소를 사용해야 합니다.
클라이언트는 ID_DATABASE_QUERY_REQUEST 메시지 식별자 및 찾고 있는 게임 타입이 포함된 메시지를 전송합니다. 테이블이나 호스트 리스트는 데이터베이스 구조에서 가져오며, 클라이언트에 전송됩니다. 찾을 수 없을 때에는 빈 호스트 리스트가 전송됩니다.
마스터 서버에 전송되는 모든 메시지는 CheckVersion() 함수에서 확인되는 버전 정보를 포함해야 합니다. 이 때 Unity의 각 버전은 새로운 마스터 서버 버전을 내부적으로 설정하며 여기에서 확인됩니다. 따라서 마스터 서버의 통신 루틴은 이전 버전을 감지할 수 있는 어느 시점에라도 변경되며, 필요한 경우 다른 버전의 마스터 서버를 참조하거나 차이점을 확인하기 위해 해당 메시지의 처리를 수정할 수 있습니다.
퍼실리테이터(facilitator)는 RakNet에서 NAT 펀치스루 플러그인을 수정하지 않고 그대로 사용합니다. 이것은 기본적으로 NAT 펀치스루 플러그인이 로드된 상태에서 포트를 수신하는 피어입니다. NAT 주소를 가진 서버와 클라이언트가 둘 다 피어에 연결될 경우 NAT 펀치스루를 통하여 서로 연결할 수 있습니다. Network.InitializeServer가 NAT를 사용하는 경우 연결은 자동으로 설정됩니다.