QUIC 기능
- 모든 패킷이 암호화되며 TLS 1.3을 사용하여 핸드셰이크가 인증됩니다.
- 신뢰성 있는 및 신뢰성 없는 애플리케이션 데이터의 병렬 스트림.
- 첫 번째 왕복(0-RTT)에서 애플리케이션 데이터 교환.
- 향상된 혼잡 제어 및 손실 복구.
- 클라이언트의 IP 주소나 포트 변경에도 유지됩니다.
- 무상태 로드 밸런싱.
- 새로운 기능 및 확장을 위해 쉽게 확장 가능.
MsQuic 구현
GDK 타이틀과 함께 사용하도록 조정되었을 뿐만 아니라 MsQuic에는 다른 QUIC 구현과 구별되는 몇 가지 기능이 있습니다.- 클라이언트 및 서버에 최적화됨.
- 최대 처리량 및 최소 지연 시간에 최적화됨.
- 비동기 IO.
- Receive side scaling (RSS) 지원.
- UDP 송신 및 수신 병합 지원.
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_ABORT 및 QUIC_STREAM_SHUTDOWN_FLAG_IMMEDIATE 플래그와 함께 StreamShutdown을 호출하세요. 이 호출은 즉시 QUIC_STREAM_EVENT_SHUTDOWN_COMPLETE 이벤트를 트리거합니다. 이 시점에서 스트림을 닫기 위해 StreamClose를 호출하는 것이 안전합니다. 주어진 연결에 대해 모든 스트림이 닫히면 QUIC_CONNECTION_SHUTDOWN_FLAG_SILENT 플래그와 함께 ConnectionShutdown을 호출한 다음 ConnectionClose를 호출합니다. 모든 연결을 닫은 후, 남아 있는 등록 및 구성에 대해 RegistrationClose 및 ConfigurationClose를 호출한 다음 MsQuicClose를 호출합니다.
선호 포트
GDK 타이틀의 주요 게임 트래픽에는 선호 로컬 UDP 멀티플레이어 포트를 사용하세요. MsQuic에서 이 포트를 설정하려면 ConnectionStart를 호출하기 전에 연결 객체 핸들의QUIC_PARAM_CONN_LOCAL_ADDRESS 설정과 함께 SetParam 함수를 사용하세요.
QUIC_PARAM_CONN_LOCAL_ADDRESS를 설정할 때 듀얼 스택 IPv4 및 IPv6 소켓을 허용하려면 AF_UNSPEC 계열을 지정하세요. 다음 예제는 MsQuicCallTable이 MsQuicOpen에서 반환되고 MsQuicConnectionHandle이 ConnectionOpen에서 반환될 때 선호 포트를 설정하는 방법을 보여줍니다.
