MsQuic Settings

April 13, 2026 ยท View on GitHub

MsQuic supports a number of configuration knobs (or settings). These settings can either be set dynamically (via the QUIC_SETTINGS structure) or via persistent storage (e.g. registry on Windows).

Warning Generally MsQuic already choses the best / most correct default values for all settings. Settings should only be changed after due diligence and A/B testing is performed.

MsQuic settings are available on most MsQuic API objects. Here we'll provide an overview of them with links to further details.

Windows Registry

MsQuic supports most of the settings in the QUIC_SETTINGS struct in the registry to be loaded as defaults when the MsQuic library is loaded in a process. These registry settings only provide the defaults; the application is free to change the settings with a call to SetParam or in QUIC_SETTINGS structs passed into ConfigurationOpen.

The default settings are updated automatically in the application when changing the registry, assuming the application hasn't already changed the setting, which overrides the registry value. However, this does not change the settings on Connections which are already established, or Configurations which are already created.

Note: MaxWorkerQueueDelay uses milliseconds in the registry, but uses microseconds (us) in the QUIC_SETTINGS struct.

The following settings are unique to the registry:

SettingTypeRegistry NameDefaultDescription
Max Worker Queue Delayuint32_tMaxWorkerQueueDelayMs250The maximum queue delay (in ms) allowed for a worker thread.
Max Partition Countuint16_tMaxPartitionCountSystem CPU countThe maximum processor count used for partitioning work in MsQuic. Max 512. Restart is required.

The following settings are available via registry as well as via QUIC_SETTINGS:

SettingTypeRegistry NameDefaultDescription
Max Bytes per Keyuint64_tMaxBytesPerKey274,877,906,944Maximum number of bytes to encrypt with a single 1-RTT encryption key before initiating key update.
Handshake Idle Timeoutuint64_tHandshakeIdleTimeoutMs10,000How long a handshake can idle before it is discarded.
Idle Timeoutuint64_tIdleTimeoutMs30,000How long a connection can go idle before it is silently shut down. 0 to disable timeout
Max TLS Send Buffer (Client)uint32_tTlsClientMaxSendBuffer4,096How much client TLS data to buffer.
Max TLS Send Buffer (Server)uint32_tTlsServerMaxSendBuffer8,192How much server TLS data to buffer.
Stream Receive Windowuint32_tStreamRecvWindowDefault65,536Initial stream receive window size for all stream types.
Stream Receive Window (Bidirectional, locally created)uint32_tStreamRecvWindowBidiLocalDefault-If set, overrides stream receive window size for locally initiated bidirectional streams.
Stream Receive Window (Bidirectional, remotely created)uint32_tStreamRecvWindowBidiRemoteDefault-If set, overrides stream receive window size for remote initiated bidirectional streams.
Stream Receive Window (Unidirectional)uint32_tStreamRecvWindowUnidiDefault-If set, overrides stream receive window size for remote initiated unidirectional streams.
Stream Receive Bufferuint32_tStreamRecvBufferDefault4,096Stream initial buffer size.
Flow Control Windowuint32_tConnFlowControlWindow16,777,216Connection-wide flow control window.
Max Stateless Operationsuint32_tMaxStatelessOperations16The maximum number of stateless operations that may be queued on a worker at any one time.
Initial Windowuint32_tInitialWindowPackets10The size (in packets) of the initial congestion window for a connection.
Send Idle Timeoutuint32_tSendIdleTimeoutMs1,000Reset congestion control after being idle SendIdleTimeoutMs milliseconds.
Initial RTTuint32_tInitialRttMs333Initial RTT estimate.
Max ACK Delayuint32_tMaxAckDelayMs25How long to wait after receiving data before sending an ACK.
Disconnect Timeoutuint32_tDisconnectTimeoutMs16,000How long to wait for an ACK before declaring a path dead and disconnecting.
Keep Alive Intervaluint32_tKeepAliveIntervalMs0 (disabled)How often to send PING frames to keep a connection alive.
Idle Timeout Period Changes DestCiduint32_tDestCidUpdateIdleTimeoutMs20,000Idle timeout period after which the destination CID is updated before sending again.
Peer Stream Count (Bidirectional)uint16_tPeerBidiStreamCount0Number of bidirectional streams to allow the peer to open.
Peer Stream Count (Unidirectional)uint16_tPeerUnidiStreamCount0Number of unidirectional streams to allow the peer to open.
Retry Memory Limituint16_tRetryMemoryFraction65 (~0.1%)The percentage of available memory usable for handshake connections before stateless retry is used. Calculated as N/65535.
Load Balancing Modeuint16_tLoadBalancingMode0 (disabled)Global setting, not per-connection/configuration.
Max Operations per Drainuint8_tMaxOperationsPerDrain16The maximum number of operations to drain per connection quantum.
Send Bufferinguint8_tSendBufferingEnabled1 (TRUE)Buffer send data within MsQuic instead of holding application buffers until sent data is acknowledged.
Send Pacinguint8_tPacingEnabled1 (TRUE)Pace sending to avoid overfilling buffers on the path.
Client Migration Supportuint8_tMigrationEnabled1 (TRUE)Enable clients to migrate IP addresses and tuples. Requires a cooperative load-balancer, or no load-balancer.
Datagram Receive Supportuint8_tDatagramReceiveEnabled0 (FALSE)Advertise support for QUIC datagram extension.
Server Resumption Leveluint8_tServerResumptionLevel0 (No resumption)Server only. Controls resumption tickets and/or 0-RTT server support.
Grease Quic Bit Supportuint8_tGreaseQuicBitEnabled0 (FALSE)Advertise support for Grease QUIC Bit extension.
Minimum MTUuint16_tMinimumMtu1288The minimum MTU supported by a connection. This will be used as the starting MTU.
Maximum MTUuint16_tMaximumMtu1500The maximum MTU supported by a connection. This will be the maximum probed value.
MTU Discovery Search Timeoutuint64_tMtuDiscoverySearchCompleteTimeoutUs600000000The time in microseconds to wait before reattempting MTU probing if max was not reached.
MTU Discovery Missing Probe Countuint8_tMtuDiscoveryMissingProbeCount3The number of MTU probes to retry before exiting MTU probing.
Max Binding Stateless Operationsuint16_tMaxBindingStatelessOperations100The maximum number of stateless operations that may be queued on a binding at any one time.
Stateless Operation Expirationuint16_tStatelessOperationExpirationMs100The time limit between operations for the same endpoint, in milliseconds.
Congestion Control Algorithmuint16_tCongestionControlAlgorithm0 (Cubic)The congestion control algorithm used for the connection.
ECNuint8_tEcnEnabled0 (FALSE)Enable sender-side ECN support.
Stream Multi Receiveuint8_tStreamMultiReceiveEnabled0 (FALSE)Enable multi receive support
XDPuint8_tXdpEnabled0 (FALSE)Enable XDP.
QTIPuint8_tQTIPEnabled0 (FALSE)Enable QTIP. XDP must be used. Clients will only send/recv QTIP xor UDP traffic, listeners accept both. More info

The types map to registry types as follows:

  • uint64_t is a REG_QWORD.
  • uint32_t, uint16_t, and uint8_t are REG_DWORD.

While REG_DWORD can hold values larger than uint16_t, the administrator should ensure they do not exceed the maximum value of 65,535 when configuring a uint16_t setting via the Windows Registry.

The following settings are available via registry as well as via QUIC_VERSION_SETTINGS:

SettingTypeRegistry NameDefaultDescription
Acceptable Versions Listuint32_t[]AcceptableVersionsUnsetSets the list of versions that a given server instance will use if a client sends a first flight using them.
Offered Versions Listuint32_t[]OfferedVersionsUnsetSets the list of versions that a given server instance will send in a Version Negotiation packet if it receives a first flight from an unknown version. This list will most often be equal to the Acceptable Versions list.
Fully-Deployed Versions Listuint32_t[]FullyDeployedVersionsUnsetSets the list of QUIC versions that is supported and negotiated by every single QUIC server instance in this deployment. Used to generate the AvailableVersions list in the Version Negotiation Extension Transport Parameter.
Version Negotiation Ext. Enableduint32_tVersionNegotiationExtEnabled0 (FALSE)Enables the Version Negotiation Extension.

