從輸入URL地址到看到頁面,中間都經(jīng)歷了什么.

image.png

1.第一步url解析

  • 地址解析(http默認端口號:80,https默認端口號:443,F(xiàn)TP默認端口號:21,一個服務器可以存放多個項目,服務器根據(jù)端口號查找對應的項目服務.返回給客戶端)


    image.png
  • url編碼(防止中文、或者地址出現(xiàn)亂碼,可以進行字符編碼,服務器解碼).
//對整個URL編碼:處理空格,中文字符可以,參數(shù)為url無效
encodeURL/decodeURL
//對傳遞的參數(shù)信息來編碼,空格特殊字符都可以轉(zhuǎn)碼
encodeURLComponent/decodeURLComponent
  • URI/URL/URN的區(qū)別

2.第二步瀏覽器查找當前url是否存在緩存,并比較緩存是否過期。緩存檢查

1.兩種情況
1-1.沒有設置緩存,本地也沒有緩存,需要向服務器進行請求.
1-2.本地設置緩存,去查看緩存是否過期,沒有過期,向本地緩存讀取.

*緩存有兩種:強緩存、協(xié)商緩存.
先檢查是否存在強緩存

  • 有,且未失效,走強緩存.

  • 如果沒有,或者失效,檢查是否存在協(xié)商緩存.

  • 如果協(xié)商緩存有,直接拿協(xié)商緩存的數(shù)據(jù)

  • 如果協(xié)商緩存沒有,直接正常請求向服務器請求最新數(shù)據(jù).

  • 緩存位置(緩存是后臺配置,瀏覽器幫助實現(xiàn),前端不需要寫代碼)
    1.Memary Cache :內(nèi)存緩存.相當于內(nèi)存條(緩存的存放位置)特點:瀏覽器關(guān)閉緩存清除.
    2.Disk Cache:硬盤緩存.特點瀏覽器關(guān)閉,再打開依然可以讀取到緩存.

打開網(wǎng)頁:查找硬盤緩存是否有匹配,如果有則使用,沒有則發(fā)送網(wǎng)絡請求,
普通刷新:因tab沒有關(guān)閉,此時內(nèi)存緩存是可用的,會被優(yōu)先使用。如果沒有才是硬盤緩存.
強制刷新:瀏覽器不使用緩存哪怕本地有緩存也不管,因此發(fā)送的請求頭部均帶有Cache-control:no-cache,服務器直接返回200和最新內(nèi)容.

頁面第一次打開->內(nèi)存緩存(Memary-Cache)->頁面關(guān)閉->強制給硬盤緩存存放一份->頁面再次打開->會從硬盤緩存(Disk-Cache)直接讀取內(nèi)容返回無需請求.

1.強緩存(html頁面一般不做強緩存,返回的狀態(tài)碼:200(from memory cache))

  • http1.0用expires用來設定緩存過期時間,用來指定資源到期時間.
  • http1.1用的是Cache-Control(max-age=2592000,第一次拿到資源后的30天內(nèi),再次發(fā)送請求,讀取緩存中的信息.)
  • 兩者同時存在的話 Cache-Control優(yōu)先級大于expries

強緩存原理:

  • 強緩存的問題
    如果服務器文件更新了,但是本地還是有強緩存,拿不到最新的信息.
    解決方案:
    1.html頁面一般不做強緩存.
    2.webpack的hash值.服務器更新資源后讓資源名稱和之前不一樣.這樣頁面導入全新資源.
    舊:index.xxxxx.js(緩存)
    新:index.cdcdc.js (未緩存從服務器讀取最新的.)
    3.當文件更新后,在html導入的時候,設置一個后綴名,后綴可以設置一個時間戳.
    <script :src="xxxx.js?時間戳">
    4.協(xié)商緩存也可以解決.

2.協(xié)商緩存(強緩存沒有,或者失效后,不管你有沒有緩存,瀏覽器都會攜帶緩存標識,向服務器端發(fā)送請求)。

  • http1.0 Last-Modified(記錄當前資源最后更新時間)
  • http1.1 ETag(記錄標識)
  • Last-Nodified/ETag協(xié)商緩存就是在強緩存失效后,瀏覽器攜帶緩存標識,由服務器根據(jù)緩存標識決定使用緩存的過程.
    沒更新返回:304,通知客戶端讀取緩存信息,
    更新過返回:200和最新資源,已經(jīng)Last-Modified/ETag

強緩存與協(xié)商緩存區(qū)別
協(xié)商緩存總是發(fā)起請求與服務器溝通.不管有沒有緩存.
強緩存性能比協(xié)商緩存性能好很多.
兩種只針對于靜態(tài)資源文件,而且不是經(jīng)常更新的.

3.數(shù)據(jù)緩存,需要localStorage、vuex或者redux

3.DNS解析URL對應的IP(將服務器地址,轉(zhuǎn)換成外網(wǎng)地址)域名解析 域名 外網(wǎng)IP

通過域名->找到外網(wǎng)IP->找到服務器地址.

DNS也是有緩存的,如果之前解析過會在本地有緩存(不一定,也是有周期的).

  • 遞歸查找(本地查詢)
  • 迭代查找 (依次遍歷每臺服務器)

DNS優(yōu)化:
1.減少DNS請求(一個頁面少用不同的域名,資源盡量都放在相同的服務器上,項目中不會這么干,項目中會將不同的資源分布在不同的服務器上)控制臺查看Source查看不同的域名.不同的資源服務器,要求不一樣,一般公司用的是服務器分布式.同一個源http可以同時發(fā)送4-7個請求,可以提高并發(fā)性.
2.DNA預獲取

//還沒有加載DOM提前發(fā)送請求
<link rel="dns-prefetch herf="xxxx">

4.根據(jù)IP建立TCP連接(三次握手)

1.建立連接通道

5.HTTP發(fā)起請求(傳輸數(shù)據(jù))

6.服務器處理請求,瀏覽器接收HTTP響應

7.渲染頁面,構(gòu)建DOM樹.

8.關(guān)閉TCP連接(四次揮手)

9.產(chǎn)品性能優(yōu)化方案

  • http網(wǎng)絡層優(yōu)化
  • 代碼編譯層優(yōu)化webpack
  • 代碼運行層優(yōu)化 html/css+javascript+vue/react(虛擬DOM)
  • 安全優(yōu)化xss+csrf
  • 數(shù)據(jù)埋點及性能監(jiān)控

10.CRP(關(guān)鍵渲染路徑)

11.TCP/IP

  • TCP建立客戶端與服務器端的傳輸通道(相當于快遞傳送的路)
  • IP主機地址,根據(jù)IP找到主機地址.
  • HTTP傳輸協(xié)議(相當于快遞員,http/https加密協(xié)議,需要證書/ftp傳輸大文件)
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內(nèi)容