KestrelServerLimits利用其丰富的属性对连接、请求和响应进行了相应的限制。KestrelServer提供了针对HTTP 2和HTTP3的支持,针对性的限制设置体现在KestrelServerLimits类型的Http2和Http3属性上。下表对定义在KestrelServerLimits类型中的这些属性所体现的限制约束进行了简单说明。
属性 | 含 义 |
MaxConcurrentConnections | 最大并发连接。如果设置为Null(默认值),意味着不作限制。 |
MaxConcurrentUpgradedConnections | 可升级连接(比如从HTTP升级到WebSocket)的最大并发数。如果设置为Null(默认值),意味着不作限制。 |
KeepAliveTimeout | 连接保持活动状态的超时时间,默认值为130秒。 |
MaxRequestHeaderCount | 请求携带的最大报头数量,默认值为100。 |
MaxRequestBufferSize | 请求缓冲区最大容量,默认值为1,048,576字节(1M)。 |
MaxRequestHeadersTotalSize | 请求携带报头总字节数,默认值为 32,768字节(32K)。 |
MaxRequestLineSize | 对于HTTP 1.X来说就是请求的首行(Request Line)最大字节数。对于HTTP 2/3来说就是 :method, :scheme, :authority, and :path这些报头的总字节数。默认值为8,192 字节(8K)。 |
MaxRequestBodySize | 请求主体最大字节数,默认值为30,000,000 字节(约28.6M)。如果设置为Null,意味着不作限制。 |
RequestHeadersTimeout | 接收请求报头的超时时间,默认为30秒。 |
MinRequestBodyDataRate | 请求主体内容最低传输率。 |
MaxResponseBufferSize | 响应缓冲区最大容量,默认值为65,536(1M)。 |
MinResponseDataRate | 响应最低传输率。 |
HTTP 2相关限制和约束的设置体现在KestrelServerLimits的Http2属性上,该属性返回如上所示的Http2Limits对象。下表对定义在Http2Limits类型中的这些属性所体现的限制约束进行了简单说明。
属性 | 含 义 |
MaxStreamsPerConnection | 连接能够承载的流数量,默认值为100。 |
HeaderTableSize | HPACK报头压缩表的容量,默认值为4096。 |
MaxFrameSize | 帧的最大字节数,有效值在[214~224 – 1]区间范围内,默认值为214(16384)。 |
MaxRequestHeaderFieldSize | 最大请求报头(含报头名称)的最大字节数,默认值为214(16384)。 |
InitialConnectionWindowSize | 连接的初始化请求主体缓存区的大小,有效值在[65535~231]区间范围内,默认为131072。 |
InitialStreamWindowSize | 流的初始化请求主体缓存区的大小,有效值在[65535~231]区间范围内,默认为98304。 |
KeepAlivePingDelay | 如果服务端在该属性设定的时间跨度内没有接收到来自客户端的有效帧,它会主动发送Ping请求确定客户端的是否保持活动状态,默认值为1秒。 |
KeepAlivePingTimeout | 发送Ping请求的超时时间,如果客户端在该时限内一直处于为活动状态,当前连接将被关闭,默认值为20秒。 |
由于HTTP 2的多路复用是在同一个TCP连接上实现的,这样的实现并不“纯粹”,因为它不可能解决由于TCP的“拥塞控制”机制导致的“队头阻塞(Header-Of-Line Blocking)”问题。如果希望在得到并发支持的前提下还能在低延时上有更好的作为,就不得不抛弃TCP。目前被正式确定为HTTP 3的QUIC(Quick UDP Internet Connection)就将TCP替换成了UDP。如果KestrelServer支持HTTP 3,我们可以利用KestrelServerLimits的Http3属性返回的Http3Limits对象都限制约束进行针对性设置。Http3Limits只包含如下这个表示最大请求报头字节数的MaxRequestHeaderFieldSize属性,它的默认值为16384。