瀏覽器輸入一個(gè)網(wǎng)址(www.baidu.com)后執(zhí)行的全過程

下面我們從系統(tǒng)網(wǎng)絡(luò)的角度分析輸入www.baidu.com后的過程:

1、客戶端瀏覽器通過DNS解析到www.baidu.com的IP地址202.108.22.5,通過這個(gè)IP地址找到客戶端到服務(wù)器的路徑??蛻舳藶g覽器發(fā)起一個(gè)HTTP會話到202.108.22.5,然后通過TCP進(jìn)行封裝數(shù)據(jù)包,輸入到網(wǎng)絡(luò)層。
2、在客戶端的傳輸層,把HTTP會話請求分成報(bào)文段,添加源和目的端口,如服務(wù)器使用80端口監(jiān)聽客戶端的請求,客戶端由系統(tǒng)隨機(jī)選擇一個(gè)端口如5000,與服務(wù)器進(jìn)行交換,服務(wù)器把相應(yīng)的請求返回給客戶端的5000端口。然后使用IP層的IP地址查找目的端。
3、客戶端的網(wǎng)絡(luò)層不用關(guān)心應(yīng)用層或者傳輸層的東西,主要做的是通過查找路由表確定如何到達(dá)服務(wù)器,期間可能經(jīng)過多個(gè)路由器,這些都是由路由器來完成的工作,無非就是通過查找路由表決定通過那個(gè)路徑到達(dá)服務(wù)器。
4、客戶端的鏈路層,包通過鏈路層發(fā)送到路由器,通過鄰居協(xié)議查找給定IP地址的MAC地址,然后發(fā)送ARP請求查找目的地址,如果得到回應(yīng)后就可以使用ARP的請求應(yīng)答交換的IP數(shù)據(jù)包現(xiàn)在就可以傳輸了,然后發(fā)送IP數(shù)據(jù)包到達(dá)服務(wù)器的地址。

事件順序:
(1) 瀏覽器獲取輸入的域名www.baidu.com
(2) 瀏覽器向DNS請求解析www.baidu.com的IP地址
(3) 域名系統(tǒng)DNS解析出百度服務(wù)器的IP地址 (詳細(xì)介紹DNS)-通過網(wǎng)關(guān)出去;發(fā)起TCP的3次握手
(4) 瀏覽器與該服務(wù)器建立TCP連接(默認(rèn)端口號80)
(5) 瀏覽器發(fā)出HTTP請求,請求百度首頁
(6) 服務(wù)器通過HTTP響應(yīng)把首頁文件發(fā)送給瀏覽器
(7) TCP連接釋放(四次揮手)
(8) 瀏覽器將首頁文件進(jìn)行解析,并將Web頁顯示給用戶。

簡單理解: 域名解析DNS --> 發(fā)起TCP的3次握手 --> 建立TCP連接后發(fā)起http請求 --> 服務(wù)器響應(yīng)http請求,瀏覽器得到html代碼 --> 瀏覽器解析html代碼,并請求html代碼中的資源(如js、css、圖片等) --> 瀏覽器對頁面進(jìn)行渲染呈現(xiàn)給用戶

事件順序(1)--->涉及到的協(xié)議:

