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