1、概要
從用戶在瀏覽器輸入域名開始惯豆,到web頁面加載完畢池磁,這是一個說復雜不復雜,說簡單不簡單的過程楷兽,下文暫且把這個過程稱作網頁加載過程。
2华临、分析
眾所周知芯杀,打開一個網頁的過程中,瀏覽器會因頁面上的css/js/image等靜態(tài)資源會多次發(fā)起連接請求雅潭,所以我們暫且把這個網頁加載過程分成兩部分:
html(jsp/php/aspx) 頁面加載(假設存在簡單的Nginx負載均衡)
css/js/image等 網頁靜態(tài)資源加載(假設使用CDN)
2.1.
2.1.1 DNS解析
什么是DNS解析揭厚?當用戶輸入一個網址并按下回車鍵的時候,瀏覽器得到了一個域名扶供。而在實際通信過程中筛圆,我們需要的是一個IP地址。因此我們需要先把域名轉換成相應的IP地址椿浓,這個過程稱作DNS解析太援。
1) 瀏覽器首先搜索瀏覽器自身緩存的DNS記錄。
2) 如果瀏覽器緩存中沒有找到需要的記錄或記錄已經過期扳碍,則搜索hosts文件和操作系統(tǒng)緩存提岔。
3) 如果在hosts文件和操作系統(tǒng)緩存中沒有找到需要的記錄或記錄已經過期,則向域名解析服務器發(fā)送解析請求肮之。
4) 如果域名解析服務器也沒有該域名的記錄案怯,則開始遞歸+迭代解析役衡。
5) 獲取域名對應的IP后,一步步向上返回赛惩,直到返回給瀏覽器。
至此趁餐,瀏覽器就得到了url的IP地址喷兼。
2.1.2 發(fā)起TCP請求
建立TCP連接的過程就是三次握手過程。
這里簡述一下三次握手的過程:
- 客戶端向服務器端發(fā)送連接請求的報文澎怒;
- 服務器端收到請求后褒搔,同意建立連接阶牍,向客戶端發(fā)送確認報文;
- 客戶端收到服務器端的確認報文后星瘾,再次向服務器端發(fā)出報文走孽,確認已收到確認報文。
至此琳状,瀏覽器與服務器已經建立了TCP連接磕瓷,開始進行通信。
2.1.3 建立TCP連接后念逞,瀏覽器向服務器發(fā)送http請求
例如:瀏覽器發(fā)出取文件指令GET
2.1.4 負載均衡
什么是負載均衡困食?當一臺服務器無法支持大量的用戶訪問時,將用戶分攤到兩個或多個服務器上的方法叫負載均衡翎承。
1) 一般硕盹,如果我們的平臺配備了負載均衡的話,前一步DNS解析獲得的IP地址應該是我們Nginx負載均衡服務器的IP地址叨咖。所以瘩例,我們的瀏覽器將我們的網頁請求發(fā)送到了Nginx負載均衡服務器上。
2) Nginx根據(jù)我們設定的分配算法和規(guī)則甸各,選擇一臺后端的真實Web服務器垛贤,與之建立TCP連接、并轉發(fā)我們?yōu)g覽器發(fā)出去的網頁請求趣倾。
3) Web服務器收到請求聘惦,產生響應,并將網頁發(fā)送給Nginx負載均衡服務器儒恋。
4) Nginx負載均衡服務器將網頁傳遞給filters鏈處理善绎,之后發(fā)回給我們的瀏覽器。
2.1.5 服務器響應http請求碧浊,將請求的指定資源發(fā)送給瀏覽器
2.1.6.瀏覽器釋放TCP連接
建立TCP連接的過程就是四次揮手過程涂邀。
這里簡述一下四次揮手過程:
1.瀏覽器向服務器發(fā)送釋放連接報文;
2.服務器收到釋放報文后箱锐,發(fā)出確認報文比勉,然后將服務器上未傳送完的數(shù)據(jù)發(fā)送完;
3.服務器數(shù)據(jù)傳輸完成后驹止,向瀏覽器發(fā)送釋放連接請求浩聋;
4.瀏覽器收到報文后,發(fā)出確認臊恋,然后等待一段時間后衣洁,釋放TCP連接。
2.1.7 瀏覽器渲染
1) 瀏覽器根據(jù)頁面內容抖仅,生成DOM Tree坊夫。根據(jù)CSS內容砖第,生成CSS Rule Tree(規(guī)則樹)。調用JS執(zhí)行引擎執(zhí)行JS代碼环凿。
2) 根據(jù)DOM Tree和CSS Rule Tree生成Render Tree(呈現(xiàn)樹)
3) 根據(jù)Render Tree渲染網頁