二、http快取分類
在web瀏覽器中輸出**,具體會發生什麼?
1、 對**進行dns網域名稱解析,獲取相應的ip位址
2、 根據ip位址,找到相應伺服器,發起tcp的三次握手。
3、 建立tcp連線後,發起http請求。
4、伺服器響應http請求, 瀏覽器獲取html**
5、瀏覽器解析html**,並請求html中的資源
6、瀏覽器渲染頁面
7、伺服器關閉tcp請求
dns網域名稱解析
1、 首先搜尋瀏覽器自身的dns快取。
2、 如果瀏覽器自身快取中沒有找到,那麼瀏覽器就會搜尋系統自身的dns快取
3、 如果還沒找到,嘗試從hosts檔案中去查詢
4、前面三個過程都沒有找到的情況下、就遞迴去網域名稱伺服器中查詢
tcp的三次握手
1、tcp伺服器程序先建立傳輸控制塊tcb,時刻準備接受客戶程序的連線請求,此時伺服器就進入了listen(監聽)狀態;
2、tcp客戶程序也是先建立傳輸控制塊tcb,然後向伺服器發出連線請求報文。
3、 tcp伺服器收到請求報文後,如果同意連線,則發出確認報文。
4、tcp客戶程序收到確認後,還要向伺服器給出確認。
5、當伺服器收到客戶端的確認後也進入established(已確認)狀態,此後雙方就可以開始通訊了。
tcp的四次揮手
1、客戶端程序發出連線釋放報文,並且停止傳送資料。
2、 伺服器收到連線釋放報文,發出確認報文。
3、 客戶端收到伺服器的確認請求後,此時,客戶端就進入fin-wait-2(終止等待2)狀態,等待伺服器傳送連線釋放報文。
4、伺服器將最後的資料傳送完畢後,就向客戶端傳送連線釋放報文。
5、客戶端收到伺服器的連線釋放報文後,必須發出確認。
6、伺服器只要收到了客戶端發出的確認,立即進入closed狀態。
web 快取大致分為 資料庫快取、服務端快取(**伺服器快取、cdn快取)、瀏覽器快取。
http快取分為強快取和協商快取,瀏覽器載入乙個頁面的簡單流程如下:
1、瀏覽器先根據這個資源的http頭資訊來判斷是否命中強快取。如果命中則直接載入快取中的資源,並不會將請求傳送到伺服器
2、如果未命中強快取,則瀏覽器會將資源載入請求傳送到瀏覽器。伺服器來判斷短瀏覽器本地快取是否失效。若可以使用,則伺服器並不會返回資源資訊,瀏覽器繼續從快取載入資源。
3、如果未命中協商快取,則伺服器會將完整的資源返回給瀏覽器,瀏覽器載入新資源,並更新快取。
簡單理解就是,瀏覽器不用傳送請求到伺服器,就能拿到快取檔案。命中強快取時,在chrome的開發者工具中可以看到http的返回碼是200,在size列會顯示為(from cache)
強快取時利用http的返回中的expires或者cache- control兩個欄位來控制的,用來表示自願的快取時間。
expires
快取過期時間,用來指定組員到期的時間,是伺服器端的具體的時間點,也就是說,expires = max- age + 請求時間,需要和last-modified結合使用。但在上面我們提到過,cache-conrorl的優先順序更高。expires是wen伺服器響應訊息頭欄位,在響應http請求時告訴瀏覽器在過期時間前瀏覽器可以直接從瀏覽器緩訪問資料,而無需再次請求。
該字段會返回乙個事件,這個時間代表著這個資源的失效時間。這種方式有乙個明顯的缺點,由於失效時間是乙個絕對時間,所以當客戶端本地時間被修改後,伺服器與客戶端時間偏差變大,會導致快取混亂。於是發展出了cache-control。
cache-control
cache-control是乙個相對時間,例如cache-control:3600,代表資源的有效時間是3600秒。由於是相對時間,並且都與客戶端時間比較,所以伺服器與客戶端時間偏差也不會導致問題。
cache-control與expires可以在服務端配置同時啟用或者啟用任意乙個,同時啟用的時候cache-control優先順序高。
cache-control可以由多個字段組合而成,主要有一下幾個取值:
1.max-age指定乙個時間長度,在這個時間段內快取是有效的,單位是s 。 例如設定cache-control:max-age=31536000,也就是說快取有效期為(31536000/24/60*60)天,第一次訪問這個資源的時候,伺服器端也返回了expires欄位,並且過期時間是一年後。
2.s-maxage同max-age,覆蓋max-age、expires,但僅適用於共享快取,在私有快取中被忽略。
3.public表示響應可以被任何物件(傳送請求的客戶端、**伺服器等等)快取。
4.private表示響應只能被單個使用者(可能是作業系統使用者、瀏覽器使用者)快取,是非共享的,不能被**伺服器快取。
5.no-cache強制所有快取了該響應的使用者,在使用已快取的資料前,傳送帶驗證器的請求到伺服器。
6.no-store禁止快取,每次請求都要想伺服器重新獲取資料。
7.must-revalidate指定如果頁面時過期的,則去伺服器進行獲取。這個指令並不常用,就不做過多的討論。
若未命中強快取,則瀏覽器會將請求傳送至伺服器。伺服器根據http頭資訊中的last-mondify、if-modify-since或者etag/if-none-match來判斷是否命中協商快取。如果命中,則http返回碼為304,瀏覽器從快取中載入資源。
last-mondify/if-mondify-since
瀏覽器第一次請求乙個資源的時候,伺服器返回的header中會加上last-modify,last-modify是乙個時間標識該資源的最後修改時間。
當瀏覽器再次請求該資源時,傳送請求頭中會包含if-modify-since,該值為快取之前返回的last-modify。伺服器收到if-modify-since後,根據資源的最後修改時間判斷是否命中快取。
如果命中快取,則返回http304,並且不會返回資源內容,不會返回last-mindufy。由於對比的服務端時間,所以客戶端與服務端時間差距不會導致問題。但是有時候通過最後修改時間來判斷資源是否修改還是不太準確。於是出現了etag/if-none-match
etag/if-none-match
與last-mondify/if-modify-since不同的是,etag/if-none-mactch返回的是乙個校驗碼。etag可以保證每乙個資源時唯一的,資源變化都會導致etag變化。etag值得變更則說明資源狀態已經被修改。伺服器根據瀏覽器上傳送的if-none-match值來判斷是否命中快取。
http快取控制
1.http快取能夠幫助伺服器提高併發效能,很多資源不需要重複請求直接從瀏覽器中拿快取。
2.http快取分類:強快取 協商快取
3.強快取通過expires和cache-control控制;協商快取通過last-modify和etag控制
4.為什麼有expires又需要cache-control?
因為expires有個伺服器和瀏覽器時間不同步的問題
expires是絕對時間 cache-control是相對時間
5.last-modify和etag
last-modify 它是有個精度問題,精確到秒。
e-tag 眉頭精度問題 是要檔案改變 e-tag值就改變。
http相關知識點
http是一種基於tcp協議的無狀態的應用層協議,1.1加入keepalive機制 由三部分組成 請求行 訊息報頭 請求體1.常用的http方法有哪些只要一端不斷開,tcp不會斷開 由於是通過pipeline,一次可以傳送多個請求 請求行包含請求方法 uri http版本資訊 通用頭請求頭 acce...
http 相關 知識點
size large http請求的header中有乙個referer屬性 size http請求的header中有乙個referer屬性,這個屬性的意思就是如果當前請求是從別的頁面鏈結過來的,那個屬性就是那個頁面的url,如果請求的url是直接從瀏覽器位址列輸入的就沒有這個值。在servlet中可...
HTTP協議相關知識點
1.http協議 hypertext transfer protocol,超文字傳輸協議 是網際網路上應用最為廣泛的一種網路傳輸協議,所有的www檔案都必須遵守這個標準。2.從1990年開始就在www上廣泛應用,是現今在www上應用最多的協議,目前版本為1.1。3.http基於tcp ip通訊協議來...