HTTP/2

HTTP/2 是一個二進制協議,這也就意味著它的可讀性幾乎為 0,但幸運的是,我們還是有很多工具,譬如 Wireshark, 能夠將其解析出來。

在了解 HTTP/2 之前,需要知道一些通用術語:

  • Stream: 一個雙向流,一條連接可以有多個 streams
  • Message: 也就是邏輯上面的 request,response
  • Frame::數據傳輸的最小單位。每個 Frame 都屬于一個特定的 stream 或者整個連接。一個 message 可能有多個 frame 組成

Frame

是 HTTP/2 里面最小的數據傳輸單位,一個 Frame 定義如下

+-----------------------------------------------+
|                 Length (24)                   |
+---------------+---------------+---------------+
|   Type (8)    |   Flags (8)   |
+-+-------------+---------------+-------------------------------+
|R|                 Stream Identifier (31)                      |
+=+=============================================================+
|                   Frame Payload (0...)                      ...
+---------------------------------------------------------------+
  • Length:也就是 Frame 的長度,默認最大長度是 16KB,如果要發送更大的 Frame,需要顯式的設置 max frame size
  • Type:Frame 的類型,譬如有 DATA,HEADERS,PRIORITY 等
  • Flag 和 R:保留位,可以先不管
  • Stream Identifier:標識所屬的 stream,如果為 0,則表示這個 frame 屬于整條連接
  • Frame Payload:根據不同 Type 有不同的格式

Multiplexing

HTTP/2 通過 stream 支持了連接的多路復用,提高了連接的利用率。Stream 有很多重要特性:

  • 一條連接可以包含多個 streams,多個 streams 發送的數據互相不影響
  • Stream 可以被 client 和 server 單方面或者共享使用
  • Stream 可以被任意一段關閉
  • Stream 會確定好發送 frame 的順序,另一端會按照接受到的順序來處理
  • Stream 用一個唯一 ID 來標識
    • 這里在說一下 Stream ID,如果是 client 創建的 stream,ID 就是奇數,如果是 server 創建的,ID 就是偶數。ID 0x00 和 0x01 都有特定的使用場景。
    • Stream ID 不可能被重復使用,如果一條連接上面 ID 分配完了,client 會新建一條連接。而 server 則會給 client 發送一個 GOAWAY frame 強制讓 client 新建一條連接。
    • 為了更大的提高一條連接上面的 stream 并發,可以考慮調大 SETTINGS_MAX_CONCURRENT_STREAMS

Priority

因為一條連接允許多個 streams 在上面發送 frame,那么在一些場景下面,我們還是希望 stream 有優先級,方便對端為不同的請求分配不同的資源。譬如對于一個 Web 站點來說,優先加載重要的資源,而對于一些不那么重要的圖片啥的,則使用低的優先級

我們還可以設置 Stream Dependencies,形成一棵 streams priority tree。假設 Stream A 是 parent,Stream B 和 C 都是它的孩子,B 的 weight 是 4,C 的 weight 是 12,假設現在 A 能分配到所有的資源,那么后面 B 能分配到的資源只有 C 的 1/3

Flow Control

HTTP/2 也支持流控,如果 sender 端發送數據太快,receiver 端可能因為太忙,或者壓力太大,或者只想給特定的 stream 分配資源,receiver 端就可能不想處理這些數據。譬如,如果 client 給 server 請求了一個視頻,但這時候用戶暫停觀看了,client 就可能告訴 server 別在發送數據了

雖然 TCP 也有 flow control,但它僅僅只對一個連接有效果。HTTP/2 在一條連接上面會有多個 streams,有時候,我們僅僅只想對一些 stream 進行控制,所以 HTTP/2 單獨提供了流控機制。Flow control 有如下特性:

  • Flow control 是單向的。Receiver 可以選擇給 stream 或者整個連接設置 window size
  • Flow control 是基于信任的。Receiver 只是會給 sender 建議它的初始連接和 stream 的 flow control window size
  • Flow control 不可能被禁止掉。當 HTTP/2 連接建立起來之后,client 和 server 會交換 SETTINGS frames,用來設置 flow control window size
  • Flow control 是 hop-by-hop,并不是 end-to-end 的,也就是我們可以用一個中間人來進行 flow control

這里需要注意,HTTP/2 默認的 window size 是 64 KB,實際這個值太小了,可以直接設置成 1 GB

HPACK

在一個 HTTP 請求里面,我們通常在 header 上面攜帶很多該請求的元信息,用來描述要傳輸的資源以及它的相關屬性。在 HTTP/1.x 時代,我們采用純文本協議,并且使用 \r\n 來分隔,如果我們要傳輸的元數據很多,就會導致 header 非常的龐大。另外,多數時候,在一條連接上面的多數請求,其實 header 差不了多少,譬如我們第一個請求可能 GET /a.txt,后面緊接著是 GET /b.txt,兩個請求唯一的區別就是 URL path 不一樣,但我們仍然要將其他所有的 fields 完全發一遍

HTTP/2 為了解決這個問題,使用了 HPACK。
HPACK 提供了一個靜態和動態的 table,靜態 table 定義了通用的 HTTP header fields,譬如 method,path 等。發送請求的時候,只要指定 field 在靜態 table 里面的索引,雙方就知道要發送的 field 是什么了

對于動態 table,初始化為空,如果兩邊交互之后,發現有新的 field,就添加到動態 table 上面,這樣后面的請求就可以跟靜態 table 一樣,只需要帶上相關的 index 就可以了

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,702評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,143評論 3 415
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 175,553評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,620評論 1 307
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,416評論 6 405
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 54,940評論 1 321
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,024評論 3 440
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,170評論 0 287
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,709評論 1 333
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,597評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,784評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,291評論 5 357
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,029評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,407評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,663評論 1 280
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,403評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,746評論 2 370

推薦閱讀更多精彩內容

  • 轉載于:http://mrpeak.cn/blog/http2/ HTTP 2.0的那些事 在我們所處的互聯網世界...
    柒黍閱讀 2,373評論 0 8
  • Spring Cloud為開發人員提供了快速構建分布式系統中一些常見模式的工具(例如配置管理,服務發現,斷路器,智...
    卡卡羅2017閱讀 134,776評論 18 139
  • 我真的是在瞎逼逼,因為光是 HTTP,就足夠講一塊磚頭了。而且,HTTP 只是協議棧的應用層的其中一個協議:),不...
    昵稱都被用完了衰閱讀 1,078評論 0 3
  • 本文首發地址為-iOS HTTP/2 Server Push 探索 | 李劍飛的博客 HTTP/2 Server ...
    李劍飛的簡書閱讀 4,341評論 1 11
  • 默默地追求 在瘋狂的人后 一路斷壁殘垣 耕耘貧瘠的虛無 他鄉沒有漣漪 冷酷早已看透 煙塵霧霾冰河 嶙峋瘦骨一路 沉...
    壟上行云閱讀 126評論 1 0