http連線的效能優化
並行連線(能夠同一時候和多台server建立http連線)
持久連線
管道化連線
復用的連線
並行連線
長處:並行連線能夠在頻寬資源充足的情況下同一時候建立多個http連線,加快頁面的載入速度。
缺點:並行連線在頻寬資源不足的情況下會是連線競爭資源。效率反而下降。同一時候建立多條連線會消耗大量記憶體,
對server來說。大量的使用者產生大量的連線可能會超過server的處理能力,所以server一般可以關閉來自特定client的超量連線。
持久連線(keep-alive/persistent)
長處:重用已對目標server開啟的空暇持久連線,就能夠避免緩慢的連線建立階段。同一時候,已經開啟的連線還能夠避免慢啟動的擁塞適應階段。以便更快的進行傳輸資料。
如今的web應用程式都是並行連線+持久連線的形式。
管道化連線:
能夠同意在持久連線上可選的使用請求管道。相當於流水線的功能。在對應到達之前,能夠將多條請求放入佇列。
管道化連線的幾條限制:
假設連線不是持久的,就不應該使用管道
必須依照與請求同樣的順序回送http響應。http報文中沒有序列號標籤。因此假設收到的響應失序了。那麼就沒辦法將其與請求匹配起來了。
httpclient必須做好連線會在隨意時刻關閉的準備,還要準備重發全部未完畢的管道化請求。
httpclient不應該用管道化的方式傳送會產生***的請求(post請求)。
比方post是要買一本書,再執行一次就又買了一本書,顯然是不能執行的。
http連線的關閉
http的通訊是建立在tcp連線之上的,所以http連線的關閉事實上就是tcp連線的關閉。連線關閉分為
全然關閉和半關閉,
close會同一時候關閉輸入和輸出通道。shutdown僅僅會單獨關閉輸入或者輸出通道。
tcp關閉及重製錯誤
當一端關閉了輸出通道。還有一端的對等實體會在從其緩衝區中讀出資料之後收到fin(說明流結束了),同一時候該對等實體會向用用程式傳送乙個檔案結束符,這樣它就知道你將連線關閉了。此時對端實體的應用程式會傳送乙個fin,最後就是tcp連線全然斷開。
關閉輸入通道比較危急,除非你知道還有一端不打算再傳送其它資料了
。假設還有一端向你已關閉的輸入通道傳送資料,作業系統就會向還有一端的機器回送一條tcp「連線被對端重置」的報文。
(重置報文會被當做非常嚴重的錯誤來處理,直接刪除對端還未讀取的全部快取資料。使應用程式產生錯誤)
主動關閉的一方在為對方的fin傳送ack之後進入
time_wait
狀態。
time_wait也稱為2msl等待狀態。每乙個詳細的tcp實現必須選擇乙個報文段最大生成時間msl。它是不論什麼報文段被丟棄前在網路內的最長時間
。我們知道這個時間時有限的,由於tcp報文是以ip資料報在網路內傳輸,而ip資料報則有限制其生存時間的ttl欄位。
為什麼要設定為2msl呢?由於這樣能夠再次傳送最後的ack避免ack丟失。
這樣的2msl等待的還有乙個結果是這個tcp連線在2msl等待期間。定義這個連線的插口(clientip和port,服務端ip和port)不能被使用,這個連線僅僅能在2msl等待結束後才幹再次使用。
在連線處於2msl等待時,不論什麼遲到的報文段將被丟棄。由於處於2msl等待的、由該插
口對(socket pair) 定義的連線在這段時間內不能被再用。
fin-wait_2狀態:
fin-wait_2狀態表示本端已經傳送fin同一時候接收到對端的ack,等待對端傳送fin。
可是假設對端一直不傳送fin,那麼狀態是不是會一直持續下去呢?不會的,假設執行主動關閉的應用程式想執行全關閉,那麼會設定乙個定時器,假設時間超過10分75秒,tcp進去closed狀態。
正常關閉:
總之,實現正常關閉的應用程式首先應該關閉他們的輸出通道,然後等待連線還有一端的對等實體關閉它的輸出通道,當兩端都告訴對方他們不再傳送不論什麼資料之後。連線會被全然關閉。而不會有重置的危急。
可是無法確保對等實體實現半關閉。因此想要正常的關閉連線的應用程式應該先半關閉輸出通道,
然後週期性的檢查其輸入通道的狀態(查詢資料。或流的結尾),如收到資料結尾標記,能夠結束該連線。
假設在一定的時間區間內沒有關閉輸入通道。應用程式能夠強制關閉連線,以節省資源
(記憶體和socket)。
長連線長連線的傳輸資料完畢識別
使用長連線之後,client、服務端怎麼知道本次傳輸結束呢?分為兩種:
推斷資料傳輸是否達到了content-length僅僅是的大小
動態生成的檔案沒有content-length,它是分塊傳輸(chunked)。分塊傳輸的資料最後會有乙個空的chunked塊。表示本次傳輸的結束。很多其它請參考
http keep-alive模式
長連線的過期時間
client的長連線不可能無限期的拿著,由下面幾種關閉長連線的方式:
server會告訴client超時時間,在響應頭部中keep-alive中指明timeout時間或者max最大事務數
client或者服務端斷開連線(關閉或者下線),主動發起四次握手
參考資料:
1.《http權威指南》
2.
HTTP 連線的優化技術
參考 http權威指南 http允許客戶端和最終源端伺服器之間存在一串http中間實體 快取記憶體等 可以從客戶端開始,逐跳地將http報文經過這些中間裝置,到源端伺服器上。或者進行方向傳輸 在某些情況下,兩個相鄰的http應用程式會為它們共享的連線應用一組選項,http的connection首部欄...
http 連線復用
定義 http 1.0每次請求都需要建立新的tcp連線,連線不能復用。http 1.1新的請求可以在上次建立的tcp連線之上傳送,連線可以復用。優點 減少重複進行tcp三次握手的開銷,提高效率。注意 在同乙個tcp連線中,新的請求需要等上次請求收到響應後,才能傳送。實現 主要的思路 在傳送http的...
HTTP效能優化
http處於應用層 tcp處於傳輸層 ip處於網路層 1 http將所需要傳輸的資料以流的形式傳遞給tcp程式 2 tcp解析資料中的ip位址和埠號,將資料流分割成資料段,並新增上tcp段首部,如tcp握手 ack sync等 源埠,目的埠 tcp校驗和等 3 tcp程式將包裝好的tcp資料段叫給i...