다음을 통해 공유


PlayFab 파티 및 직접 피어 투 피어 연결

이 페이지에서는 예제 게임 코드를 사용하여 PlayFab 파티에서 직접 피어 투 피어 연결을 사용하도록 설정하고 사용하는 방법을 설명합니다. 또한 게임에서 직접 피어 투 피어 연결을 사용할 시기를 평가하는 데 도움이 되는 고려 사항도 설명합니다.

직접 피어 투 피어 연결을 사용할 시기

PlayFab 파티에서는 다양한 통신 토폴로지를 지원합니다. 개념적으로 모든 채팅 또는 데이터 메시지는 피어 디바이스 또는 사용자 간에 직접 전송됩니다. 그러나 Party에서는 투명한 클라우드 릴레이 서비스를 자동으로 활용하여 직접 피어 투 피어 연결을 설정하는 것과 관련된 일반적인 환경 및 보안 문제를 방지합니다. 백그라운드 QoS(서비스 품질) 측정값을 활용하여 데이터 전송의 대기 시간을 줄일 수 있습니다. (자세한 내용은 PlayFab 파티 QoS 측정값을 참조하세요.) 필요에 따라 직접 피어 투 피어 연결을 사용하도록 설정하여 데이터 전송 대기 시간을 더 줄일 수 있습니다. 아래 "보안 고려 사항"에 자세히 설명된 보안 우려 사항으로 인해 타이틀에 엄격한 대기 시간 요구 사항이 없는 한 직접 P2P 연결을 활성화하는 대신 클라우드 릴레이 서비스를 사용하는 것이 좋습니다.

플랫폼 지원

직접 피어 연결은 Windows 10, Microsoft Game Core, Nintendo Switch, PlayStation®4, PlayStation®5 버전 Party library에서 지원됩니다. 다른 버전의 라이브러리는 클라이언트 API를 통해 지정된 직접 피어 연결 옵션에 관계없이 항상 데이터 전송에 클라우드 릴레이를 사용합니다.

"PlayStation"은 Interactive Entertainment Inc.의 등록 상표 또는 상표입니다.

보안 고려 사항

직접 피어 연결은 클라이언트 간에 직접 데이터를 전송하는 데 사용되기 때문에 클라이언트는 모두 서로 연결하는 방법을 알아야 합니다. 이는 게임 세션에서 클라이언트 간에 클라이언트 IP 주소를 함께 공유하여 수행됩니다. 예를 들어, 16인 멀티 플레이어 게임이 직접 피어 연결을 사용하여 플레이어 위치를 업데이트하는 경우 16개 게임 클라이언트 각각은 데이터를 보낼 대상을 알기 위해 15개 다른 클라이언트의 IP 주소를 알아야 합니다.

게임 클라이언트 간에 IP 주소를 공유하는 것은 보안 위험에 해당합니다. IP 주소를 공유하면 악의적인 행위자가 IP 주소를 감지하여 게임 외부의 다른 플레이어를 악의적으로 공격하는 데 사용할 수 있습니다. 서비스 거부(DOS) 공격 또는 분산 서비스 거부(DDOS) 공격이라는 변형을 통해 이러한 공격을 수행하는 일반적인 방법입니다. 공격은 불필요한 네트워크 트래픽으로 네트워크를 과부하 상태로 만들려고 시도함으로써 작동합니다. 공격자가 피해자에게 충분한 네트워크 트래픽을 보낼 수 있다면 피해자의 네트워크 하드웨어(모뎀 및 라우터)는 불필요한 트래픽을 처리하는 데 모든 시간을 소비해야 하며 정상적인 네트워킹 연결을 처리하는 정상적인 작업을 수행할 시간이 없습니다. 사실상 이는 피해자가 공격이 진행되는 동안 네트워크를 사용할 수 없음을 의미합니다. 이것을 흔히 "오프라인으로 부팅"이라고 합니다.

