.NET Core 3.0之深入源码理解Kestrel的集成与应用(二)
前言
前一篇文章主要介紹了.NET Core繼承Kestrel的目的、運(yùn)行方式以及相關(guān)的使用,接下來(lái)將進(jìn)一步從源碼角度探討.NET Core 3.0中關(guān)于Kestrel的其他內(nèi)容,該部分內(nèi)容,我們無(wú)需掌握,依然可以用好Kestrel,本文只是將一些內(nèi)部的技術(shù)點(diǎn)揭露出來(lái),供自己及大家有一個(gè)較深的認(rèn)識(shí)。
Kestrel提供了HTTP 1.X及HTTP 2.0的支持,內(nèi)容比較多,從趨勢(shì)上看,Http2.0針對(duì)HTTP 1.X的眾多缺陷進(jìn)行了改進(jìn),所以這篇文章主要關(guān)注Kestrel對(duì)HTTP 2.0的支持。
HTTP 2.X
流控制
在討論流控制之前,我們先看一下流控制的整體結(jié)構(gòu)圖:
接下來(lái),我們?cè)敿?xì)討論一下流控制,其中內(nèi)部有一個(gè)結(jié)構(gòu)體的實(shí)現(xiàn):FlowControl,FlowControl在初始化的時(shí)候設(shè)置了所能接收或者輸出的數(shù)據(jù)量大小,并會(huì)根據(jù)輸入輸出進(jìn)行動(dòng)態(tài)控制,畢竟資源是有限的,在有限資源的限制下,需要靈活處理數(shù)據(jù)包對(duì)資源的占用。FlowControl.Advance方法的調(diào)用會(huì)騰出空間,FlowControl.TryUpdateWindow會(huì)占用空間,以下是FlowControl的源碼:
在控制流中,主要包括FlowControl和StreamFlowControl,StreamFlowControl依賴于FlowControl(Http2Stream引用了StreamFlowControl的讀寫實(shí)現(xiàn))。我們知道,在計(jì)算機(jī)網(wǎng)絡(luò)中,Flow和Stream都是指流的概念,Flow側(cè)重于主機(jī)或者網(wǎng)絡(luò)之間的雙向傳輸?shù)臄?shù)據(jù)包,Stream側(cè)重于成對(duì)的IP之間的會(huì)話。
在FlowControl的輸入輸出控制中,OutFlowControl增加了對(duì)OutputFlowControlAwaitable的引用,并采用了隊(duì)列的方式。
相關(guān)使用如下:
頭部壓縮算法
頭部壓縮算法這塊涉及到動(dòng)/靜態(tài)表、哈夫曼編/解碼、整型編/解碼等。
頭部字段維護(hù)在HeaderField中,源碼如下:
靜態(tài)表由StaticTable實(shí)現(xiàn),內(nèi)部維護(hù)了一個(gè)只讀的HeaderField數(shù)組,動(dòng)態(tài)表由DynamicTable實(shí)現(xiàn),可以視為是HeaderField的一個(gè)動(dòng)態(tài)數(shù)組的實(shí)現(xiàn),其初始大小在實(shí)例化的時(shí)候輸入,并除以32(HeaderField.RfcOverhead)。
哈夫曼編/解碼和整型編/解碼會(huì)被HPackDecoder和HPackEncoder引用。
HPackDecoder提供了三個(gè)公共方法,這三個(gè)方法最終都會(huì)調(diào)用EncodeString進(jìn)行最終的編碼,目前可以看到其內(nèi)部只有整形編碼,我相信在未來(lái)會(huì)增加哈夫曼編碼,以下是EncodeString源碼(有興趣的朋友可以關(guān)注下Span<>的使用):
HPackEncoder只有一個(gè)公共方法Decode,不過(guò)其內(nèi)部實(shí)現(xiàn)非常復(fù)雜,它實(shí)現(xiàn)了流的不同幀的處理、大小的控制以及多路復(fù)用。
HTTP幀處理
讀取功能主要由Http2FrameReader實(shí)現(xiàn),內(nèi)部有四個(gè)常數(shù),如下所示:
HeaderLength = 9:Header長(zhǎng)度
TypeOffset = 3:類型偏移量
FlagsOffset = 4:標(biāo)記偏移量
StreamIdOffset = 5:StreamId偏移量
SettingSize = 6:Id占用2 bytes, 值占用了4 bytes
Http2PeerSettings實(shí)現(xiàn),內(nèi)部提供了一個(gè)Update方法用于更新配置信息。
除此以外還包括Stream生命周期處理、錯(cuò)誤編碼、連接控制等,限于篇幅此處不做其他說(shuō)明,有興趣的朋友可以自己查看源代碼。
總結(jié)
以上是生活随笔為你收集整理的.NET Core 3.0之深入源码理解Kestrel的集成与应用(二)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 再见Jenkins,从Gitlab代码提
- 下一篇: 小白开学Asp.Net Core 《八》