在瀏覽器輸入網(wǎng)址后,首先要經(jīng)過(guò)域名解析,因?yàn)闉g覽器并不能直接通過(guò)域名找到對(duì)應(yīng)的服務(wù)器,而是要通過(guò) IP 地址。大家這里或許會(huì)有個(gè)疑問(wèn)----計(jì)算機(jī)既可以被賦予 IP 地址,也可以被賦予主機(jī)名和域名。比如 www.hackr.jp。那怎么不一開(kāi)始就賦予個(gè) IP 地址?這樣就可以省去解析麻煩。我們先來(lái)了解下什么是 IP 地址
1.IP 地址
IP 地址是指互聯(lián)網(wǎng)協(xié)議地址,是 IP Address 的縮寫(xiě)。IP 地址是 IP 協(xié)議提供的一種統(tǒng)一的地址格式,它為互聯(lián)網(wǎng)上的每一個(gè)網(wǎng)絡(luò)和每一臺(tái)主機(jī)分配一個(gè)邏輯地址,以此來(lái)屏蔽物理地址的差異。IP 地址是一個(gè) 32 位的二進(jìn)制數(shù),比如 127.0.0.1 為本機(jī) IP。 域名就相當(dāng)于 IP 地址喬裝打扮的偽裝者,帶著一副面具。它的作用就是便于記憶和溝通的一組服務(wù)器的地址。用戶(hù)通常使用主機(jī)名或域名來(lái)訪問(wèn)對(duì)方的計(jì)算機(jī),而不是直接通過(guò) IP 地址訪問(wèn)。因?yàn)榕c IP 地址的一組純數(shù)字相比,用字母配合數(shù)字的表示形式來(lái)指定計(jì)算機(jī)名更符合人類(lèi)的記憶習(xí)慣。但要讓計(jì)算機(jī)去理解名稱(chēng),相對(duì)而言就變得困難了。因?yàn)橛?jì)算機(jī)更擅長(zhǎng)處理一長(zhǎng)串?dāng)?shù)字。為了解決上述的問(wèn)題,DNS 服務(wù)應(yīng)運(yùn)而生。
2.什么是域名解析
DNS 協(xié)議提供通過(guò)域名查找 IP 地址,或逆向從 IP 地址反查域名的服務(wù)。DNS 是一個(gè)網(wǎng)絡(luò)服務(wù)器,我們的域名解析簡(jiǎn)單來(lái)說(shuō)就是在 DNS 上記錄一條信息記錄。
操作系統(tǒng)緩存:如果瀏覽器緩存中找不到需要的 DNS 記錄,那就去操作系統(tǒng)中找。
路由緩存:路由器也有 DNS 緩存。
ISP 的 DNS 服務(wù)器:ISP 是互聯(lián)網(wǎng)服務(wù)提供商(Internet Service Provider)的簡(jiǎn)稱(chēng),ISP 有專(zhuān)門(mén)的 DNS 服務(wù)器應(yīng)對(duì) DNS 查詢(xún)請(qǐng)求。
根服務(wù)器:ISP 的 DNS 服務(wù)器還找不到的話,它就會(huì)向根服務(wù)器發(fā)出請(qǐng)求,進(jìn)行遞歸查詢(xún)(DNS 服務(wù)器先問(wèn)根域名服務(wù)器.com 域名服務(wù)器的 IP 地址,然后再問(wèn).baidu 域名服務(wù)器,依次類(lèi)推)
4. 小結(jié)
瀏覽器通過(guò)向 DNS 服務(wù)器發(fā)送域名,DNS 服務(wù)器查詢(xún)到與域名相對(duì)應(yīng)的 IP 地址,然后返回給瀏覽器,瀏覽器再將 IP 地址打在協(xié)議上,同時(shí)請(qǐng)求參數(shù)也會(huì)在協(xié)議搭載,然后一并發(fā)送給對(duì)應(yīng)的服務(wù)器。接下來(lái)介紹向服務(wù)器發(fā)送 HTTP 請(qǐng)求階段,HTTP 請(qǐng)求分為三個(gè)部分:TCP 三次握手、http 請(qǐng)求響應(yīng)信息、關(guān)閉 TCP 連接。
服務(wù)器是網(wǎng)絡(luò)環(huán)境中的高性能計(jì)算機(jī),它偵聽(tīng)網(wǎng)絡(luò)上的其他計(jì)算機(jī)(客戶(hù)機(jī))提交的服務(wù)請(qǐng)求,并提供相應(yīng)的服務(wù),比如網(wǎng)頁(yè)服務(wù)、文件下載服務(wù)、郵件服務(wù)、視頻服務(wù)。而客戶(hù)端主要的功能是瀏覽網(wǎng)頁(yè)、看視頻、聽(tīng)音樂(lè)等等,兩者截然不同。 每臺(tái)服務(wù)器上都會(huì)安裝處理請(qǐng)求的應(yīng)用——web server。常見(jiàn)的 web server 產(chǎn)品有 apache、nginx、IIS 或 Lighttpd 等。 web server 擔(dān)任管控的角色,對(duì)于不同用戶(hù)發(fā)送的請(qǐng)求,會(huì)結(jié)合配置文件,把不同請(qǐng)求委托給服務(wù)器上處理相應(yīng)請(qǐng)求的程序進(jìn)行處理(例如 CGI 腳本,JSP 腳本,servlets,ASP 腳本,服務(wù)器端 JavaScript,或者一些其它的服務(wù)器端技術(shù)等),然后返回后臺(tái)程序處理產(chǎn)生的結(jié)果作為響應(yīng)。
它負(fù)責(zé)根據(jù)用戶(hù)從'視圖層'輸入的指令,選取'模型層'中的數(shù)據(jù),然后對(duì)其進(jìn)行相應(yīng)的操作,產(chǎn)生最終結(jié)果。控制器屬于管理者角色,從視圖接收請(qǐng)求并決定調(diào)用哪個(gè)模型構(gòu)件去處理請(qǐng)求,然后再確定用哪個(gè)視圖來(lái)顯示模型處理返回的數(shù)據(jù)。 這三層是緊密聯(lián)系在一起的,但又是互相獨(dú)立的,每一層內(nèi)部的變化不影響其他層。每一層都對(duì)外提供接口(Interface),供上面一層調(diào)用。 至于這一階段發(fā)生什么?簡(jiǎn)而言之,首先瀏覽器發(fā)送過(guò)來(lái)的請(qǐng)求先經(jīng)過(guò)控制器,控制器進(jìn)行邏輯處理和請(qǐng)求分發(fā),接著會(huì)調(diào)用模型,這一階段模型會(huì)獲取 redis db 以及 MySQL 的數(shù)據(jù),獲取數(shù)據(jù)后將渲染好的頁(yè)面,響應(yīng)信息會(huì)以響應(yīng)報(bào)文的形式返回給客戶(hù)端,最后瀏覽器通過(guò)渲染引擎將網(wǎng)頁(yè)呈現(xiàn)在用戶(hù)面前。
根據(jù) HTML 的內(nèi)容,將標(biāo)簽按照結(jié)構(gòu)解析成為 DOM 樹(shù),DOM 樹(shù)解析的過(guò)程是一個(gè)深度優(yōu)先遍歷。即先構(gòu)建當(dāng)前節(jié)點(diǎn)的所有子節(jié)點(diǎn),再構(gòu)建下一個(gè)兄弟節(jié)點(diǎn)。
在讀取 HTML 文檔,構(gòu)建 DOM 樹(shù)的過(guò)程中,若遇到 script 標(biāo)簽,則 DOM 樹(shù)的構(gòu)建會(huì)暫停,直至腳本執(zhí)行完畢。