(1) 應(yīng)用層:HTTP(WWW訪問協(xié)議),DNS(域名解析服務(wù))
DNS解析域名為目的IP,通過IP找到服務(wù)器路徑,客戶端向服務(wù)器發(fā)起HTTP會話,然后通過運(yùn)輸層TCP協(xié)議封裝數(shù)據(jù)包,在TCP協(xié)議基礎(chǔ)上進(jìn)行傳輸。
(2) 傳輸層:TCP(為HTTP提供可靠的數(shù)據(jù)傳輸),UDP(DNS使用UDP傳輸),HTTP會話會被分成報(bào)文段,添加源、目的端口;TCP協(xié)議進(jìn)行主要工作。
(3)網(wǎng)絡(luò)層:IP(IP數(shù)據(jù)數(shù)據(jù)包傳輸和路由選擇),ICMP(提供網(wǎng)絡(luò)傳輸過程中的差錯(cuò)檢測),ARP(將本機(jī)的默認(rèn)網(wǎng)關(guān)IP地址映射成物理MAC地址)為數(shù)據(jù)包選擇路由,IP協(xié)議進(jìn)行主要工作,相鄰結(jié)點(diǎn)的可靠傳輸,ARP協(xié)議將IP地址轉(zhuǎn)成MAC地址。
1.URL是什么?
URL統(tǒng)一資源定位符,用于定位互聯(lián)網(wǎng)上的資源。
統(tǒng)一資源定位符是對可以從互聯(lián)網(wǎng)上得到的資源的位置和訪問方法的一種簡潔的表示,是互聯(lián)網(wǎng)上標(biāo)準(zhǔn)資源的地址?;ヂ?lián)網(wǎng)上的每個(gè)文件都有一個(gè)唯一的URL,它包含的信息指出文件的位置以及瀏覽器應(yīng)該怎么處理它。
https://www.baidu.com/正是這樣一個(gè)URL,當(dāng)我們在地址欄中輸入https://www.baidu.com/并按下回車后,DNS服務(wù)器(域名解析系統(tǒng))會根據(jù)用戶提供的域名查找對應(yīng)的IP地址。
域名:以百度為例,baidu.com就是一個(gè)域名,大多數(shù)情況下,我們輸入網(wǎng)址都是輸入它的域名,相比輸入IP地址或者一整串URL來說,輸入域名會更加方便更容易記憶。

二、過程中使用到的協(xié)議
該過程中使用到了ARP,IP,SOFP
ARP(地址解析協(xié)議):他主要解決的是同一個(gè)局域網(wǎng)內(nèi)主機(jī)或路由器IP地址和MAC地址之間的映射問題。
工作過程:當(dāng)源主機(jī)要發(fā)送數(shù)據(jù)的時(shí)候,他會查看自己的ARP高速緩存中是否有目的主機(jī)IP地址對應(yīng)的MAC地址,如果與,則直接發(fā)送,如果沒有,他就會向本網(wǎng)段所有主機(jī)發(fā)送ARP請求分組,接到請求的主機(jī)查看目的IP與自己的IP是否相等,如果不等就忽略,如果相等,就把源主機(jī)的IP和MAC寫入自己的ARP高速緩存,如果之前有就覆蓋掉,然后把自己的MAC寫入ARP相應(yīng)包,源主機(jī)接到ARP響應(yīng)包后把目的主機(jī)的IP和MAC地址寫入ARP高速緩存,并且利用此信息發(fā)送數(shù)據(jù)。
路由選擇協(xié)議
1.內(nèi)部網(wǎng)關(guān)協(xié)議
1)RIP協(xié)議
RIP基于UDP的應(yīng)用層協(xié)議,他認(rèn)為一個(gè)好的路由是他通過的路由器少,RIP允許一條路徑最多可以包含15個(gè)路由,16個(gè)即為不可達(dá)了。
工作過程:假設(shè)路由器R0向R1發(fā)送一個(gè)報(bào)文段
首先修改R0發(fā)來的RIP報(bào)文中所有的項(xiàng)目,把嚇一跳字段的地址改為R0,把所有距離字段值加1,
對于修改后的RIP報(bào)文的每一項(xiàng)進(jìn)行如下步驟,步驟一、首先看原來的路由表中是否有目的網(wǎng)絡(luò)N,如果沒有直接加入到路由表中,如果有進(jìn)行步驟2 步驟二、然后看嚇一跳,如果嚇一跳的地址是R0則用新的項(xiàng)目替換原來的項(xiàng)目,如果嚇一跳不同則進(jìn)行步驟三步驟三、對比距離,如果距離小于源路由器的項(xiàng)目,那么更新,否則什么都不做。
首先將R0發(fā)來的路由更新信息的距離都+1,下一跳都改為R0
Net1在源路由表中沒有所以直接寫入,Net2中嚇一跳相同,直接覆蓋原路由表中的Net2那一行,Net3的嚇一跳不同,所以選擇路徑最小的。
2)OSPF(最短路徑優(yōu)先)
OSPF是網(wǎng)絡(luò)層協(xié)議基于IP,當(dāng)路由的鏈路狀態(tài)發(fā)生變化時(shí),他會使用洪泛法向本自治系統(tǒng)中所有路由發(fā)送自己的的鏈路狀態(tài)(鏈路狀態(tài)就是自己和那些路由相鄰)
2.外部網(wǎng)關(guān)協(xié)議
2)BGP
BGP是不同自治系統(tǒng)路由器之間交換路由信息的協(xié)議,他只是力求尋找能達(dá)到目的網(wǎng)絡(luò)的比較好的協(xié)議,而并非最佳路由。
BGP發(fā)言人:每一個(gè)自治系統(tǒng)的管理員都需要至少有一個(gè)路由器作為BGP發(fā)言人,BGP發(fā)言人一般是邊界路由器,當(dāng)然也有不是邊界路由器的情況。
BGP交換路由信息:BGP發(fā)言人如果想和別的自治系統(tǒng)的BGP發(fā)言人交換信息(到達(dá)某個(gè)網(wǎng)絡(luò)所要經(jīng)歷的一系列AS),他需要先建立起TCP連接,連接建立成功后在此鏈接上交換BGP報(bào)文,建立BGP會話,使用TCP是因?yàn)榭梢蕴峁┛煽康姆?wù),也簡化了路由選擇協(xié)議。