The uint32_t[] type is a REG_BINARY blob of the versions list, with each version in little-endian format.

All restrictions and effects on the versions mentioned in QUIC_VERSION_SETTINGS apply to the registry-set versions as well.

Particularly, on server, these must be set GLOBALLY if you want them to take effect for servers.

The following settings are available via registry as well as via QUIC_STATELESS_RETRY_CONFIG:

SettingTypeRegistry NameDefaultDescription
Stateless Retry Key Rotation intervaluint32_tRetryKeyRotationMs30000The interval stateless retry keys are rotated on. A token is valid for 2x this interval.
Stateless Retry Key Algorithmuint32_tRetryKeyAlgorithmQUIC_AEAD_ALGORITHM_AES_256_GCMThe algorithm used to protect the stateless retry token.
Stateless Retry Key Secretuint8_t[]RetryKeySecretRandomly GeneratedThe secret material used to generate the stateless retry keys. MUST be secure randomness!

The uint8_t[] type is a REG_BINARY blob of the secret material, and must be the same length (in bytes) as the algorithm's key.

These settings only take effect in the global registry location.

When changing the stateless retry configuration via registry, admins MUST delete the existing RetryKeyRotationMs, RetryKeyAlgorithm, and RetryKeySecret registry values (if present) before writing the new values. This prevents a split state from occurring while applying settings.

For consistency when configuring Stateless Retry via the registry, values MUST be written in the following order:

  1. RetryKeyRotationMs
  2. RetryKeyAlgorithm
  3. RetryKeySecret

See QUIC_STATELESS_RETRY_CONFIG for more information.

QUIC_SETTINGS

A QUIC_SETTINGS struct is used to configure settings on a Configuration handle, Connection handle, or globally.

For more details see QUIC_SETTINGS.

API Object Parameters

MsQuic API Objects have a number of settings, or parameters, which can be queried via GetParam, or can be set/modifed via SetParam.

Global Parameters

These parameters are accessed by calling GetParam or SetParam with QUIC_PARAM_GLOBAL_* and a NULL object handle.

SettingTypeGet/SetDescription
QUIC_PARAM_GLOBAL_RETRY_MEMORY_PERCENT
0
uint16_tBothThe percentage of available memory usable for handshake connections before stateless retry is used.
QUIC_PARAM_GLOBAL_SUPPORTED_VERSIONS
1
uint32_t[]Get-onlyList of QUIC protocol versions supported in network byte order.
QUIC_PARAM_GLOBAL_LOAD_BALACING_MODE
2
uint16_tBothMust be a QUIC_LOAD_BALANCING_MODE.
QUIC_PARAM_GLOBAL_PERF_COUNTERS
3
uint64_t[]Get-onlyArray size is QUIC_PERF_COUNTER_MAX.
QUIC_PARAM_GLOBAL_LIBRARY_VERSION
4
uint32_t[4]Get-onlyMsQuic API version.
QUIC_PARAM_GLOBAL_SETTINGS
5
QUIC_SETTINGSBothGlobally change settings for all subsequent connections.
QUIC_PARAM_GLOBAL_GLOBAL_SETTINGS
6
QUIC_GLOBAL_SETTINGSBothGlobally change global only settings.
QUIC_PARAM_GLOBAL_VERSION_SETTINGS
7
QUIC_VERSIONS_SETTINGSBothGlobally change version settings for all subsequent connections.
QUIC_PARAM_GLOBAL_LIBRARY_GIT_HASH
8
char[64]Get-onlyGit hash used to build MsQuic (null terminated string)
QUIC_PARAM_GLOBAL_EXECUTION_CONFIG
9 (preview)
QUIC_GLOBAL_EXECUTION_CONFIGBothGlobally configure the execution model used for QUIC. Must be set before opening registration.
QUIC_PARAM_GLOBAL_TLS_PROVIDER
10
QUIC_TLS_PROVIDERGet-OnlyThe TLS provider being used by MsQuic for the TLS handshake.
QUIC_PARAM_GLOBAL_STATELESS_RESET_KEY
11
uint8_t[]Set-OnlyGlobally change the stateless reset key for all subsequent connections.
QUIC_PARAM_GLOBAL_STATISTICS_V2_SIZES
12
uint32_t[]Get-onlyArray of well-known sizes for each version of the QUIC_STATISTICS_V2 struct. The output array length is variable; pass a buffer of uint32_t and check BufferLength for the number of sizes returned. See GetParam documentation for usage details.
QUIC_PARAM_GLOBAL_VERSION_NEGOTIATION_ENABLED
(preview)
uint8_t (BOOLEAN)BothGlobally enable the version negotiation extension for all client and server connections.
QUIC_PARAM_GLOBAL_STATELESS_RETRY_CONFIG
13
QUIC_STATELESS_RETRY_CONFIGSet-OnlyConfigure the stateless retry token secret, key algorithm, and key rotation interval. The secret length must match the AEAD algorithm key length.

