一薛躬、下圖為每一次HTTP請求的流程犬庇。對于一個完整的HTTP/1.1的請求和響應(yīng):建立tcp連接 (syn; ack, syn2; ack2; 三個分組握手完成)請求響應(yīng)……請求響應(yīng)關(guān)閉連接 (fin; ack; fin2; ack2 四個分組關(guān)閉連接)僧界。如果請求和響應(yīng)都只有一個分組,那么HTTP/1.1 至少要傳輸11個分組臭挽,才拿到一個分組的數(shù)據(jù)捂襟。而Keep-Alive就可以更充分的利用這個已經(jīng)建立 的連接,避免的頻繁的建立和關(guān)閉連接欢峰,減少網(wǎng)絡(luò)阻塞葬荷。
一次完整的HTTP TCP的 四次握手(可靠連接涨共,所以最后還有一次關(guān)閉告知)
二、HTTP請求全過程:
1闯狱、解析URL ( 瀏覽器 )
2煞赢、DNS查詢 ( 瀏覽器獲取目標(biāo)服務(wù)器的ip )
3、TCP封包哄孤、傳輸 ( 根據(jù)2的步驟獲取到了ip 及 端口照筑,瀏覽器生成套接字,再進(jìn)行與服務(wù)端捂手建立連接瘦陈,傳輸數(shù)據(jù) )
4凝危、服務(wù)器接收請求、響應(yīng)
三晨逝、基于TCP的特性蛾默。每一次TCP封包之后只會傳輸與服務(wù)端進(jìn)行一次HTTP請求。如果當(dāng)請求開啟了keep-alive之后捉貌,在上述的HTTP請求過程的時候支鸡,再TCP封包時候就不需要去進(jìn)行與服務(wù)器握手,省去了改流程帶來的空間與時間問題趁窃。另外每一次的請求結(jié)束之后牧挣,如果keep-alive與服務(wù)還未斷開,那么后面的其他HTTP請求可以繼續(xù)沿用該已經(jīng)與服務(wù)端建立好連接的TCP “通道”(個人理解為一個由瀏覽器緩存的一個通道) 醒陆。
四瀑构、在一個大網(wǎng)頁情況下,keep-alive怎么就保證了網(wǎng)頁的加載速度刨摩?
當(dāng)網(wǎng)頁過大時寺晌,當(dāng)請求的接口或者資源都是來自于同一個域名的時候,如果keep-alive如果為打開狀態(tài)時澡刹,就會創(chuàng)建多個 TCP“通道”呻征,以供其他請求使用,這樣就大大的減少了 很多次的與服務(wù)端建立TCP與關(guān)閉TCP的時間(握手)罢浇。但是這個創(chuàng)建多少個 “TCP通道” 就基于每個瀏覽器本身的對通域名下的并發(fā)量設(shè)置怕犁。( 經(jīng)過調(diào)研,谷歌的并發(fā)為8己莺,IE10 為10,火狐為 6等等....當(dāng)然這些都是基于HTTP 1.1 的 戈轿,HTTP1.0 有點出入)凌受。其實這樣也會帶來一些弊端,當(dāng)所有的資源都加載好了思杯,不需要去用“通道”的時候也會帶來另外一個問題胜蛉,就是占用了服務(wù)端的內(nèi)存消耗挠进,畢竟服務(wù)端還是和客戶端保持著連接的狀態(tài)。在開源apach官網(wǎng)中看到誊册,google 對此進(jìn)行了大量的調(diào)研领突,并且對其進(jìn)行了優(yōu)化,他建議案怯,在引入keep-alive的同時應(yīng)該合理控制Keep-Alive TimeOut這個參數(shù)可以大量的節(jié)約連接的開銷君旦,提高相應(yīng)速度。如果設(shè)置不好嘲碱,在大并發(fā)的情況小金砍,因維持大量連接而使服務(wù)器資源耗盡,而對于目前國內(nèi)大 部分的用戶使用的還是IE6麦锯,7的情況下關(guān)閉Keep-Alive可以充分利用瀏覽器默認(rèn)最大并發(fā)連接數(shù)的好處實現(xiàn)不增加額外的開銷頁面快速的展示恕稠。
五、根據(jù)以上第四點扶欣,同一個域名下瀏覽器本身就做了這種并發(fā)控制鹅巍。那么京東主頁,淘寶主頁的一些圖片資源都已過百料祠,按照6的并發(fā)兩骆捧,如果帶寬不夠,那也肯定達(dá)不到3秒鐘原則术陶,那他們又是怎么做的凑懂,經(jīng)過調(diào)研發(fā)現(xiàn),他們其實就是對于通信這塊在上述第二點中的DNS解析加上瀏覽器并發(fā)控制梧宫,根據(jù)這一特性引入了多域名資源共享機(jī)制接谨。就是一個服務(wù)器申請多個域名,訪問到的是同一個服務(wù)器資源塘匣,來以此騙過DNS脓豪,這樣就輕松實現(xiàn)了一個大網(wǎng)站,有多個域名忌卤,所以就可以同時并發(fā)的去請求扫夜,同時響應(yīng)渲染了。當(dāng)然這會去犧牲一點性能還可以驰徊,加強(qiáng)用戶體驗笤闯,3秒鐘原則。(個人理解)
六棍厂、其實每次連接颗味、互聯(lián)網(wǎng)的目的就是達(dá)到進(jìn)程與進(jìn)程之間的通信。以此來各取其需牺弹,實現(xiàn)互聯(lián)浦马。