在應(yīng)用層,瀏覽器會給web服務(wù)器發(fā)送一個(gè)HTTP請求;
請求頭為:GET http://www.baidu.com/HTTP/1.1
在傳輸層,(上層的傳輸數(shù)據(jù)流分段)HTTP數(shù)據(jù)包會嵌入在TCP報(bào)文段中;
TCP報(bào)文段需要設(shè)置端口,接收方(百度)的HTTP端口默認(rèn)是80,本機(jī)的端口是一個(gè)1024-65535之間的隨機(jī)整數(shù),這里假設(shè)為1025,這樣TCP報(bào)文段由TCP首部(包含發(fā)送方和接收方的端口信息)+ HTTP數(shù)據(jù)包組成。
在網(wǎng)絡(luò)層中,TCP報(bào)文段再嵌入IP數(shù)據(jù)包中;
IP數(shù)據(jù)包需要知道雙方的IP地址,本機(jī)IP地址假定為192.168.1.5,接受方IP地址為220.181.111.147(百度),這樣IP數(shù)據(jù)包由IP頭部(IP地址信息)+TCP報(bào)文段組成。
在網(wǎng)絡(luò)接口層,IP數(shù)據(jù)包嵌入到數(shù)據(jù)幀(以太網(wǎng)數(shù)據(jù)包)中在網(wǎng)絡(luò)上傳送;
數(shù)據(jù)幀中包含源MAC地址和目的MAC地址(通過ARP地址解析協(xié)議得到的)。這樣數(shù)據(jù)幀由頭部(MAC地址)+IP數(shù)據(jù)包組成。
數(shù)據(jù)包經(jīng)過多個(gè)網(wǎng)關(guān)的轉(zhuǎn)發(fā)到達(dá)百度服務(wù)器,請求對應(yīng)端口的服務(wù);
服務(wù)接收到發(fā)送過來的以太網(wǎng)數(shù)據(jù)包開始解析請求信息,從以太網(wǎng)數(shù)據(jù)包中提取IP數(shù)據(jù)包—>TCP報(bào)文段—>HTTP數(shù)據(jù)包,并組裝為有效數(shù)據(jù)交與對應(yīng)線程池中分配的線程進(jìn)行處理,在這個(gè)過程中,生成相應(yīng)request、response對象。
請求處理完成之后,服務(wù)器發(fā)回一個(gè)HTTP響應(yīng);

