Skip to main content
이 문서는 Microsoft Game Development Kit (GDK)와 함께 MsQuic을 사용하는 방법을 설명합니다. MsQuic은 IETF QUIC 프로토콜의 Microsoft 구현입니다. 크로스 플랫폼이며, C로 작성되었고, 범용 QUIC 라이브러리로 설계되었습니다. QUIC은 원래 HTTP와 같은 “TLS over TCP”를 사용하는 시나리오를 대체하도록 설계되었습니다. 개발자들은 이를 실시간 비신뢰성 데이터그램 메시지와 신뢰성 있는 TCP 유사 스트림을 단일 연결을 통해 다중화하는 데 적합한 범용 UDP 데이터 전송 계층으로 확장했습니다. 이러한 설계는 이를 특히 클라이언트/서버 전송 계층 및 실시간 게임 트래픽 데이터 흐름의 기반으로서 매력적으로 만듭니다. MsQuic은 GDK 타이틀에 맞게 조정되어 있으며, Windows Server, Linux 데스크톱 및 서버, iOS, Android, macOS를 포함한 다양한 플랫폼에서도 사용할 수 있습니다. MsQuic API 문서는 많은 중요한 MsQuic 개념을 다루고 MsQuic API 표면에 대해 코딩하는 방법을 보여줍니다.

QUIC 기능

  • 모든 패킷이 암호화되며 TLS 1.3을 사용하여 핸드셰이크가 인증됩니다.
  • 신뢰성 있는 및 신뢰성 없는 애플리케이션 데이터의 병렬 스트림.
  • 첫 번째 왕복(0-RTT)에서 애플리케이션 데이터 교환.
  • 향상된 혼잡 제어 및 손실 복구.
  • 클라이언트의 IP 주소나 포트 변경에도 유지됩니다.
  • 무상태 로드 밸런싱.
  • 새로운 기능 및 확장을 위해 쉽게 확장 가능.

MsQuic 구현

GDK 타이틀과 함께 사용하도록 조정되었을 뿐만 아니라 MsQuic에는 다른 QUIC 구현과 구별되는 몇 가지 기능이 있습니다.
  • 클라이언트 및 서버에 최적화됨.
  • 최대 처리량 및 최소 지연 시간에 최적화됨.
  • 비동기 IO.
  • Receive side scaling (RSS) 지원.
  • UDP 송신 및 수신 병합 지원.
MsQuic은 다음 QUIC RFC를 구현합니다. MsQuic은 다음 QUIC 초안 확장을 구현합니다.

MsQuic 획득

Microsoft는 MsQuic을 오픈 소스 GitHub 저장소에서 호스팅합니다. 여기에 있는 공식 릴리스 중 하나를 통해 MsQuic을 획득해야 합니다. XBOX Series X|S 콘솔 지원은 prerelease/1.9에 추가되었지만, 가능한 경우 GDK 타이틀에는 최신 공식 릴리스 버전을 사용하는 것이 좋습니다. 특정 릴리스에 대한 사전 빌드된 MsQuic 바이너리는 해당 릴리스의 Assets 섹션에서 찾을 수 있습니다. 특정 MsQuic 버전의 모든 빌드 플레이버는 서로 완전히 호환됩니다. MsQuic이 릴리스 간의 하위 호환성도 유지하려고 하지만, 서로 다른 버전 간의 호환성 기대치에 대해서는 MsQuic 문서 및 릴리스 노트를 참조하세요.

GDK 기반 PC 타이틀

GDK 기반 PC 타이틀에는 msquic_windows_x64_Release_openssl 사전 빌드된 바이너리를 사용하세요. PC의 GDK 타이틀은 네이티브 x64 Win32 애플리케이션으로 실행됩니다. x64 플랫폼용으로 빌드된 MsQuic 버전을 사용하세요. PC에서는 GDK가 지원하는 모든 OS 버전을 지원하기 때문에 OpenSSL로 빌드된 MsQuic 버전을 사용하세요. Schannel을 사용하는 버전은 Windows 11 OS 이상만 지원합니다.

