详解浏览器解析一个URL的全过程
目錄
1、瀏覽器解析url
2、DNS域名解析
3、瀏覽器獲取端口號(hào)
4、TCP建立連接
5、發(fā)送HTTP請(qǐng)求
6、服務(wù)器處理請(qǐng)求
7、返回響應(yīng)結(jié)果
8、關(guān)閉TCP連接
9、瀏覽器加載解析渲染
先概括一下整個(gè)過(guò)程:
首先,瀏覽器向本地DNS服務(wù)器發(fā)送請(qǐng)求,如果本地沒(méi)有緩存該域名的IP地址,就需要通過(guò)遞歸或迭代的方式向根域名服務(wù)器、頂級(jí)域名服務(wù)器、權(quán)威域名服務(wù)器發(fā)起查詢(xún)請(qǐng)求,直至返回一個(gè)IP地址給瀏覽器。然后根據(jù)該IP地址建立TCP連接,客戶(hù)端發(fā)送HTTP請(qǐng)求,服務(wù)器返回報(bào)文,關(guān)閉TCP連接,再由瀏覽器進(jìn)行解析渲染頁(yè)面,最后TCP四次揮手結(jié)束連接(404:服務(wù)器找不到請(qǐng)求的頁(yè)面)
應(yīng)用層:DNS、HTTP、HTTPS
傳輸層:TCP
網(wǎng)絡(luò)層:IP、ARP
1、瀏覽器解析url
瀏覽器會(huì)對(duì)我們輸入的url進(jìn)行解析,主要將其分為下部分:協(xié)議、網(wǎng)絡(luò)地址、資源路徑。其中網(wǎng)絡(luò)地址指示該連接網(wǎng)絡(luò)上哪一臺(tái)計(jì)算機(jī),可以是域名或者IP地址,可以包括端口號(hào);協(xié)議是從該計(jì)算機(jī)獲取資源的方式,常見(jiàn)的是HTTP,HTTPS,FTP等。不同協(xié)議有不同的通訊內(nèi)容格式;資源路徑指示從服務(wù)器上需要獲取資源的具體路徑。
這里瀏覽器對(duì)輸入的url解析為如下內(nèi)容:
url:https://mp.csdn.net/mp_blog/creation/editor/119778557
協(xié)議:https
網(wǎng)絡(luò)地址(網(wǎng)站名):mp.csdn.net
資源路徑:/mp_blog/creation/editor/119778557
2、DNS域名解析
客戶(hù)端收到你輸入的域名地址后,它首先去找本地的hosts文件,檢查在該文件中是否有相應(yīng)的域名、IP對(duì)應(yīng)關(guān)系,如果有,則向其IP地址發(fā)送請(qǐng)求,如果沒(méi)有,再去找DNS服務(wù)器。一般用戶(hù)很少去編輯修改hosts文件。
可以理解ip是你家的具體住址 如南京市建鄴區(qū)吉慶家園04棟603室
DNS服務(wù)器層級(jí)如下:
DNS查詢(xún)的具體步驟如下:
a、從瀏覽器緩存中查詢(xún)。瀏覽器會(huì)存儲(chǔ)一定時(shí)間的DNS記錄,操作系統(tǒng)不會(huì)告訴瀏覽器每個(gè)DNS記錄的保存時(shí)限,不同瀏覽器設(shè)置保存時(shí)限為一個(gè)固定值(不同瀏覽器情況不同,一般在2-30分鐘)。
b、從操作系統(tǒng)緩存中查詢(xún)。如果瀏覽器中沒(méi)有包含想要的緩存記錄,那瀏覽器就會(huì)發(fā)起操作系統(tǒng)請(qǐng)求,繼續(xù)查詢(xún)操作系統(tǒng)緩存
c、從路由器中查詢(xún)DNS緩存。請(qǐng)求持續(xù)發(fā)送到你的路由,它通常會(huì)有自己的DNS緩存。
d、從ISP中查詢(xún)DNS緩存。下一個(gè)被查詢(xún)地方是ISP緩存DNS的服務(wù)器。
e、域名服務(wù)器迭代查詢(xún),根據(jù)返回的地址逐級(jí)向上查詢(xún)。首先從root域名服務(wù)器中查詢(xún)?nèi)?com域名服務(wù)器,然后逐步向前查詢(xún),.com頂級(jí)域名服務(wù)器到ruanyifeng的域名服務(wù)器。一般來(lái)說(shuō),.com級(jí)別的都已經(jīng)在緩存中了,所以一般不會(huì)進(jìn)行對(duì)root域名服務(wù)器的查詢(xún)。下面給出一張迭代查詢(xún)的圖。
瀏覽器客戶(hù)端向本地DNS服務(wù)器發(fā)送一個(gè)含有域名https://mp.csdn.net的DNS查詢(xún)報(bào)文。
本地DNS服務(wù)器把查詢(xún)報(bào)文轉(zhuǎn)發(fā)到根DNS服務(wù)器,根DNS服務(wù)器注意到其com后綴,于是向本地DNS服務(wù)器返回comDNS服務(wù)器的IP地址。
本地DNS服務(wù)器再次向comDNS服務(wù)器發(fā)送查詢(xún)請(qǐng)求,comDNS服務(wù)器注意到其https://mp.csdn.net后綴并用負(fù)責(zé)該域名的權(quán)威DNS服務(wù)器的IP地址作為回應(yīng)。
最后,本地DNS服務(wù)器將含有https://mp.csdn.net的IP地址的響應(yīng)報(bào)文發(fā)送給客戶(hù)端。
從客戶(hù)端到本地服務(wù)器屬于遞歸查詢(xún),而DNS服務(wù)器之間的交互屬于迭代查詢(xún)。
正常情況下,本地DNS服務(wù)器的緩存中已有comDNS服務(wù)器的地址,因此請(qǐng)求根域名服務(wù)器這一步不是必需的。
3、瀏覽器獲取端口號(hào)
知道ip地址后,還需要端口號(hào),這樣才能知道具體在603室的哪個(gè)房間里。http協(xié)議默認(rèn)端口號(hào)是80。
4、TCP建立連接
IP和端口都有了,在http消息發(fā)送前,需要建立客戶(hù)端與服務(wù)器的TCP鏈接,也就是進(jìn)行所謂的三次握手。
TCP是因特網(wǎng)中的傳輸層協(xié)議,使用三次握手協(xié)議建立連接。當(dāng)主動(dòng)方發(fā)出SYN連接請(qǐng)求后,
等待對(duì)方回答SYN+ACK,并最終對(duì)對(duì)方的 SYN 執(zhí)行 ACK 確認(rèn)。這種建立連接的方法可以防止產(chǎn)生錯(cuò)誤的連接,
TCP使用的流量控制協(xié)議是可變大小的滑動(dòng)窗口協(xié)議。
TCP三次握手的過(guò)程如下:
a、客戶(hù)端發(fā)送SYN(SEQ=x)報(bào)文給服務(wù)器端,進(jìn)入SYN_SEND狀態(tài)。
b、服務(wù)器端收到SYN報(bào)文,回應(yīng)一個(gè)SYN (SEQ=y)ACK(ACK=x+1)報(bào)文,進(jìn)入SYN_RECV狀態(tài)。
c、客戶(hù)端收到服務(wù)器端的SYN報(bào)文,回應(yīng)一個(gè)ACK(ACK=y+1)報(bào)文,進(jìn)入Established狀態(tài)。
三次握手完成,TCP客戶(hù)端和服務(wù)器端成功地建立連接,可以開(kāi)始傳輸數(shù)據(jù)了。
5、發(fā)送HTTP請(qǐng)求
經(jīng)過(guò)三次握手之后,與服務(wù)器建立了連接后,就可以向服務(wù)器發(fā)起請(qǐng)求了。6、服務(wù)器處理請(qǐng)求
請(qǐng)求到達(dá)服務(wù)器之后,接下來(lái)服務(wù)器需要響應(yīng)瀏覽器的請(qǐng)求。服務(wù)器端收到請(qǐng)求后的由web服務(wù)器(準(zhǔn)確說(shuō)應(yīng)該是http服務(wù)器)處理請(qǐng)求,諸如Apache、Ngnix、IIS等。web服務(wù)器解析用戶(hù)請(qǐng)求,知道了需要調(diào)度哪些資源文件,再通過(guò)相應(yīng)的這些資源文件處理用戶(hù)請(qǐng)求和參數(shù),并調(diào)用數(shù)據(jù)庫(kù)信息,最后將結(jié)果通過(guò)web服務(wù)器返回給瀏覽器客戶(hù)端。下面以靜態(tài)渲染的頁(yè)面為例,ajax渲染不需要在服務(wù)器做頁(yè)面數(shù)據(jù)寫(xiě)入
7、返回響應(yīng)結(jié)果
在HTTP里,有請(qǐng)求就會(huì)有響應(yīng),哪怕是錯(cuò)誤信息。這里我們同樣看下響應(yīng)報(bào)文的組成結(jié)構(gòu):
在響應(yīng)結(jié)果中都會(huì)有個(gè)一個(gè)HTTP狀態(tài)碼,比如我們熟知的200、301、404、500等。通過(guò)這個(gè)狀態(tài)碼我們可以知道服務(wù)器端的處理是否正常,并能了解具體的錯(cuò)誤。
狀態(tài)碼由3位數(shù)字和原因短語(yǔ)組成。根據(jù)首位數(shù)字,狀態(tài)碼可以分為五類(lèi):
8、關(guān)閉TCP連接
為了避免服務(wù)器與客戶(hù)端雙方的資源占用和損耗, 當(dāng)雙方?jīng)]有請(qǐng)求或響應(yīng)傳遞時(shí),任意一方都可以發(fā)起關(guān)閉請(qǐng)求。建立一個(gè)連接需要三次握手,而終止一個(gè)連接要經(jīng)過(guò)四次揮手,這是由TCP的半關(guān)閉(half-close)造成的。具體過(guò)程如下圖所示。
(1) 某個(gè)應(yīng)用進(jìn)程首先調(diào)用close,稱(chēng)該端執(zhí)行“主動(dòng)關(guān)閉”(active close)。該端的TCP于是發(fā)送一個(gè)FIN分節(jié),表示數(shù)據(jù)發(fā)送完畢。
(2) 接收到這個(gè)FIN的對(duì)端執(zhí)行 “被動(dòng)關(guān)閉”(passive close),這個(gè)FIN由TCP確認(rèn)。
注意:FIN的接收也作為一個(gè)文件結(jié)束符(end-of-file)傳遞給接收端應(yīng)用進(jìn)程,放在已排隊(duì)等候該應(yīng)用進(jìn)程接收的任何其他數(shù)據(jù)之后,因?yàn)?#xff0c;FIN的接收意味著接收端應(yīng)用進(jìn)程在相應(yīng)連接上再無(wú)額外數(shù)據(jù)可接收。
(3) 一段時(shí)間后,接收到這個(gè)文件結(jié)束符的應(yīng)用進(jìn)程將調(diào)用close關(guān)閉它的套接字。這導(dǎo)致它的TCP也發(fā)送一個(gè)FIN。
(4) 接收這個(gè)最終FIN的原發(fā)送端TCP(即執(zhí)行主動(dòng)關(guān)閉的那一端)確認(rèn)這個(gè)FIN。
既然每個(gè)方向都需要一個(gè)FIN和一個(gè)ACK,因此通常需要4個(gè)分節(jié)。
9、瀏覽器加載解析渲染
總結(jié)
以上是生活随笔為你收集整理的详解浏览器解析一个URL的全过程的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: java 读取txt文件指定行_在Jav
- 下一篇: 苹果网页归档转html,常用JS转换HT