결론적으로 성공적인 직접 피어 연결은 일부 장치 간의 대기 시간을 단축할 수 있습니다. 그러나 이를 설정하려면 사용자가 자신의 IP 주소를 다른 사람에게 공개해야 하므로 악의적인 사용자가 타이틀 외부에서 장치와 인터넷 연결을 공격할 수 있습니다. 정책상의 이유로 특정 플랫폼에서는 직접 피어 연결이 허용되지 않을 수도 있습니다. 성능 및 보안 목표에 적절한 직접 피어 연결 옵션을 사용해야 합니다. 위험을 평가한 후 직접 피어 연결을 사용하기로 결정한 경우, 다음 예를 사용하여 네트워크별 및 장치별로 타이틀을 선택하세요.

LAN 시나리오

파티의 직접 피어 연결을 사용하여 LAN 시나리오에서 대기 시간이 크게 낮출 수 있습니다. 그러나 이러한 시나리오에서도 사용자 인증, LiveOps 데이터 및 인사이트, 음성 채팅 접근성 기능을 지원하려면 제한된 인터넷 연결이 필요합니다.

업스트림 대역폭 고려 사항

직접 피어 투 피어 연결을 사용하면 게임의 업스트림 대역폭 사용량이 증가할 수 있습니다. 클라우드 릴레이 서비스를 통해 게임 또는 음성 메시지를 전송할 경우 파티에서 서비스에 단일 메시지를 보내면, 서비스에서 메시지를 복제하고 각 대상 디바이스에 전달합니다. 직접 피어 투 피어 연결을 통해 게임 또는 음성 메시지를 전송할 경우 파티에서 직접 피어 투 피어 연결이 설정된 각 대상 디바이스에 대해 메시지를 복제하고 직접 연결을 통해 보냅니다. 따라서 게임의 업스트림 대역폭 사용량은 직접 피어 투 피어 연결이 설정된 디바이스 수에 비례하여 확장됩니다. 직접 피어 투 피어 연결을 사용하도록 설정하기 전에 업스트림 대역폭의 이러한 증가가 게임에서 허용되는지 여부를 고려하세요.

게임에서 직접 피어 투 피어 연결을 사용하는 방법

네트워크에서 직접 피어 투 피어 연결을 사용도록 설정

PartyManager::CreateNewNetwork()를 통해 네트워크를 만들 때 호출에 제공되는 PartyNetworkConfiguration을 통해 다양한 네트워크 구성을 지정할 수 있습니다. PartyNetworkConfiguration::directPeerConnectivityOptions 필드를 사용하여 네트워크의 디바이스에 직접 피어 투 피어 연결을 지원할지 여부와 방법을 지정할 수 있습니다.

다음 예제에서는 플랫폼 유형 또는 로그인 공급자에 관계없이 네트워크의 모든 디바이스에서 직접 피어 투 피어 연결을 시도하도록 지정하는 네트워크 구성을 보여 줍니다.

PartyNetworkConfiguration configuration = {};
configuration.directPeerConnectivityOptions = PartyDirectPeerConnectivityOptions::AnyPlatformType | PartyDirectPeerConnectivityOptions::AnyEntityLoginProvider;
// Initialize the rest of the network configuration parameters appropriately for your game before using.

초기 사용자를 네트워크에 인증하는 과정의 일환으로 디바이스는 네트워크 구성에서 허용된 경우 네트워크에 이미 참여 중인 다른 디바이스와 직접 피어 투 피어 연결을 설정하려고 시도할 수 있습니다. 시도가 성공한 경우 직접 연결을 사용하여 디바이스 간에 엔드포인트 메시지 및 채팅 데이터가 전송됩니다. 디바이스 간에 환경이 호환되지 않아서 시도가 실패한 경우 디바이스 간의 모든 통신은 투명한 클라우드 릴레이 서버를 통해 전송됩니다. 디바이스에서 네트워크 구성을 통한 직접 피어 연결 시도를 허용하지 않는 경우 IP 주소 정보를 교환하지 않고 항상 투명한 클라우드 릴레이 서버를 통해 엔드포인트 메시지 및 채팅 데이터를 전송합니다.

참고 항목