GDK 기반 콘솔 타이틀

GDK 기반 콘솔 타이틀에는 msquic_gamecore_console_x64_Release_schannel 사전 빌드된 바이너리를 사용하세요. MsQuic은 XBOX 콘솔의 GDK 기반 타이틀용 특별 빌드 플레이버를 제공합니다. 이 플레이버는 MsQuic을 WINAPI_PARTITION_GAMES 아래의 API로 제한하며 MsQuic이 XGamePlatform.lib에 대해 링크되도록 합니다. 이 빌드 플레이버를 사용하려면 2021년 10월 릴리스 이상의 XGDK를 설치해야 합니다. MsQuic은 GDK 기반 콘솔 타이틀용으로 빌드할 때 Schannel을 사용합니다.

클라이언트 및 서버 인증

MsQuic은 서버를 인증하기 위해 HTTPS 웹 요청에 사용되는 것과 동일한 인증 및 검증 경로를 자동으로 활용합니다. 클라이언트 인증은 보안 클라이언트/서버 통신 모범 사례(NDA topic)에 요약된 모범 사례를 따라야 합니다. MsQuic에서 클라이언트와 서버 양측 모두 인증서를 구성하기 위해 적절한 QUIC_CREDENTIAL_CONFIG와 함께 ConfigurationLoadCredential API를 사용해야 합니다. MsQuic에 기본적으로 포함된 모든 암호 스위트는 안전한 것으로 간주되지만, 안전하고 인증된 통신 채널이 확립되도록 클라이언트와 서버 양측에서 MsQuic이 인증서를 검증하는 방법을 적절히 설정하는 것이 중요합니다. 서버에서 XSTS 토큰 클라이언트 인증을 사용하려면 QUIC_CREDENTIAL_FLAG_REQUIRE_CLIENT_AUTHENTICATION, QUIC_CREDENTIAL_FLAG_INDICATE_CERTIFICATE_RECEIVED, QUIC_CREDENTIAL_FLAG_NO_CERTIFICATE_VALIDATION 플래그를 지정해야 합니다. QUIC_CREDENTIAL_FLAG_NO_CERTIFICATE_VALIDATION 플래그를 지정하는 경우, 보안 클라이언트/서버 통신 모범 사례(NDA topic) 섹션에 설명된 대로 QUIC_CONNECTION_EVENT_PEER_CERTIFICATE_RECEIVED 이벤트 콜백 내에서 클라이언트 인증서를 직접 검증해야 합니다. 또한 서버에서는 HTTPS 웹 서버에서와 같이 클라이언트가 서버를 인증할 수 있도록 적절히 루트된 인증서를 제공해야 합니다. 클라이언트에서는 절대 QUIC_CREDENTIAL_FLAG_NO_CERTIFICATE_VALIDATION 플래그를 지정해서는 안 됩니다. 서버 인증을 위한 기본 MsQuic 동작이 신원을 검증하는 가장 쉽고 안전한 방법이기 때문입니다. 대신, XSTS 토큰 클라이언트 인증의 경우 보안 클라이언트/서버 통신 모범 사례(NDA topic) 섹션에 설명된 대로 서버에서 생성한 인증서와 함께 QUIC_CREDENTIAL_FLAG_CLIENT 플래그를 지정해야 합니다. 클라이언트 인증서는 QUIC_CREDENTIAL_TYPE_CERTIFICATE_CONTEXT 모드를 지정하고 CertCreateContext와 같은 API를 사용하여 웹 요청 응답 데이터에서 컨텍스트를 직접 생성하는 방식으로 제공하는 것이 좋습니다.

네트워크 초기화

MsQuic은 GDK 타이틀에 대해 네트워크 초기화를 자동으로 처리하지 않습니다. 타이틀 시작 후 및 각 재개 후 MsQuicOpenVersion 또는 MsQuicOpen을 사용하여 MsQuic을 초기화하기 전에 네트워크가 초기화될 때까지 기다리세요.

일시 중지 및 재개

