前言:在瀏覽器中輸入https://www.baidu.com/按下回車鍵,到百度首頁(yè)出現(xiàn),這個(gè)過程發(fā)生了些什么呢?

一、先了解什么是URL和IP地址
URL正式名稱為 Uniform Resource Locator (簡(jiǎn)稱:URL),是統(tǒng)一資源定位符,用于定位互聯(lián)網(wǎng)上的資源。如https://www.baidu.com/就是URL。URL包含多種協(xié)議,比較常見的有http,https,ftp,file。
http是超文本傳輸協(xié)議,是用于從WWW服務(wù)器傳輸超文本到本地瀏覽器的傳輸協(xié)議。
https是加密版超文本傳輸協(xié)定,傳輸?shù)木W(wǎng)頁(yè)經(jīng)過加密,信息內(nèi)容不容易被破解。所以https比http協(xié)議更加安全,也更加常見。
ftp是文件傳輸協(xié)議,主要用于在本地主機(jī)和遠(yuǎn)程主機(jī)之間傳送文件,需要對(duì)不同的用戶設(shè)置不同的權(quán)限,一般用于局域網(wǎng)的文件傳輸。
file是本地文件傳輸協(xié)議,主要用于訪問本地計(jì)算機(jī)中的文件。
url的格式一般為:協(xié)議類型://<主機(jī)名>:<端口>/<路徑>/文件名,以https://www.baidu.com/為例。
- https表示該網(wǎng)站服務(wù)器使用https協(xié)議。
- 主機(jī)名是否輸入沒有影響,端口號(hào)沒有輸入則表示為默認(rèn)端口號(hào),默認(rèn)情況下http服務(wù)的端口為80。ftp為21,https為443。
- 百度的域名則是www.baidu.com,百度的URL以斜杠“/”結(jié)尾,而沒有給出文件名,在這種情況下,URL引用路徑中最后一個(gè)目錄中的默認(rèn)文件(通常對(duì)應(yīng)于主頁(yè)),這個(gè)文件常常被稱為 index.html 或 default.htm。所以輸入這個(gè)網(wǎng)址實(shí)際是進(jìn)入該網(wǎng)站的主頁(yè)。
IP是互聯(lián)網(wǎng)中的每臺(tái)連接到網(wǎng)絡(luò)的計(jì)算機(jī)為實(shí)現(xiàn)相互通信而遵循的規(guī)則協(xié)議。每個(gè)處于互聯(lián)網(wǎng)中的設(shè)備都有IP 地址,形如 192.168.0.1,而127.0.0.1代表本機(jī)的 IP。IP又分為局域網(wǎng)IP和公網(wǎng)IP。而局域網(wǎng) IP 和公網(wǎng) IP 是有差別的。每個(gè)網(wǎng)站就是靠IP來定位的。
那為什么不直接用IP來訪問網(wǎng)站,而發(fā)明域名呢?
- IP地址為一串?dāng)?shù)字,一個(gè)網(wǎng)站對(duì)應(yīng)一串?dāng)?shù)字,當(dāng)訪問多個(gè)網(wǎng)站時(shí),需要記憶多個(gè)IP地址,不方便記憶。
- 域名有語(yǔ)義化的作用,它比IP地址更容易記憶。
二、域名解析
以https://www.baidu.com/為例,瀏覽器實(shí)際是不知道https://www.baidu.com/到底是在互聯(lián)網(wǎng)的哪個(gè)位置,它需要查找https://www.baidu.com/這個(gè)域名背后對(duì)應(yīng)的 IP 地址,根據(jù)這個(gè)IP地址,訪問網(wǎng)站。查找域名對(duì)應(yīng)的IP地址的過程叫域名解析。
域名解析流程
- 瀏覽器緩存
如果瀏覽器曾經(jīng)訪問過該網(wǎng)站,瀏覽器會(huì)緩存DNS記錄一段時(shí)間,這樣就快速找到該網(wǎng)站對(duì)應(yīng)的 IP 地址,則域名解析結(jié)束。如果沒有找到,會(huì)繼續(xù)進(jìn)行域名解析。
- 系統(tǒng)緩存
從電腦系統(tǒng)中 Hosts 的文件查找該域名和對(duì)應(yīng)的IP地址。如果沒有找到,繼續(xù)進(jìn)行域名解析。
- 路由器緩存
如果連著同一個(gè)路由器的其他設(shè)備訪問過該網(wǎng)站,路由器也會(huì)緩存域名信息。從該路由器的緩存中查找是否有該網(wǎng)站對(duì)應(yīng)的 IP 地址。如果沒有,域名解析繼續(xù)。
- ISP DNS 緩存
以上還是沒有,就會(huì)向網(wǎng)絡(luò)供應(yīng)商 ( ISP) 查找是否有該網(wǎng)站對(duì)應(yīng)的 IP 地址。如果沒有,域名解析繼續(xù)。
- 查找根域名伺服器供應(yīng)商
若都沒有找到,則向根域名服務(wù)器查找域名對(duì)應(yīng) IP,根域名服務(wù)器把請(qǐng)求轉(zhuǎn)發(fā)到下一級(jí),直到找到對(duì)應(yīng)IP。
三、服務(wù)器處理
服務(wù)器是一臺(tái)安裝系統(tǒng)的機(jī)器,常見的系統(tǒng)有Linux,Windows server 2012。每臺(tái)服務(wù)器上都會(huì)安裝處理請(qǐng)求的應(yīng)用——web server。常見的web server 有“apache”,“nginx”,“IIS”、“Lighttpd”等。Web服務(wù)器接收用戶的請(qǐng)求(requset)交給網(wǎng)站代碼或反向代理到其他服務(wù)器,然后進(jìn)行一個(gè)網(wǎng)站處理流程,最后產(chǎn)生一個(gè)html的響應(yīng)(response)給瀏覽器。
網(wǎng)站處理流程
網(wǎng)站處理是實(shí)際后臺(tái)處理。后臺(tái)開發(fā)到現(xiàn)在有很多框架,但大部分都還是按照“MVC設(shè)計(jì)模式”進(jìn)行搭建的。
MVC是一個(gè)設(shè)計(jì)模式,將應(yīng)用程序分成三個(gè)核心部件:模型(model),視圖(view),控制器(controller)

