기본 로컬 UDP(User Datagram Protocol) 멀티 플레이어 네트워킹 API
이 항목을 사용하여 멀티 플레이어 신뢰성을 향상시키기 위해 기본 로컬 UDP(User Datagram Protocol) 멀티 플레이어 포트 API를 사용하는 방법을 이해하세요. Xbox 콘솔의 모든 반복 덕분에 사용자는 UDP 3074를 사용할 수 있습니다. 이는 멀티 플레이어 네트워크 트래픽을 위한 잘 알려진 포트로, 공개적으로 등록되어 있습니다. Microsoft GDK(게임 개발 키트) 타이틀도 예외가 아니며, 기본 로컬 UDP 멀티 플레이어 포트 네트워킹 API를 사용하여 이 특수 포트에 액세스할 수 있습니다.
기본 로컬 UDP 멀티플레이어 포트는 원격 장치에서 로컬 장치에 연결하는 데 사용할 수 있는 공용 포트가 아니라 후속 소켓 바인딩 작업에서 사용되는 로컬 포트입니다. 전자는 TCP(Transmission Control Protocol) 및 HTTP 트래픽보다는 UDP 트래픽에만 의미가 있습니다. 멀티 플레이어, 실시간 타이틀 네트워킹 흐름을 대상으로 하기 때문입니다.
이전에는 포트가 UDP 3074로 제한되어 있었습니다. 최근 몇 년 동안 이 포트의 신뢰성을 높이기 위해 대체 논리가 도입되었습니다. 또한 사용자는 포트를 수동으로 구성하여 고유한 네트워크 구성으로 작동하게 할 수 있었습니다. Microsoft GDK(게임 개발 키트) 타이틀에서 UDP 3074를 하드 코딩하는 것이 더는 안전하지 않은 이유가 여기에 있습니다. 대신 Microsoft GDK(게임 개발 키트) 타이틀은 현재 구성된 포트를 동적으로 쿼리해야 합니다.
기본 로컬 UDP 멀티 플레이어 포트를 검색하는 방법은 세 가지가 있습니다.
- Blocking:XNetworkingQueryPreferredLocalUdpMultiplayerPort
- Asynchronous:XNetworkingQueryPreferredLocalUdpMultiplayerPortAsync
- Notification-based:XNetworkingRegisterPreferredLocalUdpMultiplayerPortChanged
세 가지 변형 모두 동일한 기본 기능을 제공합니다. 이들은 특정 요건과 용도에 따라 각각 또는 어떤 조합으로도 Microsoft GDK(게임 개발 키트) 타이틀에 사용할 수 있습니다.
모든 Microsoft GDK(게임 개발 키트) 타이틀은 기본 게임 트래픽에 되도록 이 기본 포트를 사용해야 합니다. 이 포트는 P2P 네트워크 토폴로지와 클라이언트-서버 네트워크 토폴로지에 최적화되어 있습니다. Microsoft GDK(게임 개발 키트) 플랫폼은 이 특정 포트가 각 사용자의 특정 네트워킹 환경에서 가장 잘 작동하도록 합니다. 이 특정 포트를 사용하면 플랫폼의 고객 지원 및 진단 흐름의 사용을 극대화하고, 표준화된 NAT(네트워크 주소 변환) 호환성을 높이고, 표준화된 UPnP™(범용 플러그 앤 플레이) 인증 장치 기능을 제공하고, QoS(서비스 품질) 라우터 및 ISP 알고리즘을 위해 실시간에 민감한 패킷을 식별합니다.
이 기본 포트는 P2P 네트워크 토폴로지에 의존하는 타이틀과 특히 관련이 있습니다. 이 포트는 방화벽 펀칭을 수행하지 않고 인바운드 UDP 패킷이 방화벽을 통과하도록 허용하는 유일한 포트입니다. Microsoft GDK(게임 개발 키트)의 P2P 네트워크 토폴로지에 의존하는 타이틀은 여전히 중간 또는 엄격한 NAT 유형을 가진 클라이언트를 위한 NAT 펀칭 솔루션과 함께 자체 공용 IP 주소 및 포트 검색을 제공해야 합니다. 기본 포트는 이러한 기술의 성공률을 개선하지만 이들을 대체하는 것은 아닙니다.
클라이언트-서버 네트워크 토폴로지를 사용하는 타이틀에도 이 포트를 사용하는 이점이 있습니다. 문제 해결, UPnP™ 및 패킷 식별은 병원, 호텔 및 대학 기숙사에서 일반적으로 사용되는 종속 포털 및 기타 소스 기반 필터링 접근 방식과 여전히 관련이 있습니다.
이 기본 포트는 다른 포트와 똑같이 취급해야 합니다.
Winsock(Windows 소켓 2) API와 함께 사용해야 합니다. 타이틀은 이 포트에서 IPv4및 IPv6 모두에 바인딩되거나 이중 스택 소켓을 사용해야 하며 INADDR_ANY
/in6addr_any
주소에 바인딩되어야 합니다.
소켓 실패 처리
반환된 포트를 사용하여 특정 서버 또는 피어와의 성공적인 소켓 연결을 할 수 있다는 보장이 없습니다. 정상적인 타이틀 재시도 및 대체 논리를 수행해야 합니다. 소켓이 닫히고 다시 열릴 때마다 타이틀은 가장 최근의 기본 로컬 UDP 멀티 플레이어 포트를 다시 쿼리해야 합니다. 시간이 지남에 따라 포트가 변경될 수 있기 때문입니다.
네트워크 초기화
XNetworkingQueryPreferredLocalUdpMultiplayerPort
API의 세 가지(차단, 비동기 및 알림 기반) 종류는 모두 타이틀 시작 시 및 재개 시 네트워크가 초기화될 때까지 완료/알림을 차단하거나 지연합니다.
네트워크 초기화 상태 감지 개요에 따라 네트워크 초기화를 별도로 기다리거나 이러한 API에 호출하여 반환될 때까지 기다릴 수 있습니다.
일시 중단 및 재개
다른 소켓과 마찬가지로 기본 로컬 UDP 멀티 플레이어 포트에 바인딩된 소켓은 일시 중단 시 닫혀야 하며 네트워크 초기화를 기다린 후 재개할 때 다시 만들어야 합니다.
RegisterAppStateChangeNotification
을(를) 통해 일시 중단 및 재개 이벤트를 등록해야 합니다. 재개 시 기본 로컬 UDP 멀티 플레이어 포트가 변경된 것으로 가정하고 기본 로컬 UDP 멀티 플레이어 포트에 대한 변경 내용을 수신 대기하거나 새 소켓을 만들 때 다시 쿼리해야 합니다. WinSock 일시 중단 및 재개 처리에 대한 자세한 내용은 Winsock 일시 중단 및 재개를 참조하세요.
선호하는 로컬 UDP 멀티 플레이 포트의 변화
타이틀은 XNetworkingRegisterPreferredLocalUdpMultiplayerPortChanged API 사용하여 기본 로컬 UDP 멀티 플레이어 포트의 변경을 파악할 수 있습니다.
타이틀이 실행되는 동안 기본 로컬 UDP 멀티 플레이어 포트가 변경되지 않도록 모든 시도를 했습니다. 하지만 사용자의 외부 네트워크 조건 변경 및 기존의 소켓 흐름 무효화로 인해 포트가 변경되는 피할 수 없는 경우가 있습니다. 특히 네트워크 연결 수준이 변경될 때나 타이틀 일시 중지/재개 과정이 반복되면서 포트가 변경될 가능성이 훨씬 큽니다.
기본 로컬 UDP 멀티 플레이 포트가 변경될 때는 이후 피어로부터의 추가 인바운드 연결이 이전의 기본 포트에서 차단될 수 있습니다. 이것이 소켓 레이어에서 오류를 일으키진 않을 것입니다. 그러나 이전의 기본 포트에 바인딩된 모든 소켓에서 타이틀의 패킷 수신이 결국 중지될 수 있습니다.
기존 피어와 주고받는 패킷이 계속 작동할 수 있습니다. 기본 로컬 UDP 멀티 플레이어 포트 변경 알림이 진행 중인 게임 세션에 치명적이지는 않을 것입니다.
변경 알림이 발생하면 타이틀이 새 기본 포트에 바인딩된 새로운 소켓으로 마이그레이션해야 합니다. 이러한 마이그레이션은 가장 빠른 기회에 이루어지며 기존 마이그레이션을 중단하지 않으면서 발생해야 합니다. 연결 손실을 감지하고 소켓 연결을 재시도하려면 타이틀은 항상 최신 기본 포트를 사용해야 합니다.
선호하는 로컬 UDP 멀티 플레이 포트의 변화 테스트
다음 단계에 따라 기본 로컬 UDP 멀티 플레이어 포트를 변경합니다.
- 게임이 실행되는 동안 Xbox 가이드를 엽니다. 설정 앱으로 이동합니다.
- 일반 탭에서 네트워크 설정 버튼을 누릅니다.
- 고급 설정을 선택한 다음 대체 포트 선택을 선택합니다.
- 포트 선택을 수동으로 설정합니다. 포트를 선택하려면 드롭다운 메뉴를 사용하세요.
- 선택은 즉시 적용되며, 타이틀에서는 관련 알림이 발생합니다.
- 테스트가 완료되면 포트 선택을 다시 자동으로 설정하여 포트 동작을 기본값으로 복원합니다.
참고 항목
타이틀은 설정 애플리케이션에서는 제한되지만, 계속 실행되며 타이틀이 보이지 않을 때도 포트 변경 알림을 즉시 수신합니다. 타이틀로 돌아가지 않고 10분 이상 설정 앱을 열어 두면 타이틀이 일시 중지됩니다.
보안
기본 로컬 UDP 멀티 플레이어 포트에 연결된 소켓은 다른 소켓과 마찬가지로 작동합니다. 특히 이 소켓은 추가 보안 기능이 없습니다. 이 타이틀은 통신 보안 모범 사례에 지정된 대로 기본 로컬 UDP 멀티 플레이어 포트에 바인딩된 소켓 위에 자체 보안 통신 프로토콜을 사용해야 합니다. 자세한 내용은 통신 보안 개요(NDA 항목)권한 부여 필요를 참조하세요.
피어 투 피어
기본 로컬 UDP 멀티 플레이어 포트는 P2P 망을 구축할 수 있는 가장 잘 알려진 포트를 제공합니다. 또한 사용자의 NAT 계층을 통해 인바운드 연결을 허용하는 최선의 방식으로 구성됩니다. 그러나 다음을 포함하여 NAT 통과를 수행하는 것은 타이틀의 책임입니다.
- NAT 유형 감지
- 장치의 공용 IP 주소 및 포트의 탐지와 교환
- NAT 펀칭 및 통과
Azure PlayFab 파티
내부적으로 PlayFab 파티는 기본적으로 선호되는 로컬 UDP 멀티 플레이어 포트를 사용합니다. 이는 PlayFab 파티 API를 통해 구성할 수 있습니다. PlayFab 파티 포트가 변경되지 않는 한, 타이틀은 기본 로컬 UDP 멀티 플레이어 포트에 직접 바인딩되어서는 안 됩니다.
예제 사용법
다음 예는 이중 스택 소켓을 기본 로컬 UDP 멀티 플레이어 포트에 바인딩하는 방법을 보여줍니다. 이 예제에서는 간결성을 위해 차단 XNetworkingQueryPreferredLocalUdpMultiplayerPort 호출을 사용하고 타이틀이 이미 네트워크가 준비될 때까지 기다렸다가 WSAStartup을 호출한 것으로 가정합니다.
HRESULT
CreateAndBindMultiplayerSocket(
_Out_ SOCKET* multiplayerSocket
)
{
HRESULT hr;
SOCKET resultSocket = INVALID_SOCKET;
uint16_t port;
hr = XNetworkingQueryPreferredLocalUdpMultiplayerPort(&port);
if (FAILED(hr))
{
goto Failure;
}
resultSocket = socket(AF_INET6, SOCK_DGRAM, IPPROTO_UDP);
if (resultSocket == INVALID_SOCKET)
{
hr = HRESULT_FROM_WIN32(WSAGetLastError());
goto Failure;
}
// Enable both IPv4 and IPv6 on this socket.
int v6only = 0;
if (setsockopt(resultSocket, IPPROTO_IPV6, IPV6_V6ONLY, (char*)&v6only, sizeof(v6only)) == SOCKET_ERROR)
{
hr = HRESULT_FROM_WIN32(WSAGetLastError());
goto Failure;
}
sockaddr_in6 sa;
ZeroMemory(&sa, sizeof(sa));
sa.sin6_family = AF_INET6;
sa.sin6_port = htons(port);
sa.sin6_addr = in6addr_any;
if (bind(resultSocket, (const sockaddr*)&sa, sizeof(sa)) == SOCKET_ERROR)
{
hr = HRESULT_FROM_WIN32(WSAGetLastError());
goto Failure;
}
*multiplayerSocket = resultSocket;
Exit:
return hr;
Failure:
if (resultSocket != INVALID_SOCKET)
{
(void)closesocket(resultSocket);
}
goto Exit;
}