클라이언트 서버 연결 프로세스
Fusion 클라이언트와 서버 간의 연결 프로세스는 안정적인 P2P(피어 투 피어) 통신을 설정하기 위해 여러 단계를 거칩니다. 이 과정에서 Photon Cloud와 STUN 서비스를 사용하여 NAT(Network Address Translation) 환경을 종종 통과합니다. 주요 목표는 게임 세션에서 낮은 지연 시간과 높은 성능을 보장하며 피어 간의 직접 연결을 설정하는 것입니다.
일반 프로세스 개요
- 세션 시작, 생성 및 참가:
- 서버 피어가 Photon Cloud를 사용하여 새로운 세션을 생성합니다.
- 클라이언트가 Photon Cloud를 통해 세션 참가를 요청합니다.
- 피어 검색 및 재귀 주소 교환:
- STUN(NAT을 위한 세션 순회 유틸리티) 프로토콜을 사용하여 클라이언트와 서버는 외부 STUN 서버에서 재귀 주소(외부 공용 IP 및 포트)를 요청합니다. 이를 통해 피어는 NAT를 통과하기 위해 필요한 공용 주소를 확인할 수 있습니다.
- 재귀 정보는 피어 간에 공유되어 대부분의 경우 직접 통신을 가능하게 합니다.
- 연결 설정:
- 클라이언트는 재귀 정보를 사용하여 서버에 연결을 시도합니다. P2P(피어 투 피어) 연결에 실패하면 Photon Cloud를 통해 연결이 중계될 수 있습니다.
- 서버는 직접 소켓(UDP) 또는 Photon Cloud를 통한 릴레이를 통해 연결 요청을 수신합니다.
- 연결이 성공하면 클라이언트와 서버는 게임 업데이트를 교환하기 시작합니다.
- 연결 실패 처리:
- 연결 시도가 일정 한도를 초과하면 클라이언트는 네트워크 작업을 중지하고 연결 시도를 중단합니다.
- 서버는 클라이언트가 성공적으로 연결하거나 프로세스를 중단할 때까지 직접 연결 또는 릴레이 서비스를 통해 추가 연결 요청을 계속 수신합니다.
이 프로세스는 직접 연결과 필요한 경우 릴레이 서비스를 조합하여 어떤 네트워크 환경에서도 클라이언트와 서버가 안정적으로 연결되고 통신할 수 있도록 보장합니다.
주요 컴포넌트
- STUN 서비스: 피어가 NAT 환경에서 직접 통신을 설정할 수 있도록 재귀 정보를 제공합니다.
- Photon Cloud: 세션 생성을 관리하고, 필요한 경우 연결 시도를 중계하며, 피어 검색을 지원합니다.
세션 생성 및 참가
다음 다이어그램은 세션 생성 및 설정 과정을 나타냅니다:
![Fusion Server Start and Session Creation Process](/docs/img/fusion/v2/manual/connection-and-matchmaking/001-connection-process-sequence-server.png)
- 1. 서버가 서버 모드에서 게임을 시작합니다.
- 2. 서버가 Photon Cloud를 사용하여 새로운 세션을 생성합니다..
- 3. Photon Cloud가 세션 생성을 확인합니다.
- 4. 서버는 Photon Cloud로 참여 요청 프로토콜 메시지를 전송합니다. 이는 Fusion의 ClientServer 모드와 관련된 사용자 정의 속성으로 세션을 설정하는 데 사용됩니다.
- 5. Photon Cloud가 참여 요청을 확인합니다.
- 6. Photon Cloud는 서버 시작을 요청합니다.
- 7. 서버가 시작되고 NetworkRunner를 초기화합니다.
- 8. 서버는 로컬 네트워크 주소를 가져오는 절차를 실행합니다.
- 9. 서버는 STUN 서버에 STUN 요청을 보냅니다.
- 10. 서버는 STUN 서버에서 Reflexive 주소를 수신합니다.
- 11. 서버는 Reflexive 주소를 Photon Cloud에 전송합니다.
아래 다이어그램은 클라이언트가 세션에 참가하는 과정을 나타냅니다:
![Fusion Client Start and Join Process](/docs/img/fusion/v2/manual/connection-and-matchmaking/002-connection-process-sequence-client.png)
- 1. 클라이언트가 클라이언트 모드에서 게임을 시작합니다.
- 2. 클라이언트는 Photon Cloud를 사용하여 임의의 세션 참가를 시도합니다.
- 3. Photon Cloud가 세션 참가를 확인합니다.
- 4. 클라이언트는 Photon Cloud로 Join Request Protocol 메시지를 전송합니다. 이는 세션에 클라이언트를 등록하는 데 사용됩니다.
- 5. Photon Cloud가 참여 요청을 확인합니다.
- 6. Photon Cloud는 클라이언트 시작을 요청합니다.
- 7. 클라이언트가 시작되고 NetworkRunner를 초기화합니다.
- 8. 클라이언트는 로컬 네트워크 주소를 가져오는 절차를 실행합니다.
- 9. 클라이언트는 STUN 서버에 STUN 요청을 보냅니다.
- 10. 클라이언트는 STUN 서버에서 Reflexive 주소를 수신합니다.
- 11. 클라이언트는 재귀 주소를 Photon Cloud에 전송합니다.
연결 프로세스 흐름
다음 다이어그램은 Fusion 클라이언트와 서버 간 연결 프로세스의 일반적인 흐름을 보여줍니다. 아래 설명된 모든 단계는 각 클라이언트-서버 연결 시도에 대해 실행됩니다.
![Fusion 연결 프로세스](/docs/img/fusion/v2/manual/connection-and-matchmaking/003-connection-process-sequence-connection.png)
다음은 단계별 프로세스입니다.
- 1. Photon Cloud가 서버의 Reflexive 주소를 클라이언트에 전송합니다.
- 2. Photon Cloud가 클라이언트의 Reflexive 주소를 서버에 전송합니다.
클라이언트와 서버는 아래 단계를 병렬로 수행합니다:
(클라이언트 측) 각 연결 시도 간격(500ms)마다:
- 3. 클라이언트는 Reflexive 주소를 사용하여 서버에 연결을 시도합니다. 단, 시도 횟수가 연결 시도 한도의 2/3 미만일 경우에만 가능합니다.
- 4. 그렇지 않은 경우, 클라이언트는 Photon Cloud에 연결 요청을 전송합니다.
- 5. Photon Cloud는 연결 요청을 서버로 중계합니다.
- 6. 연결 시도 한도(10회)가 초과되면 클라이언트는 연결 시도를 중지하고 네트워크 작업을 종료합니다.
연결 시도 간격은 500ms로 고정되어 있으며, 연결 시도 제한은 10ms로 설정되어 있습니다.
(서버 측) 서버는 연결 요청을 수신 대기하며 아래 단계를 수행합니다:
- 서버는 클라이언트의 Reflexive 주소로 UDP 핑 패킷을 보냅니다. 이는 서버의 로컬 네트워크 라우터 테이블에 클라이언트의 Reflexive 주소를 업데이트하는 데 사용됩니다. 이 단계는 라우터가 알 수 없는 소스의 수신 패킷을 차단할 수 있는 경우 직접 연결을 설정하는 데 필요합니다.
이 시점에서 두 가지 결과가 있을 수 있습니다:
(a) 클라이언트가 서버와 직접 통신할 수 있는 경우:
- 8. 서버는 기본 소켓을 통해 클라이언트의 연결 요청을 수락합니다. 이는 직접 연결이 설정되었음을 의미합니다.
- 9. 클라이언트는 서버로 게임 업데이트를 전송하기 시작합니다.
(b) Photon Cloud를 통해 연결이 중계되는 경우:
- 10. 서버는 Photon Cloud 릴레이를 통해 클라이언트의 연결 요청을 수락합니다.
- 11. Photon Cloud는 클라이언트에 연결 확인을 중계합니다.
- 12. 클라이언트는 Photon Cloud 릴레이를 통해 서버로 게임 업데이트를 전송하기 시작합니다.
- 13. 서버는 Photon Cloud 릴레이를 통해 클라이언트로부터 게임 업데이트를 수신합니다.
연결이 설정되면 클라이언트와 서버는 네트워크 환경과 직접 연결 시도의 성공 여부에 따라 직접 통신하거나 Photon Cloud 릴레이를 통해 통신할 수 있습니다.
결론
Fusion 클라이언트와 서버 간의 연결 프로세스는 안정적인 P2P 통신을 설정하기 위한 여러 단계를 포함합니다. Photon Cloud와 STUN 서비스를 활용하여 Fusion은 NAT를 통과해야 하는 복잡한 네트워크 환경에서도 클라이언트와 서버가 효과적으로 연결되고 통신할 수 있도록 보장합니다.
Back to top