직접 피어 연결을 설정하는 것은 최선의 노력이며 환경 요인, 디바이스별 연결 옵션, 플랫폼 정책으로 인해 불가능할 수도 있습니다. 특정 디바이스에 직접 피어 투 피어 연결이 설정되었는지 여부를 평가하는 방법에 대한 자세한 내용은 연결 유형 및 대기 시간 평가를 참조하세요.

디바이스별로 직접 피어 연결 제한

네트워크 구성의 직접 피어 연결 옵션 외에도 디바이스가 인증하는 모든 네트워크에 대해 PartyManager::SetOption()을 사용해 PartyOption::LocalDeviceDirectPeerConnectivityOptionsMask를 설정하여 디바이스별로 직접 피어 연결을 추가로 제한할 수 있습니다. 모든 플래그는 비트 AND 연산을 사용하여 평가됩니다. 즉, 특정 플래그는 세 위치(네트워크 구성과 두 디바이스의 해당 로컬 마스크 옵션)에서 활성화된 경우 지정된 네트워크의 장치 쌍에만 적용됩니다. 네트워크 구성에서 관련 형식의 직접 피어 연결을 허용하는 경우에도 디바이스에서는 로컬 디바이스 마스크 옵션에서 플래그를 사용하도록 설정하지 않음으로써 상호 간 IP 주소 공개 및 직접 연결 시도를 옵트아웃할 수 있습니다. 직접 피어 연결을 지원하는 라이브러리 버전에서 PartyOption::LocalDeviceDirectPeerConnectivityOptionsMask 값은 기본적으로 네트워크에서 사용하도록 설정된 모든 직접 피어 연결을 허용하는 것입니다. 따라서 로컬 디바이스와 관련된 직접 피어 연결을 일부 또는 모두 방지해야 하는 디바이스 관련 요구 사항이 있는 경우에만 구성해야 합니다.

다음 예제에서는 동일한 플랫폼의 디바이스에만 직접 피어 연결을 설정하도록 로컬 디바이스의 직접 피어 연결을 제한하는 방법을 보여 줍니다.

PartyDirectPeerConnectivityOptions localDeviceMask = PartyDirectPeerConnectivityOptions::SamePlatformType | PartyDirectPeerConnectivityOptions::AnyEntityLoginProvider;
PartyError error = PartyManager::GetSingleton().SetOption(nullptr, PartyOption::LocalDeviceDirectPeerConnectivityOptionsMask, &localDeviceMask);
if (PARTY_FAILED(error))
{
    printf("Failed to set local device direct peer connectivity options mask! error = 0x%08x\n", error);
}

연결 유형 및 대기 시간 평가

PartyNetwork::GetDeviceConnectionType()을 호출하여 로컬 장치에서 특정 원격 장치에 대한 직접 피어 투 피어 연결을 설정했는지 여부를 확인할 수 있습니다.

사용 중인 특정 기본 전송 방법에 따라 통신하는 전체 논리적 기능이 변경되지 않으므로 지정된 디바이스 쌍에 대해 직접 피어 투 피어 연결의 가용성을 적극적으로 적용하지 않는 것이 좋습니다. 예를 들어 PartyNetwork::GetDeviceConnectionType()이 이외의 값을 보고하는 경우 PartyDeviceConnectionType::DirectPeerConnectionPartyNetwork::LeaveNetwork()를 호출하지 않습니다. 게임 디자인의 최대 메시지 대기 시간에 대한 엄격한 요구 사항으로 직접 피어 연결이 권장되는 경우 전송 메커니즘을 기반으로 추상적인 가정을 하는 대신 PartyEndpointStatistic::AverageDeviceRoundTripLatencyInMilliseconds 통계에서 보고되는 해당 대기 시간의 구체적인 현재 관측을 기반으로 조치를 취하는 것이 좋습니다. 그러지 않으면 제어할 수 없는 환경 요인으로 인해 항상 가까운 투명 클라우드 릴레이 서버를 사용해야 하는 동일한 친구 집합과 함께 플레이하려는 사용자를 지속적으로 방해할 수 있습니다.

다음 예제에서는 network에서 localEndpointremoteEndpoint 간의 왕복 대기 시간을 검사하는 방법을 보여 줍니다.

