深入理解HTTP協(xié)議二

深入理解HTTP協(xié)議一中,分析了:

  • 網(wǎng)絡(luò)體系結(jié)構(gòu)
  • 數(shù)據(jù)傳輸過程(主要是TCP)
  • HTTP基本特征

在本章中主要分析:

  • http1.0兆解、http1.1及http2版本區(qū)別
  • http報(bào)文結(jié)構(gòu)

一、http1.0疾嗅、http1.1及http2版本區(qū)別

http1.0

HTTP/1.0\color{red}{最大的缺點(diǎn)}是一次TCP請(qǐng)求只能發(fā)送一次http請(qǐng)求搓蚪,每次請(qǐng)求資源的時(shí)候都需要重新發(fā)起TCP請(qǐng)求。

http1.0

上圖是http1.0請(qǐng)求一次資源的時(shí)間過程烘豹,可以看出一次請(qǐng)求包含2個(gè)RTT,一個(gè)是TCP連接,一個(gè)http報(bào)文數(shù)據(jù))诺祸。

http1.0的持續(xù)連接連接問題可以用\color{red}{Connection: keep-alive}實(shí)現(xiàn)

不過http1.0的keep-alive默認(rèn)是關(guān)閉的

http1.1

http1.1主要就是解決了\color{red}{持續(xù)連接} 問題携悯,即TCP連接默認(rèn)不關(guān)閉,可以被多個(gè)請(qǐng)求復(fù)用筷笨,不用聲明Connection: keep-alive.

隊(duì)頭堵塞

http1.1版允許復(fù)用TCP連接憔鬼,但是同一個(gè)TCP連接里面,所有的數(shù)據(jù)通信是按次序進(jìn)行的胃夏。服務(wù)器只有處理完一個(gè)回應(yīng)轴或,才會(huì)進(jìn)行下一個(gè)回應(yīng)。要是前面的回應(yīng)特別慢仰禀,后面就會(huì)有許多請(qǐng)求排隊(duì)等著.

Chrome有個(gè)機(jī)制照雁,對(duì)于同一個(gè)域名,默認(rèn)允許同時(shí)建立 6 個(gè) TCP持久連接悼瘾,使用持久連接時(shí)囊榜,雖然能公用一個(gè)TCP管道,但是在一個(gè)管道中同一時(shí)刻只能處理一個(gè)請(qǐng)求亥宿,在當(dāng)前的請(qǐng)求沒有結(jié)束之前卸勺,其他的請(qǐng)求只能處于阻塞狀態(tài)。另外如果在同一個(gè)域名下同時(shí)有10個(gè)請(qǐng)求發(fā)生烫扼,那么其中4個(gè)請(qǐng)求會(huì)進(jìn)入排隊(duì)等待狀態(tài)曙求,直至進(jìn)行中的請(qǐng)求完成.

http1.1

上圖是簡書的一個(gè)頁面的請(qǐng)求次數(shù),大概是75個(gè)映企,這還是比較少的悟狱,瀏覽器只能夠同時(shí)建立 6 個(gè) TCP持久連接,那就意味著有60多個(gè)請(qǐng)求需要等待.

等待

可以看到同一時(shí)刻堰氓,只有8個(gè)請(qǐng)求在執(zhí)行挤渐。

這就是為什么我們強(qiáng)調(diào)要用Spriting合并多張小圖為一張大圖,這樣可以減少http請(qǐng)求的次數(shù)。

我們?cè)谑褂脀ebpack打包資源切分包的時(shí)候也不是說包越小越好双絮,太小只會(huì)增加http請(qǐng)求次數(shù)浴麻,從而影響性能。

頭部報(bào)文巨大

http1.1另外一個(gè)缺點(diǎn)是http頭較大(相對(duì)http2)囤攀,主要原因是http1.1的頭信息只能是文本(ASCII編碼)不能是二進(jìn)制流软免。

http2

http2主要改進(jìn)點(diǎn):

  • Header的壓縮
  • Server Push
  • 請(qǐng)求/響應(yīng)管線化
  • 修復(fù)在HTTP 1.x的隊(duì)頭阻塞問題
  • 在單個(gè)TCP連接里多工復(fù)用請(qǐng)求

詳細(xì)參考請(qǐng)深入淺出:HTTP/2

目前主流瀏覽器都支持HTTP/2,判斷網(wǎng)站是否支持http2可以通過一下代碼判斷