MVC的處理過程
每一個(gè)用戶輸入的請(qǐng)求
首先被路由接收,再交由控制器決定用哪個(gè)模型來進(jìn)行處理
將用戶輸入的指令數(shù)據(jù)傳給模型進(jìn)行處理
進(jìn)行業(yè)務(wù)邏輯判斷,按需要向數(shù)據(jù)庫(kù)進(jìn)行存取
根據(jù)業(yè)務(wù)邏輯選擇視圖
控制器用業(yè)務(wù)邏輯相應(yīng)的數(shù)據(jù)填入視圖模型
將處理好的視圖模版的HTML交回控制器
生成 HTML 字符串返給瀏覽器處理,并通過顯示頁(yè)面呈現(xiàn)給用戶。
四、瀏覽器處理
瀏覽器處理是根據(jù)MVC模型處理返回的HTML字符串被瀏覽器接受后被一句句讀取解析,當(dāng)解析到link標(biāo)簽后重新發(fā)送請(qǐng)求獲取CSS 。當(dāng)解析到scrip標(biāo)簽后發(fā)送請(qǐng)求獲取JS,并執(zhí)行代碼。當(dāng)解析到img標(biāo)簽后發(fā)送請(qǐng)求獲取圖片資源。
瀏覽器是一個(gè)邊解析邊渲染的過程。首先瀏覽器解析HTML文件構(gòu)建DOM樹,然后解析CSS文件構(gòu)建渲染樹,等到渲染樹構(gòu)建完成后,瀏覽器開始布局渲染樹并將其繪制到屏幕上。