<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    John Jiang

    a cup of Java, cheers!
    https://github.com/johnshajiang/blog

       :: 首頁(yè) ::  :: 聯(lián)系 :: 聚合  :: 管理 ::
      131 隨筆 :: 1 文章 :: 530 評(píng)論 :: 0 Trackbacks
    探索HTTP/2: 流的狀態(tài)
    探索HTTP/2系列的第四篇文章,解讀了HTTP/2流的狀態(tài),以及狀態(tài)之間的轉(zhuǎn)化。(2016.10.09最后更新)

    1. 概述
        HTTP/2的流(Stream)是有狀態(tài)的。當(dāng)客戶端或服務(wù)器端在使用某個(gè)流去發(fā)送或接收特定幀(Frame)或包含特定標(biāo)簽(Flag)的幀時(shí),會(huì)引起流的狀態(tài)的轉(zhuǎn)化。HTTP 2協(xié)議定義的流狀態(tài),如下所示:
                             +--------+
                     send PP |        | recv PP
                    
    ,--------|  idle  |--------.
                   /         |        |         \
                  v          +--------+          v
           +----------+          |           +----------+
           |          |          | send H /  |          |
    ,------| reserved |          | recv H    | reserved |------.
    |      | (local)  |          |           | (remote) |      |
    |      +----------+          v           +----------+      |
    |          |             +--------+             |          |
    |          |     recv ES |        | send ES     |          |
    |   send H |     ,-------|  open  |-------.     | recv H   |
    |          |    /        |        |        \    |          |
    |          v   v         +--------+         v   v          |
    |      +----------+          |           +----------+      |
    |      |   half   |          |           |   half   |      |
    |      |  closed  |          | send R /  |  closed  |      |
    |      | (remote) |          | recv R    | (local)  |      |
    |      +----------+          |           +----------+      |
    |           |                |                 |           |
    |           | send ES /      |       recv ES / |           |
    |           | send R /       v        send R / |           |
    |           | recv R     +--------+   recv R   |           |
    | send R /  `----------->|        |<-----------'  send R / |
    | recv R                 | closed |               recv R   |
    `----------------------->|        |<----------------------'
                             +--------+

       send:   endpoint sends this frame
       recv:   endpoint receives this frame

       H:  HEADERS frame (with implied CONTINUATIONs)
       PP: PUSH_PROMISE frame (with implied CONTINUATIONs)
       ES: END_STREAM flag
       R:  RST_STREAM frame
        總的說(shuō),HTTP/2為流的整個(gè)生命周期定義了7種狀態(tài):idle,reserved (local),reserved (remote),open,half closed (local),half closed (remote)和closed。當(dāng)一端發(fā)送或接收頭部塊(由一個(gè)HEADERS/PUSH_PROMISE幀和緊隨它的零到多個(gè)CONTINUATION幀組成的集合)或RST_STREAM幀,或包含有END_STREAM標(biāo)簽的幀(HEADERS和DATA)之后,將改變流的狀態(tài)。
        流的狀態(tài)基于各端自己的視角。由于幀的傳輸會(huì)有網(wǎng)絡(luò)延遲,在同一時(shí)刻,不同端認(rèn)為的流的狀態(tài)可能是不同的。比如,當(dāng)發(fā)送端使用一個(gè)處于idle狀態(tài)的流發(fā)送一個(gè)不包含END_STREAM標(biāo)簽的HEADERS幀之后會(huì)立即認(rèn)為該流處于open狀態(tài),但此時(shí)接收端尚未得到該HEADERS幀,所以在那一時(shí)刻,接收端依然認(rèn)為該流的狀態(tài)是idle。

    2. idle
        所有的流在創(chuàng)建之初都處于idle狀態(tài)。處于idle狀態(tài)的流,只允許被用于發(fā)送HEADERS幀,但可以被用于接收HEADERS和PRIORITY幀。在一端使用該狀態(tài)的流發(fā)送或接收HEADERS幀之后,該端會(huì)認(rèn)為此流的狀態(tài)轉(zhuǎn)變?yōu)閛pen。接收PRIORITY幀不會(huì)改變流的狀態(tài)。
        一個(gè)idle狀態(tài)的流可被另一個(gè)流通過(guò)發(fā)送/接收PUSH_PROMISE幀保留著,使其在將來(lái)被用于服務(wù)器端推送。被保留的流的狀態(tài)則從idle變?yōu)閞eserved (local/remote)。

    3. open
        處于open狀態(tài)的流可被用于發(fā)送任何類型的幀。使用該狀態(tài)的流去發(fā)送/接收包含有END_STREAM標(biāo)簽的幀(HEADERS和DATA)之后,會(huì)使該流的狀態(tài)變成half closed (local/remote)。使用open狀態(tài)的流發(fā)送或接收RST_STREAM幀之后,則會(huì)使它的狀態(tài)轉(zhuǎn)變?yōu)閏losed。

    4. half closed (local/remote)
        狀態(tài)half closed (local)與half closed (remote)中的local與remote的區(qū)別,完全是基于各端自己的視角。對(duì)于同一個(gè)流的兩端,如果一端認(rèn)為這個(gè)流的狀態(tài)是half closed (local),那么另一端只能認(rèn)為這個(gè)流的狀態(tài)是half closed (remote)。
        處于half closed (local)狀態(tài)的流只能被用于發(fā)送WINDOW_UPDATE,PRIORITY和RST_STREAM幀,但可以被用于接收任何類型的幀。相對(duì)應(yīng)地,處于half closed (remote)狀態(tài)的流只能被用于接收WINDOW_UPDATE,PRIORITY和RST_STREAM幀,但可以被用于發(fā)送任何類型的幀。

    5. reserved (local/remote)
        與half closed (local/remote)狀態(tài)相似,reserved (local/remote)狀態(tài)中的local與remote也是基于流兩端各自的視角。更具體的是,服務(wù)器端發(fā)送PUSH_PROMISE將一個(gè)idle狀態(tài)的流保留著以用于未來(lái)的推送,并視這個(gè)被保留的流的狀態(tài)為reserved (local),而客戶端則視這個(gè)流的狀態(tài)為reserved (remote)。
        服務(wù)器端使用reserved (local)狀態(tài)的流向客戶端發(fā)送HEADERS幀。該HEADERS幀就是服務(wù)器端推送(Server Push)中被推送的響應(yīng)的頭部。當(dāng)發(fā)送了HEADERS幀之后,服務(wù)器端將視該流的狀態(tài)為half closed (remote)。
    相應(yīng)地,客戶端通過(guò)reserved (remote)狀態(tài)的流接收到服務(wù)器端推送的響應(yīng)的頭部,然后會(huì)視該流的狀態(tài)為half closed (local)。
        擴(kuò)展一下,服務(wù)器端推送中被保留的流的狀態(tài)在變?yōu)閔alf closed(local/remote)之后才可能被用于接收/發(fā)送被推送的響應(yīng)的體部,也就是DATA幀。

    6. closed
        當(dāng)一端使用一個(gè)流發(fā)送或接收到RST_STREAM幀,或通過(guò)狀態(tài)為half closed (local/remote)的流接收/發(fā)送包含有END_STREAM標(biāo)簽的幀之后,都會(huì)視這個(gè)流的狀態(tài)為closed。
        closed狀態(tài)預(yù)示著流的終結(jié),處于該狀態(tài)的流將只能發(fā)送或接收PRIORITY幀。但有一個(gè)特例。即,如果通過(guò)使用half closed (local/remote)狀態(tài)的流去接收或發(fā)送包含有END_STREAM標(biāo)簽的幀(HEADERS或DATA),以使該流的狀態(tài)變?yōu)閏losed,那么在此之后的較短時(shí)間內(nèi),仍然可以接收WINDOW_UPDATE或RST_STREAM幀。
    posted on 2016-10-08 21:17 John Jiang 閱讀(3045) 評(píng)論(0)  編輯  收藏 所屬分類: 原創(chuàng) 、HTTP/2 、探索HTTP/2
    主站蜘蛛池模板: 夭天干天天做天天免费看| 亚洲依依成人亚洲社区| yy6080亚洲一级理论| 国产a视频精品免费观看| 成人网站免费大全日韩国产| 亚洲精品无播放器在线播放| 亚洲视频免费一区| 亚洲免费观看在线视频| 亚洲精品一品区二品区三品区| 日韩一级在线播放免费观看| 国产AV日韩A∨亚洲AV电影| 亚洲第一成人影院| 午夜dj免费在线观看| 免费国产va视频永久在线观看| 亚洲an日韩专区在线| 免费A级毛片无码久久版| 一区视频免费观看| 亚洲福利电影在线观看| 无码欧精品亚洲日韩一区夜夜嗨 | 性做久久久久免费看| 99爱在线精品免费观看| 国产成人亚洲精品蜜芽影院| 亚洲人xxx日本人18| 亚洲日本香蕉视频观看视频| 亚洲高清在线观看| 老司机午夜精品视频在线观看免费| 国产亚洲精品免费视频播放 | 久久精品亚洲中文字幕无码麻豆| 成年女人免费v片| 中国极品美軳免费观看| kk4kk免费视频毛片| A国产一区二区免费入口| 亚洲综合一区二区三区四区五区| 亚洲乱人伦精品图片| 亚洲区精品久久一区二区三区| 亚洲国产精品成人精品小说| 亚洲精品影院久久久久久| 亚洲日韩中文字幕天堂不卡| 国产精品亚洲片夜色在线| 最新亚洲春色Av无码专区| 亚洲影视自拍揄拍愉拍|