這也是一個經典的面試題,不管前端仍是後端均可能都會遇到,知識點相對來講也比較多,考察得比較全面的。最近也看了不少瀏覽器相關的文章,結合起來,在這裏簡單梳理總結下。同時,感謝瀏覽器這個偉大的發明。html
下面是我簡單粗糙畫的一張流程圖:前端
過程分爲下方几個流程:git
相關知識點:github
URLweb
DNS解析、IP地址面試
TCP創建鏈接、三次握手後端
服務器處理、HTTP請求、狀態碼瀏覽器
瀏覽器渲染bash
TCP鏈接結束服務器
URL(Uniform Resource Locator),統一資源定位符,用於定位互聯網上資源,俗稱網址。
通常遵照下面的語法規則:
scheme://host.domain:port/path/filename
各部分解釋以下:
爲何須要域名解析? 瀏覽器並不能直接經過域名找到對應的服務器,而是要經過 IP 地址。固然也能夠直接IP地址去訪問,可是以人類的記憶習慣去記住各個網站的IP地址...那,我只能祝你幸福。
先說下IP地址: IP 地址是一個 32 位的二進制數,好比 127.0.0.1 爲本機 IP。它的做用就是便於記憶和溝通的一組服務器的地址。域名就至關於 IP 地址的別名。 舉個方便理解例子:好比一個經度:113.35 緯度:23.12 的地點,這樣很是不方便記憶,可是這個地方有個地名叫廣州天河,那個這就很符合人類的認知了。例子裏面的經緯度就至關於IP地址,廣州天河就至關於域名。
什麼是域名解析 DNS 協議提供經過域名查找 IP 地址,或逆向從 IP 地址反查域名的服務。DNS 是一個網絡服務器,咱們的域名解析簡單來講就是在 DNS 上記錄一條信息記錄。
例如 xiaoyexiang.com 120.77.215.71(服務器外網IP地址)80(服務器端口號)
複製代碼
在客戶端發送數據以前會發起 TCP 三次握手用以同步客戶端和服務端的序列號和確認號,並交換 TCP 窗口大小信息。
網上也有不少方便易解的過程,這裏我直接引用:
創建TCP鏈接後,開始向Web服務器發送HTTP請求報文。
POST /chapter17/user.html HTTP/1.1
// 以上代碼中「POST」表明請求方法,「/chapter17/user.html」表示 URL,「HTTP/1.1」表明協議和協議的版本。如今比較流行的是 Http1.1 版本
複製代碼
一個典型的 http request header 通常須要包括請求的方法,例如 GET 或者 POST 等,不經常使用的還有 PUT 和 DELETE 、HEAD、OPTION以及 TRACE 方法,通常項目中,瀏覽器只會發起 GET 或者 POST 請求。
此處注意: 這裏可能會發生用戶輸入的爲「baidu.com/」而非「https:/…參見文章。
服務器接受到請求後,對相應的請求做出相應的處理,處理完成後並做出相應的http 響應報文
** 響應行包含:協議版本,狀態碼,狀態碼描述 **
狀態碼規則以下:
此處對於服務器處理,我的表示瞭解很少
不作過多解釋,搬我以爲網上比較簡單易懂的
瀏覽器拿到響應文本 HTML 後,接下來介紹下瀏覽器渲染機制
瀏覽器解析渲染頁面分爲一下五個步驟:
當數據傳送完畢,須要斷開 tcp 鏈接,此時發起 tcp 四次揮手。
在web2.0時代,即便在頁面渲染後客戶端仍是持續與服務器端通訊,這個模式被稱爲AJAX,是「Asynchronous JavaScript And XML」的縮寫。
JS的解析是由瀏覽器中的JS解析引擎完成的。JS是單線程運行,也就是說,在同一個時間內只能作一件事,全部的任務都須要排隊,前一個任務結束,後一個任務才能開始。可是又存在某些任務比較耗時,如IO讀寫等,因此須要一種機制能夠先執行排在後面的任務,這就是:同步任務(synchronous)和異步任務(asynchronous)。JS的執行機制就能夠看作是一個主線程加上一個任務隊列(task queue)。同步任務就是放在主線程上執行的任務,異步任務是放在任務隊列中的任務。全部的同步任務在主線程上執行,造成一個執行棧;異步任務有了運行結果就會在任務隊列中放置一個事件;腳本運行時先依次運行執行棧,而後會從任務隊列裏提取事件,運行任務隊列中的任務,這個過程是不斷重複的,因此又叫作事件循環(Event loop)。
瀏覽器在解析過程當中,若是遇到請求外部資源時,請求過程是異步的,並不會影響HTML文檔進行加載,可是當文檔加載過程當中遇到JS文件,HTML文檔會掛起渲染過程,不只要等到文檔中JS文件加載完畢還要等待解析執行完畢,纔會繼續HTML的渲染過程。緣由是由於JS有可能修改DOM結構,這就意味着JS執行完成前,後續全部資源的下載是沒有必要的,這就是JS阻塞後續資源下載的根本緣由。CSS文件的加載不影響JS文件的加載,可是卻影響JS文件的執行。JS代碼執行前瀏覽器必須保證CSS文件已經下載並加載完畢。