在瀏覽器地址欄中輸入一個URL或點擊一個超鏈接後都發生了什麼

當用戶在主機A的瀏覽器中地址欄輸入一個URL或在網頁中點擊一個超鏈接後,會發生一系列我們看不到操作,然後把網頁內容呈現給用戶。過程圖如下:

 

圖片參考https://blog.csdn.net/qq_24028753/article/details/75100484

在這裏,我把它分爲如下四大步驟:

第一步:DNS服務器首先對該鏈接進行域名解析,將域名轉換爲IP地址。

域名解析過程用到的傳輸協議是UDP,查詢方式分爲遞歸查詢和迭代查詢。兩種查詢的訪問順序:本地域名服務器---根域名服務器---頂級域名服務器---權限域名服務器

主機A向本地DNS的查詢一般都採用遞歸查詢。遞歸查詢過程:如果主機A在本地域名服務器中查詢不到IP地址,那麼本地DNS就以DNS客戶的身份代替主機A在根域名服務器中查詢IP(本質上是DNS客戶向根域名服務器發送查詢請求,根域名服務器提供查詢服務,返回查詢結果。其中的根域名服務器是最高層次的域名服務器,所有的根域名服務器都知道所有的頂級域名服務器的域名和IP地址),如果查不到,根域名服務器再在頂級域名服務器中查詢,就這樣一層一層的向下查詢,直到查詢到域名對應的IP地址,再原路返回結果,否則就報錯。這種傳遞性查詢就稱爲遞歸查詢。

DNS服務器之間的交互查詢一般都採用迭代查詢。在迭代查詢過程中,主機A向本地域名服務器進行遞歸查詢,如果在本地域名服務器查詢不到IP地址,本地域名採用迭代查詢,再向根域名發送查詢請求,根域名服務器不會替主機A去查詢,而是告訴主機A的本地域名服務器頂級域名服務器的IP地址,然後主機A的本地域名服務器再訪問頂級域名服務器,發送查詢請求,反覆查詢,直到在某臺服務器中查詢對應的IP地址後,該服務器將結果返回給主機A的本地域名服務器,然後本地域名服務器再將結果返回給主機A。這種不斷向主機A的本地域名服務器返回IP地址的查詢稱爲迭代查詢。

經過上述查詢之後,主機A將查到的目的IP地址封裝到報文首部,數據傳輸任務就交給傳輸層。

第二步:進行TCP三次握手,建立TCP連接。

主機A的瀏覽器有了要訪問的服務器的IP地址後,接着通過IP地址+端口號和服務器B進行TCP的三次握手,建立連接。

首先A將TCP報文段首部的SYN置爲1,選擇一個初始序列號seq=x(TCP規定,SYN報文段不能攜帶數據,但要消耗掉一個序號),然後主機向服務器發出連接請求的報文段,進入SYN-SENT(同步已發送)狀態。

然後B收到請求報文段後,做出響應,將ACK置爲1,確認號ack=x+1(大寫表示狀態,小寫表示數值),選擇自己的一個初始序列號seq=y,然後將該報文段發送給主機(該報文段也不帶數據)。

最後A收到B的確認後,需要向B也做出收到響應的確認,將ACK置爲1,ack=y+1,seq=x+1。至此TCP連接已建立,A進入ESTABLISJED(已建立連接)狀態,B收到確認後也進入ESTABLISJED狀態,之後主機A和服務器B之間就可以進行數據傳輸了。

第三步:進行數據傳輸。

在傳輸過程中,主機A的瀏覽器首先將url地址通過http協議包裝成請求報文發送給服務器B(http協議是面向事務的,本身是無連接的,雖然http使用了TCP連接,但通信雙方在交換HTTP報文籤不需要先建立HTTP連接),而此時,A只知道B的IP地址,可能還不知道B的mac地址,要想把數據傳給B,就要用到地址解析協議(ARP,有些書將該協議劃分到網絡層,因爲ARP要用到網絡層的IP協議,有些書把它劃分到數據鏈路層,因爲它的用途是把IP地址解析成數據鏈路層的mac地址),ARP解析出mac地址的過程如下:

