HTTP 協(xié)議是基于 TCP/IP,并且使用了請(qǐng)求-應(yīng)答的通信模式,所以性能的關(guān)鍵就在這兩點(diǎn)里。
長(zhǎng)連接
HTTP協(xié)議有兩種連接模式,一種是持續(xù)連接,一種非持續(xù)連接。
(1)非持續(xù)連接指的是服務(wù)器必須為每一個(gè)請(qǐng)求的對(duì)象建立和維護(hù)一個(gè)全新的連接。(2)持續(xù)連接下,TCP 連接默認(rèn)不關(guān)閉,可以被多個(gè)請(qǐng)求復(fù)用。采用持續(xù)連接的好處是可以避免每次建立 TCP 連接三次握手時(shí)所花費(fèi)的時(shí)間。
對(duì)于不同版本的采用不同的連接方式:在HTTP/1.0 每發(fā)起一個(gè)請(qǐng)求,都要新建一次 TCP 連接(三次握手),而且是串行請(qǐng)求,做了無畏的 TCP 連接建立和斷開,增加了通信開銷。該版本使用的非持續(xù)的連接,但是可以在請(qǐng)求時(shí),加上 Connection: keep-a live 來要求服務(wù)器不要關(guān)閉 TCP 連接。在HTTP/1.1 提出了長(zhǎng)連接的通信方式,也叫持久連接。這種方式的好處在于減少了 TCP 連接的重復(fù)建立和斷開所造成的額外開銷,減輕了服務(wù)器端的負(fù)載。該版本及以后版本默認(rèn)采用的是持續(xù)的連接。目前對(duì)于同一個(gè)域,大多數(shù)瀏覽器支持同時(shí)建立 6 個(gè)持久連接。
管道網(wǎng)絡(luò)傳輸
HTTP/1.1 采用了長(zhǎng)連接的方式,這使得管道(pipeline)網(wǎng)絡(luò)傳輸成為了可能。
管道(pipeline)網(wǎng)絡(luò)傳輸是指:可以在同一個(gè) TCP 連接里面,客戶端可以發(fā)起多個(gè)請(qǐng)求,只要第一個(gè)請(qǐng)求發(fā)出去了,不必等其回來,就可以發(fā)第二個(gè)請(qǐng)求出去,可以減少整體的響應(yīng)時(shí)間。但是服務(wù)器還是按照順序回應(yīng)請(qǐng)求。如果前面的回應(yīng)特別慢,后面就會(huì)有許多請(qǐng)求排隊(duì)等著。這稱為隊(duì)頭堵塞。
隊(duì)頭堵塞
HTTP 傳輸?shù)膱?bào)文必須是一發(fā)一收,但是,里面的任務(wù)被放在一個(gè)任務(wù)隊(duì)列中串行執(zhí)行,一旦隊(duì)首的請(qǐng)求處理太慢,就會(huì)阻塞后面請(qǐng)求的處理。這就是HTTP隊(duì)頭阻塞問題。
隊(duì)頭阻塞的解決方案: (1)并發(fā)連接:對(duì)于一個(gè)域名允許分配多個(gè)長(zhǎng)連接,那么相當(dāng)于增加了任務(wù)隊(duì)列,不至于一個(gè)隊(duì)伍的任務(wù)阻塞其它所有任務(wù)。 (2)域名分片:將域名分出很多二級(jí)域名,它們都指向同樣的一臺(tái)服務(wù)器,能夠并發(fā)的長(zhǎng)連接數(shù)變多,解決了隊(duì)頭阻塞的問題。