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

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

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

    聶永的博客

    記錄工作/學(xué)習(xí)的點(diǎn)點(diǎn)滴滴。

    HTTP/2筆記之連接建立

    前言

    HTTP/2協(xié)議在TCP連接之初進(jìn)行協(xié)商通信,只有協(xié)商成功,才會(huì)涉及到后續(xù)的請(qǐng)求-響應(yīng)等具體的業(yè)務(wù)型數(shù)據(jù)交換。

    HTTP版本標(biāo)識(shí)符

    • h2,基于TLS之上構(gòu)建的HTTP/2,作為ALPN的標(biāo)識(shí)符,兩個(gè)字節(jié)表示,0x68, 0x32,即https
    • h2c,直接在TCP之上構(gòu)建的HTTP/2,缺乏安全保證,即http
    • 在HTTP/2 RFC文檔出現(xiàn)之前,以上版本字段需要添加上草案版本號(hào),類(lèi)似于h2-11,h2c-17

    HTTP/2 請(qǐng)求過(guò)程

    針對(duì)直接建立在標(biāo)準(zhǔn)TCP之上HTTP2,在未知服務(wù)器是否提供HTTP/2支持之前,可以依賴現(xiàn)有HTTP/1.1進(jìn)行試探。

    HTTP版本的請(qǐng)求內(nèi)容

    1. 客戶端發(fā)起請(qǐng)求,只有請(qǐng)求報(bào)頭:
      GET / HTTP/1. 1
      Host: server. example. com
      Connection: Upgrade, HTTP2-Settings
      Upgrade: h2c
      HTTP2-Settings: <base64url encoding of HTTP/2 SETTINGS payload>
      
    2. 服務(wù)器若不支持HTTP/2,直接按照HTTP/1.1響應(yīng)即可
      HTTP/1. 1 200 OK
      Content-Length: 243
      Content-Type: text/html
      . . .
      
    3. 服務(wù)器支持HTTP/2,通知客戶端一起切換到HTTP/2協(xié)議下吧

      HTTP/1. 1 101 Switching Protocols
      Connection: Upgrade
      Upgrade: h2c
      
      [ HTTP/2 connection . . .
      
    4. 101響應(yīng)空行之后,服務(wù)器必須發(fā)送的第一個(gè)幀為SETTINGS幀(其負(fù)載可能為空)作為連接序言
    5. 客戶端接收到101響應(yīng)后,也必須發(fā)送一個(gè)序言作為響應(yīng),其邏輯結(jié)構(gòu):
      PRI * HTTP/2.0\r\n\r\nSM\r\n\r\n // 純字符串表示,翻譯成字節(jié)數(shù)為24個(gè)字節(jié)
      SETTINGS幀                       // 其負(fù)載可能為空
      
      服務(wù)器端和客戶端所發(fā)送的連接序言有所不同。
    6. 客戶端可以馬上發(fā)送請(qǐng)求幀或其它幀過(guò)去,不用等待來(lái)自服務(wù)器端的SETTINGS幀
    7. 任一端接收到SETTINGS幀之后,都需要返回一個(gè)包含確認(rèn)標(biāo)志位SETTIGN作為確認(rèn)
    8. 其它幀的正常傳輸

    HTTP/2的直接連接

    客戶端預(yù)先知道服務(wù)器提供HTTP/2支持,可以免去101協(xié)議切換的流程開(kāi)銷(xiāo)。 具體流程:

    1. 客戶端必須首先發(fā)送一個(gè)連接序言,其邏輯結(jié)構(gòu):
      PRI * HTTP/2.0\r\n\r\nSM\r\n\r\n // 純字符串表示,翻譯成字節(jié)數(shù)為24個(gè)字節(jié)
      SETTINGS幀                       // 其負(fù)載可能為空
      
    2. 發(fā)送完畢序言之后,客戶端可以不用等待來(lái)自服務(wù)器端響應(yīng),馬上發(fā)送HTTP/2其它幀
    3. 服務(wù)器端接收到客戶端的連接序言之后,需要發(fā)送一個(gè)SETTINGS幀作為連接序言
    4. 任一端接收到SETTINGS幀之后,都需要返回一個(gè)包含確認(rèn)標(biāo)志位SETTIGN作為確認(rèn)
    5. 其它幀的正常傳輸

    HTTPS版本建立連接

    HTTP/2安全版本在TLS上構(gòu)建,協(xié)商采用的ALPN擴(kuò)展協(xié)議,采用“h2”作為協(xié)議標(biāo)識(shí)符(http版本則是“h2c”)。一定程度上可認(rèn)為不存在試探是否支持或直接連接的煩惱,因?yàn)檫@個(gè)過(guò)程直接在TLS層協(xié)商而成。

    流程如下:

    1. 客戶端和服務(wù)器端TLS層協(xié)商
    2. 客戶端發(fā)送連接序言(同上表示,PRI + SETTINGS)
    3. 接收到客戶端連接序言之后,服務(wù)器端發(fā)送連接序言
    4. 雙方各自確認(rèn)SETTINGS幀
    5. 其它幀的正常傳輸

    HTTPS和HTTP Upgrade方式協(xié)商

    HTTPS協(xié)商是強(qiáng)制,封裝在TLS之上ALPN擴(kuò)展實(shí)現(xiàn),HTTP只有非直接連接方式才會(huì)存在通過(guò)101 協(xié)議切換方式進(jìn)行升級(jí)。

    這里有一張圖形象說(shuō)明其流程。

    統(tǒng)一的連接過(guò)程

    這里不論是HTTP還是HTTPS,在兩端成功協(xié)商之后(或HTTP的直接連接),其連接過(guò)程都是一樣的

    注意事項(xiàng)

    1. 客戶端發(fā)起的HTTP/1.1請(qǐng)求,其流標(biāo)識(shí)符為1,默認(rèn)優(yōu)先級(jí);半關(guān)閉“half closed”狀態(tài),一旦完成HTTP/2的連接,將被應(yīng)用于響應(yīng)
    2. 文檔提到的客戶端可以通過(guò)HTTP Alternative Services(簡(jiǎn)稱(chēng)為[ALT-SVC],類(lèi)似于CNAME機(jī)制)獲得通知服務(wù)器是否支持HTTP/2,但目前看來(lái)僅僅是草案建議而已
    3. 連接序言用于最后兩端協(xié)商確認(rèn)雙方要使用HTTP/2協(xié)議,建立初始化的HTTP/2連接環(huán)境
    4. 客戶端若知服務(wù)器支持HTTP/2,可免去通過(guò)HTTP/1.1 101協(xié)議切換方式進(jìn)行升級(jí),在建立連接后即可發(fā)送序言,否則只能在接收到服務(wù)器端101響應(yīng)后發(fā)送序言
    5. 建立在TLS上的HTTP/2通過(guò)ALPN擴(kuò)展協(xié)商機(jī)制取代101協(xié)議切換
    6. 連接序言所包含的SETTINGS幀其負(fù)載可以為空
    7. 針對(duì)一個(gè)TCP連接,服務(wù)器第一個(gè)要發(fā)送的幀必須是SETTINGS幀
    8. 為了避免不必要延遲,客戶端可以在發(fā)送完畢序言之后發(fā)送幀數(shù)據(jù),不用等待來(lái)自服務(wù)器端的序言SETTINGS幀
    9. 客戶端接收到服務(wù)器端作為序言的SETTINGS幀,需要遵守其設(shè)定
    10. 在一些環(huán)境下需要提供一個(gè)順序機(jī)制,允許服務(wù)器在客戶端發(fā)送業(yè)務(wù)幀之前發(fā)送SETTINGS,這需要客戶端配合
    11. 客戶端和服務(wù)器端任何一方接收到無(wú)效連接序言需要拋出PROTOCOL_ERROR類(lèi)型連接錯(cuò)誤,若收到GOAWAY幀,可忽略

    小結(jié)

    HTTP/2連接的建立協(xié)商機(jī)制比HTTP/1.1稍微復(fù)雜了一些。

    對(duì)比明文版的HTTP/1.1和HTTP/2完成一次請(qǐng)求-響應(yīng):

    1. HTTP/1.1在建立建立之后,只需要發(fā)送請(qǐng)求報(bào)文數(shù)據(jù)
    2. HTTP/2客戶端需要在連接建立之初馬上發(fā)送一個(gè)連接序言過(guò)去,然后才是正常請(qǐng)求
    3. 兩端(客戶端+服務(wù)器端)的兩次完整的連接序言+確認(rèn)的交互流程,多了兩次往返過(guò)程

    在弱網(wǎng)絡(luò)環(huán)境下,會(huì)不會(huì)加重網(wǎng)絡(luò)負(fù)載,只能拭目一看了。

    引用

    1. 《Implementing HTTP/2 client in 60 minutes》

    posted on 2015-03-18 13:54 nieyong 閱讀(13656) 評(píng)論(0)  編輯  收藏 所屬分類(lèi): HTTP

    公告

    所有文章皆為原創(chuàng),若轉(zhuǎn)載請(qǐng)標(biāo)明出處,謝謝~

    新浪微博,歡迎關(guān)注:

    導(dǎo)航

    <2015年3月>
    22232425262728
    1234567
    891011121314
    15161718192021
    22232425262728
    2930311234

    統(tǒng)計(jì)

    常用鏈接

    留言簿(58)

    隨筆分類(lèi)(130)

    隨筆檔案(151)

    個(gè)人收藏

    最新隨筆

    搜索

    最新評(píng)論

    閱讀排行榜

    評(píng)論排行榜

    主站蜘蛛池模板: 免费看男女下面日出水视频| 国产亚洲精品福利在线无卡一 | 亚洲gay片在线gv网站| 四虎影视精品永久免费| 中文字幕免费不卡二区| 亚洲欧洲日韩极速播放| 亚洲人成人网站在线观看| 最近2019年免费中文字幕高清| 亚洲爆乳无码精品AAA片蜜桃| 亚洲一区二区三区偷拍女厕| 成人毛片免费视频| 国产在线一区二区综合免费视频| 久久精品国产亚洲AV久| 国产亚洲av人片在线观看| 中文字幕影片免费在线观看 | 亚洲成人在线免费观看| 亚洲国产综合人成综合网站| 国产h视频在线观看网站免费| 免费人成在线观看播放a| 亚洲成人福利在线| 国产亚洲综合成人91精品| 24小时日本在线www免费的| 成人免费区一区二区三区| 久久亚洲AV成人无码国产电影| 亚洲成人精品久久| 亚洲综合色在线观看亚洲| 成人一a毛片免费视频| 免费一级不卡毛片| 一个人免费播放在线视频看片| 亚洲人成影院在线高清| 国产AV无码专区亚洲AV男同| 又粗又大又猛又爽免费视频| 一二三四视频在线观看中文版免费| 国精产品一区一区三区免费视频 | 国产人成网在线播放VA免费| 中文字幕无码精品亚洲资源网久久 | 国产AV无码专区亚洲AV毛网站| 亚洲Av无码乱码在线znlu| 久久午夜免费视频| 亚洲视频免费在线播放| 久久午夜无码免费|