Registration Parameters

These parameters are accessed by calling GetParam or SetParam with QUIC_PARAM_REGISTRATION_* and a Registration object handle.

SettingTypeGet/SetDescription

Configuration Parameters

These parameters are accessed by calling GetParam or SetParam with QUIC_PARAM_CONFIGURATION_* and a Configuration object handle.

SettingTypeGet/SetDescription
QUIC_PARAM_CONFIGURATION_SETTINGS
0
QUIC_SETTINGSBothSettings to use for all connections sharing this Configuration. See QUIC_SETTINGS.
QUIC_PARAM_CONFIGURATION_TICKET_KEYS
1
QUIC_TICKET_KEY_CONFIG[]Set-onlyResumption ticket encryption keys. Server-side only.
QUIC_PARAM_CONFIGURATION_VERSION_SETTINGS
2
QUIC_VERSIONS_SETTINGSBothChange version settings for all connections on the configuration.
QUIC_PARAM_CONFIGURATION_SCHANNEL_CREDENTIAL_ATTRIBUTE_W
3
QUIC_SCHANNEL_CREDENTIAL_ATTRIBUTE_WSet-onlyCalls SetCredentialsAttributesW with the supplied attribute and buffer on the credential handle. Schannel-only. Only valid once the credential has been loaded.
QUIC_PARAM_CONFIGURATION_VERSION_NEG_ENABLED
(preview)
uint8_t (BOOLEAN)BothEnables the version negotiation extension for all client connections on the configuration.

Listener Parameters

These parameters are accessed by calling GetParam or SetParam with QUIC_PARAM_LISTENER_* and a Listener object handle.

SettingTypeGet/SetDescription
QUIC_PARAM_LISTENER_LOCAL_ADDRESS
0
QUIC_ADDRGet-onlyGet the full address tuple the server is listening on.
QUIC_PARAM_LISTENER_STATS
1
QUIC_LISTENER_STATISTICSGet-onlyGet statistics specific to this Listener instance.
QUIC_PARAM_LISTENER_CIBIR_ID
2
uint8_t[]BothSets a CIBIR (CID-Based Identification and Routing) well-known identifier.
QUIC_PARAM_DOS_MODE_EVENTS
2
BOOLEANBothThe Listener opted in for DoS Mode event.
QUIC_PARAM_LISTENER_PARTITION_INDEX
(preview)
uint16_tBothThe partition to use for listener callback events and incoming connections.

Connection Parameters

These parameters are accessed by calling GetParam or SetParam with QUIC_PARAM_CONNECTION_* and a Connection object handle.