// A helper for inspecting the connection type and average round trip latency between a local endpoint and a remote
// endpoint in a network.
void PrintConnectionTypeAndLatency(
    PartyNetwork* network,
    PartyLocalEndpoint* localEndpoint,
    PartyEndpoint* remoteEndpoint
    )
{
    // Retrieve the device associated with the remote endpoint.
    PartyDevice* remoteDevice;
    PartyError error = remoteEndpoint->GetDevice(&remoteDevice);
    if (PARTY_FAILED(error))
    {
        printf("Failed to get the remote device! error = 0x%08x\n", error);
        return;
    }

    // Get the device connection type.
    PartyDeviceConnectionType connectionType;
    PartyError error = network->GetDeviceConnectionType(remoteDevice, &connectionType);
    if (PARTY_FAILED(error))
    {
        printf("Failed to get device connection type! error = 0x%08x\n", error);
        return;
    }

    // Retrieve the latency statistic.
    PartyEndpointStatistic latencyStatistic = PartyEndpointStatistic::AverageDeviceRoundTripLatencyInMilliseconds;
    uint64_t latencyStatisticValue;
    error = localEndpoint->GetEndpointStatistics(
        1,                       // targetEndpointCount
        &remoteEndpoint,         // targetEndpoints
        1,                       // statisticCount
        &latencyStatistic,       // statisticTypes
        &latencyStatisticValue); // statisticValues
    if (PARTY_FAILED(error))
    {
        printf("Failed to get latency statistic! error = 0x%08x\n", error);
        return;
    }

    // Print the results.
    printf("Local endpoint 0x%p and remote endpoint 0x%p in network 0x%p have average round trip latency %llu ms and device connection type %i\n",
        localEndpoint,
        remoteEndpoint,
        network,
        latencyStatisticValue,
        static_cast<int32_t>(connectionType));
}

연결 형식에 대한 변경 사항

환경 조건이 바뀌면 직접 피어 연결이 중단되어 PlayFab 파티에 사용할 수 없게 될 수도 있습니다. 이 경우 장치는 클라우드 릴레이 서버를 통한 통신으로 대체하려고 시도합니다. 릴레이된 통신이 여전히 가능한 경우 PartyNetwork::GetDeviceConnectionType() 함수는 PartyDeviceConnectionType::RelayServer를 보고하기 시작하며 장치는 앞으로 새 연결 형식을 사용하여 Party 네트워크에 유지됩니다. 그렇지 않은 경우 연결이 중단된 장치는 네트워크를 벗어납니다.

Warning

직접 피어 연결이 중단되었을 때 직접 피어 연결에서 전송 또는 수신 중이던 채팅 및 게임 메시지는 PartySendMessageOptions::GuaranteedDelivery를 사용하여 전송했더라도, 또 더 이상 PartyLocalEndpoint::GetEndpointStatistics()에서 반환되는 PartyEndpointStatistic::CurrentlyQueuedSendMessages 또는 PartyEndpointStatistic::CurrentlyActiveSendMessages 값에 포함되지 않더라도 도착하지 않을 수 있습니다. 또한 연결 형식 전환 기간 동안 전송된 메시지는 PartySendMessageOptions::SequentialDelivery를 사용하여 보낸 경우에도 순서가 뒤섞여서 도착할 수 있습니다. 타이틀은 직접 피어 연결 및 이러한 PartySendMessageOptions를 사용할 때 데이터가 손실되고 순서가 잘못될 수 있는 가능성에 대비해야 합니다.

PartyDeviceConnectionType::RelayServer의 연결 형식은 장치가 처음 네트워크에 연결되었을 때 또는 이전에 중단된 직접 피어 연결 후에 해당 값이 할당되었는지 여부에 관계없이 다른 형식으로 변경되지 않습니다.

청구 미터

직접 피어 투 피어 연결을 사용하는 네트워크에서는 클라우드 릴레이 서비스를 사용하는 네트워크와 동일한 청구 미터가 적용됩니다. 그러나 클라우드 릴레이 서비스를 통해 이동되는 게임 또는 음성 데이터만 네트워크 송신Party 음성 미터로 계산됩니다.