事件順序(2)--->點(diǎn)擊網(wǎng)址后,<應(yīng)用層>的DNS協(xié)議會將網(wǎng)址解析為IP地址;

一、DNS查找過程(由域名→IP 地址):

  1. 瀏覽器會檢查緩存中有沒有這個(gè)域名對應(yīng)的解析過的IP地址,如果緩存中有,這個(gè)解析過程就將結(jié)束。
  2. 如果用戶的瀏覽器緩存中沒有,瀏覽器會查找操作系統(tǒng)緩存(hosts文件)中是否有這個(gè)域名對應(yīng)的DNS解析結(jié)果。
  3. 若還沒有,此時(shí)會發(fā)送一個(gè)數(shù)據(jù)包給DNS服務(wù)器(操作系統(tǒng)向根域名服務(wù)器發(fā)起請求得到頂級域名服務(wù)器的IP,然后根域名服務(wù)器向頂級域名服務(wù)器發(fā)起請求得到權(quán)限域名服務(wù)器的IP,頂級域名服務(wù)器再向權(quán)限域名服務(wù)器發(fā)起請求得到IP,本地域名服務(wù)器返回給操作系統(tǒng)IP,同時(shí)將IP緩存起來,操作系統(tǒng)將IP返回給瀏覽器,同時(shí)將IP緩存起來),DNS服務(wù)器找到后將解析所得IP地址返回給用戶。

簡單理解: 尋找 IP 地址的過程依次經(jīng)過了瀏覽器緩存、系統(tǒng)緩存、hosts文件、路由器緩存、 遞歸搜索根域名服務(wù)器。

事件順序(3)--->解釋TCP的三次握手。

1) Client首先發(fā)送一個(gè)連接試探,ACK=0 表示確認(rèn)號無效,SYN = 1 表示這是一個(gè)連接請求或連接接受報(bào)文,同 時(shí)表示這個(gè)數(shù)據(jù)報(bào)不能攜帶數(shù)據(jù),seq = x 表示Client自己的初始序號(seq = 0 就代表這是第0號包),這時(shí)候 Client進(jìn)入syn_sent狀態(tài),表示客戶端等待服務(wù)器的回復(fù)
2) Server監(jiān)聽到連接請求報(bào)文后,如同意建立連接,則向Client發(fā)送確認(rèn)。TCP報(bào)文首部中的SYN 和 ACK都置1 ,ack = x + 1表示期望收到對方下一個(gè)報(bào)文段的第一個(gè)數(shù)據(jù)字節(jié)序號是x+1,同時(shí)表明x為止的所有數(shù)據(jù)都已正確收 到(ack=1其實(shí)是ack=0+1,也就是期望客戶端的第1個(gè)包),seq = y 表示Server 自己的初始序號(seq=0就代表這 是服務(wù)器這邊發(fā)出的第0號包)。這時(shí)服務(wù)器進(jìn)入syn_rcvd,表示服務(wù)器已經(jīng)收到Client的連接請求,等待client的 確認(rèn)。
3) Client收到確認(rèn)后還需再次發(fā)送確認(rèn),同時(shí)攜帶要發(fā)送給Server的數(shù)據(jù)。ACK 置1 表示確認(rèn)號ack= y + 1 有效 (代表期望收到服務(wù)器的第1個(gè)包),Client自己的序號seq= x + 1(表示這就是我的第1個(gè)包,相對于第0個(gè)包來說 的),一旦收到Client的確認(rèn)之后,這個(gè)TCP連接就進(jìn)入Established狀態(tài),就可以發(fā)起http請求了。

事件順序(4)--->建立TCP連接

費(fèi)了一頓周折終于拿到服務(wù)器IP了,下一步自然就是鏈接到該服務(wù)器。對于客戶端與服務(wù)器的TCP鏈接,必然要說的就是『三次握手』。


image

