Http事務(wù)的時延:
(1)TCP建立連接握手
(2)TCP慢啟動擁塞控制
(3)數(shù)據(jù)聚集的Nagle算法
(4)用于捎帶確認(rèn)的TCP延遲確認(rèn)算法
(5)TIME_WAIT時延和端口耗盡
TCP握手時延:三次握手+四次揮手帶來時延膜毁;
TCP慢啟動時延:一開始會限制發(fā)送的分組的速度昭卓,避免擁塞控制;新建立的連接的傳輸速度會小于交換過一定量數(shù)據(jù)的連接瘟滨,這個會帶來時延候醒;
Nagle算法:TCP發(fā)送大量包含少量數(shù)據(jù)的分組,網(wǎng)絡(luò)的性能就會下降杂瘸;Nagle算法試圖在發(fā)送分組之前倒淫,會將大量的TCP分組捆綁在一起,以提高網(wǎng)絡(luò)的效率败玉;這樣就會導(dǎo)致小的HTTP分組無法填滿一個分組敌土,可能會一直等待其它數(shù)據(jù)的到來镜硕,導(dǎo)致時延;
延遲確認(rèn):確認(rèn)之后才能繼續(xù)發(fā)送報文返干;由于確認(rèn)報文非常的小兴枯,所以TCP允許把這個確認(rèn)捎帶在數(shù)據(jù)分組之中,而不是直接的發(fā)送這個確認(rèn)矩欠;延遲確認(rèn)算法會在一個時間之內(nèi)财剖,將確認(rèn)放在緩沖區(qū)之中,以尋找能夠捎帶它的分組癌淮,如果在那段時間內(nèi)沒有輸出分組躺坟,就將確認(rèn)以單獨的分組發(fā)送;
TIME_WAIT時延:2MSL
串行處理事務(wù)時延:
一個頁面嵌入了三張圖片乳蓄,需要發(fā)起四個Http請求咪橙;
并行連接:通過多條TCP連接發(fā)起并發(fā)的HTTP請求;
并行連接可能會提高頁面的加速度:時延重疊栓袖;如果單條連接沒有充分利用帶寬匣摘,就可以將其未用的帶寬分配來裝載其它對象;
并行連接不一定快:帶寬不足裹刮,導(dǎo)致每條連接都會以較慢的速度去加載音榜;大量連接還會消耗很多內(nèi)存,會導(dǎo)致服務(wù)器的性能下降捧弃;
并行連接的缺點:
每個事務(wù)都會打開/關(guān)閉一條連接赠叼,耗費時間和帶寬;
由于TCP的慢啟動特性的存在违霞,每條新連接性能的都會下降嘴办;
并行連接數(shù)是有限的;
持久連接:允許HTTP設(shè)備在事務(wù)處理結(jié)束之后將TCP連接保持在打開狀態(tài)买鸽,以便未來的HTTP請求重用現(xiàn)在的連接涧郊;在事務(wù)處理結(jié)束之后仍然保持在打開狀態(tài)的TCP連接叫做持久連接;非持久連接會在事件處理結(jié)束之后關(guān)閉,持久連接會在不同的事務(wù)之間保持打開狀態(tài)眼五;
持久連接的優(yōu)點:
降低時延和連接建立的開銷妆艘;
將連接保持在已經(jīng)調(diào)諧的狀態(tài);
減少了打開連接的潛在數(shù)量看幼;
持久連接+并行連接:
少量并行連接+持久連接批旺;
HTTP/1.0+keep-alive連接:
(1)客戶端通過Connection:keep-alive首部發(fā)送給服務(wù)端;
(2)服務(wù)器響應(yīng)首部包含相同的Connection:keep-alive首部诵姜;
(3)如果服務(wù)器響應(yīng)沒有Connection:keep-alive首部汽煮,客戶端就認(rèn)為服務(wù)器不支持keep-alive,會在處理完事務(wù)后關(guān)閉連接;
持久連接的方式:HTTP/1.0+keep-alive連接暇赤;
keep-alive選項:
keep-alive選項只是請求將連接保持在活躍狀態(tài)心例,發(fā)送端和接收端并不一定同意進行keep-alive會話;可以在任意時刻關(guān)閉keep-alive連接翎卓;
keep-alive首部是可選的契邀,但是只有在提供Connection:keep-alive首部才能使用它;下面的實例 max,timeout都是服務(wù)器返回的失暴;表明服務(wù)器最多還會為5個事務(wù)保持連接狀態(tài)坯门,并且打開狀態(tài)在連接空閑之后,最多保持120s
HTTP/1.1持久連接:
(1)默認(rèn)持久連接
(2)要在事務(wù)處理完之后關(guān)閉連接逗扒,必須顯示的在報文中添加一個Connection:close首部
持久連接的限制和規(guī)則:
發(fā)送了Connection:close首部后古戴,客戶端就無法在那條連接上發(fā)送更多的請求了;
如果客戶端不想在某條連接上發(fā)送請求了矩肩,就應(yīng)該發(fā)送Connection:close首部现恼;
只有連接上所有報文都是正確的(實體部分長度==Content-length),連接才能持久黍檩;
HTTP/1.1可以在任意時刻關(guān)閉連接叉袍;
管道化連接:
HTTP/1.1可以在持久連接上選擇使用請求管道;在響應(yīng)到達之前刽酱,可以將多條請求放入隊列喳逛;當(dāng)?shù)谝粭l請求到達時u,可以發(fā)送第二條連接棵里;
管道化連接限制:
客戶端無法確認(rèn)是持久連接润文,就不應(yīng)該使用管道;
必須按照和請求相同的順序來回送HTTP響應(yīng)殿怜;
HTTP客戶端必須做好連接隨時關(guān)閉的準(zhǔn)備典蝌,還要準(zhǔn)備好重新發(fā)送未完成的請求;
TCP關(guān)閉:
半關(guān)閉:shutdown()
全關(guān)閉 : close()