如果A和B是第一次通信且在同一局域網,那麼A就會在本局域網中廣播一個ARP包,在ARP包中寫入自己的IP地址和mac地址,並告訴局域網中的所有主機我要找XXX(B的IP地址)的mac地址。

局域網中主機收到ARP包後,不是自己的IP地址則選擇丟棄,B收到後,會將A的mac地址寫入ARP高速緩存器中,並將自己的mac地址寫入ARP包單播發送給A。

A收到B發送的ARP包後也將B的mac地址寫入自己的ARP高速緩存器中,之後A和B的通信就可以直接在ARP高速緩存器中找對方的mac地址了。

如果A和B不在同一局域網,兩個網絡由R路由器相連,那麼A在自己網絡中廣播ARP請求,會找到路由器R的mac地址,然後R在B所在的網絡中廣播ARP請求,找到B的mac地址,之後A和B就可以通過路由器R進行通信了。

通過上述的ARP解析過程得到mac地址後,主機A將mac地址封裝在幀首部,發送給B。

服務器B將接收到請求報文通過http協議進行解析,然後將要發送的數據包裝成響應報文發送給主機A,主機A收到數據後,瀏覽器繼續進行HTML頁面解析,遇到網頁中的圖片、cs、js、超鏈接等引用資源時,繼續向服務器B發出請求,服務器B收到請求後做出響應(主要是找到鏈接中相應的資源)將數據分組打包返回給瀏覽器,如此反覆進行,直至數據傳輸完成。

第四步:四次揮手,關閉數據連接,瀏覽器將網頁進行渲染呈現給用戶。

數據傳輸完成後需要進行四次揮手,斷開連接,釋放網絡資源。

首先主機A將FIN置爲1,seq=u(u等於前面傳輸數據時A傳送的最後一個報文段序號+1),向服務器B發送釋放連接的報文段,並停止發送數據,A進入FIN-WAIT-1(終止等待1)狀態。

B收到釋放連接的報文段後,將ACK置爲1,ack=u+1,seq=v(v等於前面傳輸數據時B傳送的最後一個報文段的序號+1),向A發送確認。這時B進入CLOSE-WAIT狀態,TCP連接處於半關閉狀態,也就是A已經沒有數據要發給B了,但B還可以向A發送數據。A收到B的確認後進入FIN-WAIT-2狀態,等待B發出釋放連接的報文。

若B也沒有數據要傳輸A了,就使FIN=1,seq=w(在半關閉狀態可能又向A發送了一些數據),ACK=1,ack=u+1(必須重複上次已發送過的確認號),向A發送釋放連接的報文段。這時B進入LAST-ACK(最後確認)狀態,等待A的確認。

A收到B發送的釋放連接報文段後,使ACK=1,ack=w+1,seq=u+1,向B發送確認,然後進入TIME-WAIT狀態,此時TCP連接還沒有釋放掉,必須經過時間等待計時器設置的時間2MSL(Maximum Segment Lifetime 最長報文段壽命)後,A才進入CLOSED狀態。

注意:A進入TIME-WAIT狀態後必須等待2MSL,是因爲A向B發出確認後需要等待B接收,如果B在一個RTO(超時重傳時間)內沒收到A的確認,就會認爲A沒收到自己發送的釋放連接的報文段,就會進行超時重傳,A收到重傳的報文段後就知道B沒收到自己發送的確認,需要重新向B發送確認。

小結:整個過程中主要用到的協議有:http,DNS(域名解析),UDP(域名解析時會用到),TCP,ARP(將IP地址轉換爲mac地址),IP協議,NAT(網絡地址轉換協議,如果是內網訪問外網的話會用到)等。

 

三次握手、四次揮手過程可參考https://blog.csdn.net/changyourmind/article/details/53127100

 

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章