dotnet/aspnetcore

HTTP/3: Add additional configuration to Http3Limits

JamesNK opened this issue · 6 comments

msquic has various configuration options: https://github.com/microsoft/msquic/blob/main/docs/Settings.md

At the very least the msquic options that have matching configuration in Http2Limits should be added to Http3Limits.

Examples:

  • InitialConnectionWindowSize = ConnFlowControlWindow (or InitialWindowPackets?)
  • InitialStreamWindowSize = StreamRecvWindowDefault
  • KeepAlivePingDelay = KeepAliveIntervalMs?
  • KeepAlivePingTimeout = DisconnectTimeoutMs?

Also msquic's IdleTimeoutMs should be set to KestrelServerLimits.KeepAliveTimeout

Thanks for contacting us.
We're moving this issue to the Next sprint planning milestone for future evaluation / consideration. Because it's not immediately obvious that this is a bug in our framework, we would like to keep this around to collect more feedback, which can later help us determine the impact of it. We will re-evaluate this issue, during our next planning meeting(s).
If we later determine, that the issue has no community involvement, or it's very rare and low-impact issue, we will close it - so that the team can focus on more important and high impact issues.
To learn more about what to expect next and how this issue will be handled you can read more about our triage process here.

A lot of QuicTransportOptions should be moved to Http3Limits and passed through as features instead.
MaxUnidirectionalStreamCount
MaxBidirectionalStreamCount
IdleTimeout #34955
MaxReadBufferSize
MaxWriteBufferSize

Could QuicTransportOptions be removed entirely?

HandshakeIdleTimeoutMs maps to HttpsConnectionAdapterOptions.HandshakeTimeout

Notes for MaxUnidirectionalStreamCount, MaxBidirectionalStreamCount.

  • Remove them both from the options and make them a feature at the Quic layer.
  • The Http3 layer will hard code MaxUnidirectionalStreamCount to ~10, these are only needed for control streams.
  • Http3Limits will add MaxStreamsPerConnection like Http2Limtis has and use it to set MaxBidirectionalStreamCount.
    public int MaxStreamsPerConnection
  • The Http3 layer will hard code MaxUnidirectionalStreamCount to ~10, these are only needed for control streams.

WebTransport will want to establish more unidirectional streams.

We'll need to go through https://github.com/dotnet/aspnetcore/blob/main/src/Servers/Kestrel/Transport.Quic/src/QuicTransportOptions.cs and rethink the ones that are marked as preview (do they still need to exist? If so, where? Can they be based on other existing settings?).