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