SettingTypeGet/SetDescription
QUIC_PARAM_CONN_QUIC_VERSION
0
uint32_tGet-onlyNegotiated QUIC protocol version
QUIC_PARAM_CONN_LOCAL_ADDRESS
1
QUIC_ADDRBothSet on client only. Must be set before start or after handshake confirmed.
QUIC_PARAM_CONN_REMOTE_ADDRESS
2
QUIC_ADDRBothSet on client only. Must be set before start.
QUIC_PARAM_CONN_IDEAL_PROCESSOR
3
uint16_tGet-onlyIdeal processor for the app to send from.
QUIC_PARAM_CONN_SETTINGS
4
QUIC_SETTINGSBothConnection settings. See QUIC_SETTINGS
QUIC_PARAM_CONN_STATISTICS
5
QUIC_STATISTICSGet-onlyConnection-level statistics.
QUIC_PARAM_CONN_STATISTICS_PLAT
6
QUIC_STATISTICSGet-onlyConnection-level statistics with platform-specific time format.
QUIC_PARAM_CONN_SHARE_UDP_BINDING
7
uint8_t (BOOLEAN)BothSet on client only. Must be called before start.
QUIC_PARAM_CONN_LOCAL_BIDI_STREAM_COUNT
8
uint16_tGet-onlyNumber of bidirectional streams available.
QUIC_PARAM_CONN_LOCAL_UNIDI_STREAM_COUNT
9
uint16_tGet-onlyNumber of unidirectional streams available.
QUIC_PARAM_CONN_MAX_STREAM_IDS
10
uint64_t[4]Get-onlyArray of number of client and server, bidirectional and unidirectional streams.
QUIC_PARAM_CONN_CLOSE_REASON_PHRASE
11
char[]BothMax length 512 chars.
QUIC_PARAM_CONN_STREAM_SCHEDULING_SCHEME
12
QUIC_STREAM_SCHEDULING_SCHEMEBothWhether to use FIFO or round-robin stream scheduling.
QUIC_PARAM_CONN_DATAGRAM_RECEIVE_ENABLED
13
uint8_t (BOOLEAN)BothIndicate/query support for QUIC datagram extension. Must be set before start.
QUIC_PARAM_CONN_DATAGRAM_SEND_ENABLED
14
uint8_t (BOOLEAN)Get-onlyIndicates peer advertised support for QUIC datagram extension. Call after connected.
QUIC_PARAM_CONN_DISABLE_1RTT_ENCRYPTION
15
uint8_t (BOOLEAN)BothApplication must #define QUIC_API_ENABLE_INSECURE_FEATURES before including msquic.h.
QUIC_PARAM_CONN_RESUMPTION_TICKET
16
uint8_t[]Set-onlyMust be set on client before starting connection.
QUIC_PARAM_CONN_PEER_CERTIFICATE_VALID
17
uint8_t (BOOLEAN)Set-onlyUsed for asynchronous custom certificate validation. Deprecated soon. Replaced by ConnectionCertificateValidationComplete
QUIC_PARAM_CONN_LOCAL_INTERFACE
18
uint32_tSet-onlyThe local interface index to bind to.
QUIC_PARAM_CONN_TLS_SECRETS
19
QUIC_TLS_SECRETSSet-onlyThe TLS secrets struct to be populated by MsQuic.
QUIC_PARAM_CONN_VERSION_SETTINGS
20
QUIC_VERSION_SETTINGSBothThe desired QUIC versions for the connection.
QUIC_PARAM_CONN_CIBIR_ID
21
uint8_t[]Set-onlyThe CIBIR well-known identifier.
QUIC_PARAM_CONN_STATISTICS_V2
22
QUIC_STATISTICS_V2Get-onlyConnection-level statistics, version 2.
QUIC_PARAM_CONN_STATISTICS_V2_PLAT
23
QUIC_STATISTICS_V2Get-onlyConnection-level statistics with platform-specific time format, version 2.
QUIC_PARAM_CONN_ORIG_DEST_CID
24
uint8_t[]Get-onlyThe original destination connection ID used by the client to connect to the server.
QUIC_PARAM_CONN_SEND_DSCP
25
uint8_tBothThe DiffServ Code Point put in the DiffServ field (formerly TypeOfService/TrafficClass) on packets sent from this connection.
QUIC_PARAM_CONN_NETWORK_STATISTICS
32
QUIC_NETWORK_STATISTICSGet-onlyReturns Connection level network statistics
QUIC_PARAM_CONN_CLOSE_ASYNC
26
uint8_t (BOOLEAN)BothThe desired connection close behavior. Defaults to false (synchronous).

QUIC_PARAM_CONN_STATISTICS_V2

