從開發&運維角度方面來看,整體來講分爲如下幾個過程:css
URL(Uniform Resource Locator),統一資源定位符,用於定位互聯網上資源,俗稱網址。html
scheme: // host.domain:port / path / filename ? abc = 123 # 456789
node
scheme - 定義因特網服務的類型。常見的協議有 http、https、ftp、file,
其中最多見的類型是 http,而 https 則是進行加密的網絡傳輸。
host - 定義域主機(http 的默認主機是 www)
domain - 定義因特網域名,好比 baidu.com
port - 定義主機上的端口號(http 的默認端口號是 80)
path - 定義服務器上的路徑(若是省略,則文檔必須位於網站的根目錄中)。
filename - 定義文檔/資源的名稱
query - 即查詢參數
fragment - 即 # 後的hash值,通常用來定位到某個位置
複製代碼
在瀏覽器輸入網址後,首先要通過域名解析,由於瀏覽器並不能直接經過域名找到對應的服務器,而是要經過 IP 地址。nginx
IP 地址是指互聯網協議地址,是 IP Address 的縮寫。IP 地址是 IP 協議提供的一種統一的地址格式,
它爲互聯網上的每個網絡和每一臺主機分配一個邏輯地址,以此來屏蔽物理地址的差別。
複製代碼
DNS 協議提供經過域名查找 IP 地址,或逆向從 IP 地址反查域名的服務。
DNS 是一個網絡服務器,咱們的域名解析簡單來講就是在 DNS 上記錄一條信息記錄。
複製代碼
DNS域名解析分爲遞歸查詢和迭代查詢兩種方式,現通常爲迭代查詢。
複製代碼
DNS緩存 DNS存在着多級緩存,從離瀏覽器的距離排序的話,有如下幾種: 瀏覽器緩存,系統緩存,路由器緩存,IPS服務器緩存,根域名服務器緩存,頂級域名服務器緩存,主域名服務器緩存。
web
DNS負載均衡(DNS重定向) DNS負載均衡技術的實現原理是在DNS服務器中爲同一個主機名配置多個IP地址,在應答DNS查詢時, DNS服務器對每一個查詢將以DNS文件中主機記錄的IP地址按順序返回不一樣的解析結果,將客戶端的訪問 引導到不一樣的機器上去,使得不一樣的客戶端訪問不一樣的服務器,從而達到負載均衡的目的。
apache
DNS Prefetch 是一種 DNS 預解析技術。當你瀏覽網頁時,瀏覽器會在加載網頁時對網頁中的域名進行解析緩存,這樣在你單擊當前網頁中的鏈接時就無需進行 DNS 的解析,減小用戶等待時間,提升用戶體驗。
客戶端發送一個帶 SYN=1,Seq=X 的數據包到服務器端口(第一次握手,由瀏覽器發起,告訴服務器我要發送請求了)
後端
服務器發回一個帶 SYN=1, ACK=X+1, Seq=Y 的響應包以示傳達確認信息(第二次握手,由服務器發起,告訴瀏覽器我準備接受了,你趕忙發送吧)
瀏覽器
客戶端再回傳一個帶 ACK=Y+1, Seq=Z 的數據包,表明「握手結束」(第三次握手,由瀏覽器發送,告訴服務器,我立刻就發了,準備接受吧)
緩存
TCP 三次握手結束後,開始發送 HTTP 請求報文。bash
爲避免篇幅過長,http協議、緩存等相關內容請參閱:
從HTTP到WEB緩存
每臺服務器上都會安裝處理請求的應用——Web server。常見的web server產品有apache、nginx、IIS、Lighttpd等。
僞裝我是一個傳統的MVC模型,RD同窗請無視
用戶界面 (User Interface) - 包括地址欄、後退/前進按鈕、書籤目錄等,也就是你所看到的除了用來顯示你所請求頁面的主窗口以外的其餘部分
瀏覽器引擎 (Browser Engine) - 用來查詢及操做渲染引擎的接口
渲染引擎 (Rendering Engine) - 用來顯示請求的內容,例如,若是請求內容爲html,它負責解析html及css,並將解析後的結果顯示出來
網絡 (Networking) - 用來完成網絡調用,例如http請求,它具備平臺無關的接口,能夠在不一樣平臺上工做
JS解釋器 (JS Interpreter) - 用來解釋執行JS代碼
UI後端 (UI Backend) - 用來繪製相似組合選擇框及對話框等基本組件,具備不特定於某個平臺的通用接口,底層使用操做系統的用戶接口
數據存儲 (DB Persistence) - 屬於持久層,瀏覽器須要在硬盤中保存相似cookie的各類數據,HTML5定義了web database技術,這是一種輕量級完整的客戶端存儲技術
複製代碼
瀏覽器是多進程的,有一個主控進程,以及每個tab頁面都會新開一個進程(某些狀況下多個tab會合並進程)
進程可能包括主控進程,插件進程,GPU,tab頁(瀏覽器內核)等等
每個tab頁面能夠看做是瀏覽器內核進程,而後這個進程是多線程的,它有幾大類子線程:
1. 解析HTML,構建DOM樹
2. 解析CSS,生成CSS規則樹
3. 合併DOM樹和CSS規則,生成render樹
4. 佈局render樹(Layout/reflow),負責各元素尺寸、位置的計算
5. 繪製render樹(paint),繪製頁面像素信息
複製代碼
以webkit內核爲例
簡單的理解,這一步的流程是這樣的:瀏覽器解析HTML,構建DOM樹。 解析HTML到構建出DOM固然過程能夠簡述以下:
Bytes → characters → tokens → nodes → DOM
複製代碼
其中比較關鍵的幾個步驟
1. Conversion轉換:瀏覽器將得到的HTML內容(Bytes)基於他的編碼轉換爲單個字符
2. Tokenizing分詞:瀏覽器按照HTML規範標準將這些字符轉換爲不一樣的標記token。每一個token都有本身獨特的含義以及規則集
3. Lexing詞法分析:分詞的結果是獲得一堆的token,此時把他們轉換爲對象,這些對象分別定義他們的屬性和規則
4. DOM構建:由於HTML標記定義的就是不一樣標籤之間的關係,這個關係就像是一個樹形結構同樣
例如:body對象的父節點就是HTML對象,而後段略p對象的父節點就是body對象
複製代碼
同理,CSS規則樹的生成也是相似。
Bytes → characters → tokens → nodes → CSSOM
複製代碼
當DOM樹和CSSOM都有了後,就要開始構建渲染樹了
通常來講,渲染樹和DOM樹相對應的,但不是嚴格意義上的一一對應,由於有一些不可見的DOM元素不會插入到渲染樹中,如head這種不可見的標籤或者display: none等
佈局:經過渲染樹中渲染對象的信息,計算出每個渲染對象的位置和尺寸。
繪製階段,系統會遍歷呈現樹,並調用呈現器的「paint」方法,將呈現器的內容顯示在屏幕上。
這張圖片中重要的四個步驟
1. 計算CSS樣式
2. 構建渲染樹
3. 佈局,主要定位座標和大小,是否換行,各類position overflow z-index屬性
4. 繪製,將圖像繪製出來
複製代碼
當數據傳送完畢,須要斷開 tcp 鏈接,此時發起 tcp 四次揮手。
(第一次揮手:由瀏覽器發起的,發送給服務器,我請求報文發送完了,你準備關閉吧)
(第二次揮手:由服務器發起的,告訴瀏覽器,我請求報文接受完了,我準備關閉了,你也準備吧)
(第三次揮手:由服務器發起,告訴瀏覽器,我響應報文發送完了,你準備關閉吧)
(第四次揮手:由瀏覽器發起,告訴服務器,我響應報文接受完了,我準備關閉了,你也準備吧)
參考文章: