<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

       :: 首頁 ::  :: 聯系 :: 聚合  :: 管理 ::
      131 隨筆 :: 1 文章 :: 530 評論 :: 0 Trackbacks
    探索HTTP/2: 流的狀態
    探索HTTP/2系列的第四篇文章,解讀了HTTP/2流的狀態,以及狀態之間的轉化。(2016.10.09最后更新)

    1. 概述
        HTTP/2的流(Stream)是有狀態的。當客戶端或服務器端在使用某個流去發送或接收特定幀(Frame)或包含特定標簽(Flag)的幀時,會引起流的狀態的轉化。HTTP 2協議定義的流狀態,如下所示:
                             +--------+
                     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
        總的說,HTTP/2為流的整個生命周期定義了7種狀態:idle,reserved (local),reserved (remote),open,half closed (local),half closed (remote)和closed。當一端發送或接收頭部塊(由一個HEADERS/PUSH_PROMISE幀和緊隨它的零到多個CONTINUATION幀組成的集合)或RST_STREAM幀,或包含有END_STREAM標簽的幀(HEADERS和DATA)之后,將改變流的狀態。
        流的狀態基于各端自己的視角。由于幀的傳輸會有網絡延遲,在同一時刻,不同端認為的流的狀態可能是不同的。比如,當發送端使用一個處于idle狀態的流發送一個不包含END_STREAM標簽的HEADERS幀之后會立即認為該流處于open狀態,但此時接收端尚未得到該HEADERS幀,所以在那一時刻,接收端依然認為該流的狀態是idle。

    2. idle
        所有的流在創建之初都處于idle狀態。處于idle狀態的流,只允許被用于發送HEADERS幀,但可以被用于接收HEADERS和PRIORITY幀。在一端使用該狀態的流發送或接收HEADERS幀之后,該端會認為此流的狀態轉變為open。接收PRIORITY幀不會改變流的狀態。
        一個idle狀態的流可被另一個流通過發送/接收PUSH_PROMISE幀保留著,使其在將來被用于服務器端推送。被保留的流的狀態則從idle變為reserved (local/remote)。

    3. open
        處于open狀態的流可被用于發送任何類型的幀。使用該狀態的流去發送/接收包含有END_STREAM標簽的幀(HEADERS和DATA)之后,會使該流的狀態變成half closed (local/remote)。使用open狀態的流發送或接收RST_STREAM幀之后,則會使它的狀態轉變為closed。

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

    5. reserved (local/remote)
        與half closed (local/remote)狀態相似,reserved (local/remote)狀態中的local與remote也是基于流兩端各自的視角。更具體的是,服務器端發送PUSH_PROMISE將一個idle狀態的流保留著以用于未來的推送,并視這個被保留的流的狀態為reserved (local),而客戶端則視這個流的狀態為reserved (remote)。
        服務器端使用reserved (local)狀態的流向客戶端發送HEADERS幀。該HEADERS幀就是服務器端推送(Server Push)中被推送的響應的頭部。當發送了HEADERS幀之后,服務器端將視該流的狀態為half closed (remote)。
    相應地,客戶端通過reserved (remote)狀態的流接收到服務器端推送的響應的頭部,然后會視該流的狀態為half closed (local)。
        擴展一下,服務器端推送中被保留的流的狀態在變為half closed(local/remote)之后才可能被用于接收/發送被推送的響應的體部,也就是DATA幀。

    6. closed
        當一端使用一個流發送或接收到RST_STREAM幀,或通過狀態為half closed (local/remote)的流接收/發送包含有END_STREAM標簽的幀之后,都會視這個流的狀態為closed。
        closed狀態預示著流的終結,處于該狀態的流將只能發送或接收PRIORITY幀。但有一個特例。即,如果通過使用half closed (local/remote)狀態的流去接收或發送包含有END_STREAM標簽的幀(HEADERS或DATA),以使該流的狀態變為closed,那么在此之后的較短時間內,仍然可以接收WINDOW_UPDATE或RST_STREAM幀。
    posted on 2016-10-08 21:17 John Jiang 閱讀(3030) 評論(0)  編輯  收藏 所屬分類: 原創HTTP/2 、探索HTTP/2
    主站蜘蛛池模板: 久久亚洲最大成人网4438| 久久久久亚洲Av无码专| 国产偷国产偷亚洲高清在线| 永久中文字幕免费视频网站| 中文有码亚洲制服av片| 在线视频免费国产成人| 麻豆安全免费网址入口| 亚洲一区日韩高清中文字幕亚洲| 久久高潮一级毛片免费| 国产亚洲综合一区柠檬导航| 久久久久免费看黄a级试看| 亚洲综合一区二区| 最近中文字幕免费mv视频8| 国产AV无码专区亚洲AV麻豆丫| 午夜亚洲国产成人不卡在线| 精选影视免费在线 | 精品日韩亚洲AV无码| 男男AV纯肉无码免费播放无码| 精品亚洲成a人在线观看| 中文字幕不卡亚洲| 最近在线2018视频免费观看| 亚洲不卡影院午夜在线观看| 亚洲 小说区 图片区 都市| 成人久久免费网站| 国产.亚洲.欧洲在线| 亚洲伊人成无码综合网 | 91福利视频免费观看| 亚洲男人的天堂久久精品| 又粗又大又长又爽免费视频| a级日本高清免费看| 亚洲成a人片在线看| 亚洲国产一区二区三区| 蜜桃成人无码区免费视频网站| 亚洲欧洲无码AV不卡在线| 久久久久噜噜噜亚洲熟女综合| 最近在线2018视频免费观看| 成人婷婷网色偷偷亚洲男人的天堂 | 国产jizzjizz免费看jizz| 搡女人免费免费视频观看| 亚洲人成图片网站| 国产亚洲人成无码网在线观看|