Querying the QUIC_STATISTICS_V2 struct via QUIC_PARAM_CONN_STATISTICS_V2 or QUIC_PARAM_CONN_STATISTICS_V2_PLAT should be aware of possible changes in the size of the struct, depending on the version of MsQuic the app using at runtime, not just what it was compiled against.

The minimum size of the struct will always be QUIC_STATISTICS_V2_SIZE_1. Future version of MsQuic will append new fields to the end of the struct, so the maximum possible size will increase.

When an app queries for the statistics, it must always supply an input buffer of length at least QUIC_STATISTICS_V2_SIZE_1, but sizeof(QUIC_STATISTICS_V2) will always work as well. MsQuic will support older callers that supply at least that buffer size, even if the maximum size of the struct has grown in a future version of MsQuic. MsQuic will only write the fields that can completely fit in the buffer supplied by the app.

TLS Parameters

These parameters are accessed by calling GetParam or SetParam with QUIC_PARAM_TLS_* and a Connection object handle.

SettingTypeGet/SetDescription
QUIC_PARAM_TLS_HANDSHAKE_INFO
0
QUIC_HANDSHAKE_INFOGet-onlyCalled in the QUIC_CONNECTION_EVENT_CONNECTED event to get the cryptographic parameters negotiated in the handshake.
QUIC_PARAM_TLS_NEGOTIATED_ALPN
1
uint8_t[] (max 255 bytes)Get-onlyCalled in the QUIC_CONNECTION_EVENT_CONNECTED event to get the negotiated ALPN.

Schannel-only TLS Parameters

These parameters are access by calling GetParam or SetParam with QUIC_PARAM_TLS_SCHANNEL_* and a Connection object handle.

SettingTypeGet/SetDescription
QUIC_PARAM_TLS_SCHANNEL_CONTEXT_ATTRIBUTE_W
0
QUIC_SCHANNEL_CONTEXT_ATTRIBUTE_WGet-onlyCalls QueryContextAttributesW for the given attribute and buffer. Only valid until the QUIC_CONNECTION_EVENT_CONNECTED event, or when TLS is cleaned up.
QUIC_PARAM_TLS_SCHANNEL_CONTEXT_ATTRIBUTE_EX_W
1
QUIC_SCHANNEL_CONTEXT_ATTRIBUTE_EX_WGet-onlyCalls QueryContextAttributesExW for the given attribute and buffer. Only valid until the QUIC_CONNECTION_EVENT_CONNECTED event, or when TLS is cleaned up.
QUIC_PARAM_TLS_SCHANNEL_SECURITY_CONTEXT_TOKEN
2
HANDLEGet-onlyCalls QuerySecurityContextToken on the Schannel handle. Only valid until the QUIC_CONNECTION_EVENT_CONNECTED event, or when TLS is cleaned up.

Stream Parameters

These parameters are access by calling GetParam or SetParam with QUIC_PARAM_STREAM_* and a Stream object handle.

SettingTypeGet/SetDescription
QUIC_PARAM_STREAM_ID
0
QUIC_UINT62Get-onlyMust be called on a stream after StreamStart is called.
QUIC_PARAM_STREAM_0RTT_LENGTH
1
uint64_tGet-onlyLength of 0-RTT data received from peer.
QUIC_PARAM_STREAM_IDEAL_SEND_BUFFER_SIZE
2
uint64_t - bytesGet-onlyIdeal buffer size to queue to the stream. Assumes only one stream sends steadily.
QUIC_PARAM_STREAM_PRIORITY
3
uint16_tGet/SetA value from 0x0 to 0xFFFF that indicates the Stream priority. 0xFFFF is highest priority. Data on higher priority stream get sent first. All streams start with priority 0x7FFF by default.
QUIC_PARAM_STREAM_STATISTICS
4
QUIC_STREAM_STATISTICSGet-onlyStream-level statistics.
QUIC_PARAM_STREAM_RELIABLE_OFFSET
5
uint64_tGet/SetPart of the new Reliable Reset preview feature. Sets/Gets the number of bytes a sender must send before closing SEND path.

See Also

QUIC_SETTINGS
GetParam
SetParam