(function(){
    // 保證這個(gè)方法只在支持loadTimes的chrome瀏覽器下執(zhí)行
    if(window.chrome && typeof chrome.loadTimes === 'function') {
        var loadTimes = window.chrome.loadTimes();
        var spdy = loadTimes.wasFetchedViaSpdy;
        var info = loadTimes.npnNegotiatedProtocol || loadTimes.connectionInfo;
        // 就以 「h2」作為判斷標(biāo)識(shí)
        if(spdy && /^h2/i.test(info)) {
            return console.info('本站點(diǎn)使用了HTTP/2');
        }
    }
    console.warn('本站點(diǎn)沒有使用HTTP/2');
})();

測(cè)試了一下淘寶是支持http2的焚挠。官方解釋使用HTTP/2能帶來20%~60%的效率提升膏萧,所以HTTP/2也是前端性能優(yōu)化的一個(gè)方向。

二、HTTP報(bào)文結(jié)構(gòu)

我們?cè)谡{(diào)試模式下查看connect內(nèi)容榛泛,能看到基本上分為3塊蝌蹂,基本信息、請(qǐng)求header挟鸠、響應(yīng)header叉信。

http報(bào)文

HTTP是一個(gè)基于請(qǐng)求/響應(yīng)模式的、一問一答的方式實(shí)現(xiàn)服務(wù)艘希。即我們通常所說的Request/Response硼身,對(duì)應(yīng)的就是請(qǐng)求報(bào)文和響應(yīng)報(bào)文。

請(qǐng)求報(bào)文

請(qǐng)求報(bào)文結(jié)構(gòu)

主要分為:

  • 報(bào)文首部(請(qǐng)求行+請(qǐng)求頭部)
  • 空行
  • 報(bào)文內(nèi)容

請(qǐng)求行

請(qǐng)求行由請(qǐng)求\color{red}{方法字段}覆享、\color{red}{URL字段}\color{red}{HTTP協(xié)議版本字段}3個(gè)字段組成佳遂,它們用空格分隔。例如撒顿,GET /index.html HTTP/1.1丑罪。

常用請(qǐng)求方法有:

GET、POST凤壁、HEAD吩屹、PUT、DELETE拧抖、OPTIONS煤搜、TRACE、CONNECT

請(qǐng)求頭部

請(qǐng)求頭部一般分為:

  • 通用首部(General Header)
  • 請(qǐng)求首部(Request Header)
  • 實(shí)體首部(Entity Header Fields)

請(qǐng)求頭部由關(guān)鍵字/值對(duì)組成唧席,每行一對(duì)擦盾,關(guān)鍵字和值用英文冒號(hào)“:”分隔。請(qǐng)求頭部通知服務(wù)器有關(guān)于客戶端請(qǐng)求的信息

常用請(qǐng)求頭部:

User-Agent:產(chǎn)生請(qǐng)求的瀏覽器類型淌哟。
Accept:客戶端可識(shí)別的內(nèi)容類型列表迹卢。
Host:請(qǐng)求的主機(jī)名,允許多個(gè)域名同處一個(gè)IP地址徒仓,即虛擬主機(jī)腐碱。

報(bào)文內(nèi)容

\color{red}{請(qǐng)求數(shù)據(jù)不在GET方法中使用,而是在POST方法中使用掉弛。}POST方法適用于需要客戶填寫表單的場(chǎng)合喻杈。與請(qǐng)求數(shù)據(jù)相關(guān)的最常使用的請(qǐng)求頭是Content-Type和Content-Length.

響應(yīng)報(bào)文

[圖片上傳失敗...(image-b78ad-1597991801950)]

響應(yīng)報(bào)文與請(qǐng)求報(bào)文的差異在與\color{red}{報(bào)文首部},響應(yīng)報(bào)文首部由:

  • 狀態(tài)行
  • 響應(yīng)首部字段

其中狀態(tài)行

HTTP-Version Status-Code Reason-Phrase CRLF
如:
HTTP/1.1 200 OK
  • HTTP-Version 服務(wù)器HTTP協(xié)議的版本
  • Status-Code 服務(wù)器發(fā)回的響應(yīng)狀態(tài)代碼
  • Reason-Phrase 狀態(tài)代碼的文本描述

狀態(tài)碼類型:

狀態(tài)碼 含義
1xx 指示信息--表示請(qǐng)求已接收,繼續(xù)處理
2xx 客戶端請(qǐng)求成功
3xx 重定向
4xx 客戶端錯(cuò)誤
5xx 服務(wù)端錯(cuò)誤

*注意: 很多人奇怪404狰晚,明明是服務(wù)器地址不存在,為什么是客戶端錯(cuò)缴啡,4xx錯(cuò)誤是指請(qǐng)求有語法錯(cuò)誤或請(qǐng)求無法實(shí)現(xiàn)

常見狀態(tài):

  • 200 OK:客戶端請(qǐng)求成功壁晒。
  • 204 Not Content:正常響應(yīng),沒有實(shí)體业栅。
  • 304 Not Modified: 狀態(tài)未改變 配合(If-Match秒咐、If-Modified-Since谬晕、If-None_Match、If-Range携取、If-Unmodified-Since)
  • 400 Bad Request:客戶端請(qǐng)求有語法錯(cuò)誤攒钳,不能被服務(wù)器所理解。
  • 401 Unauthorized:請(qǐng)求未經(jīng)授權(quán)雷滋,這個(gè)狀態(tài)代碼必須和WWW-Authenticate報(bào)頭域一起使用不撑。
  • 403 Forbidden:服務(wù)器收到請(qǐng)求,但是拒絕提供服務(wù)晤斩。
  • 404 Not Found:請(qǐng)求資源不存在焕檬,舉個(gè)例子:輸入了錯(cuò)誤的URL。
  • 500 Internal Server Error:服務(wù)器發(fā)生不可預(yù)期的錯(cuò)誤澳泵。
  • 503 Server Unavailable:服務(wù)器當(dāng)前不能處理客戶端的請(qǐng)求实愚,一段時(shí)間后可能恢復(fù)正常

響應(yīng)請(qǐng)求首部

分為:

  • 通用首部(General Header)
  • 響應(yīng)首部(Response Header)
  • 實(shí)體首部(Entity Header Fields)

下篇文章中將詳細(xì)分析HTTP報(bào)文的首部字段.

詳細(xì)報(bào)文內(nèi)容請(qǐng)閱讀 HTTP請(qǐng)求報(bào)文和HTTP響應(yīng)報(bào)文HTTP協(xié)議-HTTP響應(yīng)報(bào)文

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市兔辅,隨后出現(xiàn)的幾起案子腊敲,更是在濱河造成了極大的恐慌,老刑警劉巖维苔,帶你破解...
    沈念sama閱讀 221,273評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件碰辅,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡蕉鸳,警方通過查閱死者的電腦和手機(jī)乎赴,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,349評(píng)論 3 398
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來潮尝,“玉大人榕吼,你說我怎么就攤上這事∶闶В” “怎么了羹蚣?”我有些...
    開封第一講書人閱讀 167,709評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長乱凿。 經(jīng)常有香客問我顽素,道長,這世上最難降的妖魔是什么徒蟆? 我笑而不...
    開封第一講書人閱讀 59,520評(píng)論 1 296
  • 正文 為了忘掉前任胁出,我火速辦了婚禮,結(jié)果婚禮上段审,老公的妹妹穿的比我還像新娘全蝶。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,515評(píng)論 6 397
  • 文/花漫 我一把揭開白布抑淫。 她就那樣靜靜地躺著绷落,像睡著了一般。 火紅的嫁衣襯著肌膚如雪始苇。 梳的紋絲不亂的頭發(fā)上砌烁,一...
    開封第一講書人閱讀 52,158評(píng)論 1 308
  • 那天,我揣著相機(jī)與錄音催式,去河邊找鬼函喉。 笑死,一個(gè)胖子當(dāng)著我的面吹牛蓄氧,可吹牛的內(nèi)容都是我干的函似。 我是一名探鬼主播,決...
    沈念sama閱讀 40,755評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼喉童,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼撇寞!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起堂氯,我...
    開封第一講書人閱讀 39,660評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤蔑担,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后咽白,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體啤握,經(jīng)...
    沈念sama閱讀 46,203評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,287評(píng)論 3 340
  • 正文 我和宋清朗相戀三年晶框,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了排抬。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,427評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡授段,死狀恐怖蹲蒲,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情侵贵,我是刑警寧澤届搁,帶...
    沈念sama閱讀 36,122評(píng)論 5 349
  • 正文 年R本政府宣布,位于F島的核電站窍育,受9級(jí)特大地震影響卡睦,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜漱抓,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,801評(píng)論 3 333
  • 文/蒙蒙 一表锻、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧乞娄,春花似錦瞬逊、人聲如沸檐迟。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,272評(píng)論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至溶其,卻和暖如春骚腥,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背瓶逃。 一陣腳步聲響...
    開封第一講書人閱讀 33,393評(píng)論 1 272
  • 我被黑心中介騙來泰國打工束铭, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人厢绝。 一個(gè)月前我還...
    沈念sama閱讀 48,808評(píng)論 3 376
  • 正文 我出身青樓契沫,卻偏偏與公主長得像,于是被迫代替她去往敵國和親昔汉。 傳聞我的和親對(duì)象是個(gè)殘疾皇子懈万,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,440評(píng)論 2 359