RegisterAppStateChangeNotification을 사용하여 일시 중지 및 재개 이벤트에 등록하세요. 일시 중지 시 열려 있는 모든 스트림을 닫고 MsQuic을 닫습니다. 그런 다음 재개 시 네트워크 초기화를 기다린 다음 MsQuic을 다시 엽니다. 일시 중지 시간 초과 내에 모든 MsQuic 스트림을 신속하게 닫으려면 열린 각 스트림에 대해 QUIC_STREAM_SHUTDOWN_FLAG_ABORTQUIC_STREAM_SHUTDOWN_FLAG_IMMEDIATE 플래그와 함께 StreamShutdown을 호출하세요. 이 호출은 즉시 QUIC_STREAM_EVENT_SHUTDOWN_COMPLETE 이벤트를 트리거합니다. 이 시점에서 스트림을 닫기 위해 StreamClose를 호출하는 것이 안전합니다. 주어진 연결에 대해 모든 스트림이 닫히면 QUIC_CONNECTION_SHUTDOWN_FLAG_SILENT 플래그와 함께 ConnectionShutdown을 호출한 다음 ConnectionClose를 호출합니다. 모든 연결을 닫은 후, 남아 있는 등록 및 구성에 대해 RegistrationCloseConfigurationClose를 호출한 다음 MsQuicClose를 호출합니다.

선호 포트

GDK 타이틀의 주요 게임 트래픽에는 선호 로컬 UDP 멀티플레이어 포트를 사용하세요. MsQuic에서 이 포트를 설정하려면 ConnectionStart를 호출하기 전에 연결 객체 핸들의 QUIC_PARAM_CONN_LOCAL_ADDRESS 설정과 함께 SetParam 함수를 사용하세요. QUIC_PARAM_CONN_LOCAL_ADDRESS를 설정할 때 듀얼 스택 IPv4 및 IPv6 소켓을 허용하려면 AF_UNSPEC 계열을 지정하세요. 다음 예제는 MsQuicCallTableMsQuicOpen에서 반환되고 MsQuicConnectionHandleConnectionOpen에서 반환될 때 선호 포트를 설정하는 방법을 보여줍니다.

메모리 고려 사항

MsQuic의 성능 우수한 구현은 GDK 타이틀에서/으로 높은 대역폭 전송을 가능하게 합니다. WinSock 메모리 고려 사항의 확장으로, MsQuic을 사용할 때 커널에 의한 메모리 소비를 최소화하기 위해 다음 모범 사례를 따르세요. GDK 타이틀은 콜백의 실행 시간을 최소한으로 유지해야 합니다. MsQuic은 프로토콜 실행과 앱으로의 업콜에 별도의 스레드를 사용하지 않습니다. 따라서 콜백에서 상당한 지연이 있으면 프로토콜이 지연되어 커널에서 요구하는 메모리 소비가 증가합니다. 타이틀에서 완료해야 하는 상당한 시간이나 작업은 자체 스레드에서 발생해야 합니다. GDK 타이틀은 커널 메모리 사용을 줄이기 위해 송신 버퍼를 효율적으로 관리해야 합니다. 자세한 내용은 MsQuic이 타이틀에서 이 동작을 어떻게 제어하도록 하는지 알아보려면 MsQuic의 송신 버퍼링을 참조하세요. 수신된 데이터가 사용자 모드 버퍼로 효율적으로 전송되도록 보장하려면 MsQuic과 함께 비동기 수신을 사용하는 것이 좋습니다. MsQuic에서의 수신에서 비동기 수신을 처리하는 방법에 대한 추가 세부 정보를 확인할 수 있습니다. 또한, 소비되는 커널 메모리 양을 최소화하려면 MsQuic GDK 클라이언트에서 부분 데이터 수락 기능을 사용하지 마세요.

참고 항목

MsQuic MsQuic API 문서 MsQuic 릴리스 MsQuic 빌드 문서 MsQuic Echo PlayFab Server Sample
마지막 수정일 2026년 8월 24일