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