客戶端發(fā)送一個(gè)帶有SYN標(biāo)志的數(shù)據(jù)包給服務(wù)端,服務(wù)端收到后,回傳一個(gè)帶有SYN/ACK標(biāo)志的數(shù)據(jù)包以示傳達(dá)確認(rèn)信息,最后客戶端再回傳一個(gè)帶ACK標(biāo)志的數(shù)據(jù)包,代表握手結(jié)束,連接成功。

上圖也可以這么理解:
客戶端:“你好,在家不,有你快遞?!?br> 服務(wù)端:“在的,送來就行?!?br> 客戶端:“好嘞?!?/p>

事件順序(5)--->發(fā)送HTTP請求

與服務(wù)器建立了連接后,就可以向服務(wù)器發(fā)起請求了。這里我們先看下請求報(bào)文的結(jié)構(gòu)(如下圖):


image

在瀏覽器中查看報(bào)文首部(以google瀏覽器為例):


image

請求行包括請求方法、URI、HTTP版本。首部字段傳遞重要信息,包括請求首部字段、通用首部字段和實(shí)體首部字段。我們可以從報(bào)文中看到發(fā)出的請求的具體信息。具體每個(gè)首部字段的作用,這里不做過多闡述。

事件順序(6)--->服務(wù)器處理請求

服務(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ù)器返回給瀏覽器客戶端。


image

事件順序(6)--->返回響應(yīng)結(jié)果

在HTTP里,有請求就會有響應(yīng),哪怕是錯(cuò)誤信息。這里我們同樣看下響應(yīng)報(bào)文的組成結(jié)構(gòu):


image

在響應(yīng)結(jié)果中都會有個(gè)一個(gè)HTTP狀態(tài)碼,比如我們熟知的200、301、404、500等。通過這個(gè)狀態(tài)碼我們可以知道服務(wù)器端的處理是否正常,并能了解具體的錯(cuò)誤。
狀態(tài)碼由3位數(shù)字和原因短語組成。根據(jù)首位數(shù)字,狀態(tài)碼可以分為五類:


image

事件順序(7)--->關(guān)閉TCP連接

為了避免服務(wù)器與客戶端雙方的資源占用和損耗,當(dāng)雙方?jīng)]有請求或響應(yīng)傳遞時(shí),任意一方都可以發(fā)起關(guān)閉請求。與創(chuàng)建TCP連接的3次握手類似,關(guān)閉TCP連接,需要4次握手。


image

上圖可以這么理解:
客戶端:“兄弟,我這邊沒數(shù)據(jù)要傳了,咱關(guān)閉連接吧?!?br> 服務(wù)端:“收到,我看看我這邊有木有數(shù)據(jù)了?!?br> 服務(wù)端:“兄弟,我這邊也沒數(shù)據(jù)要傳你了,咱可以關(guān)閉連接了。”
客戶端:“好嘞。”

事件順序(8)--->瀏覽器解析HTML

準(zhǔn)確地說,瀏覽器需要加載解析的不僅僅是HTML,還包括CSS、JS。以及還要加載圖片、視頻等其他媒體資源。
瀏覽器通過解析HTML,生成DOM樹,解析CSS,生成CSS規(guī)則樹,然后通過DOM樹和CSS規(guī)則樹生成渲染樹。渲染樹與DOM樹不同,渲染樹中并沒有head、display為none等不必顯示的節(jié)點(diǎn)。
要注意的是,瀏覽器的解析過程并非是串連進(jìn)行的,比如在解析CSS的同時(shí),可以繼續(xù)加載解析HTML,但在解析執(zhí)行JS腳本時(shí),會停止解析后續(xù)HTML,這就會出現(xiàn)阻塞問題,關(guān)于JS阻塞相關(guān)問題,這里不過多闡述。

事件順序(8)--->瀏覽器布局渲染

根據(jù)渲染樹布局,計(jì)算CSS樣式,即每個(gè)節(jié)點(diǎn)在頁面中的大小和位置等幾何信息。HTML默認(rèn)是流式布局的,CSS和js會打破這種布局,改變DOM的外觀樣式以及大小和位置。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容