一個用戶從發起請求到接收到響應,中間經過哪些服務,每個服務做什么事情


1.先來看看一張概要圖

 

 

 2.分析過程

(1)用戶輸入url,瀏覽器內部代碼將url進行拆分解析,如下圖所示:

 

 

(2) 瀏覽器首先去找本地的hosts文件,檢查在該文件中是否有相應的域名、IP對應關系,如果有,則向其IP地址發送請求,如果沒有就會將domain(域)發送給 dns(域名服務器)進行解析(解析如下圖),將域名解析成對應的服務器IP地址,發回給瀏覽器

 

 

 

注釋:(結合上圖看)
瀏覽器客戶端向本地DNS服務器發送一個含有域名www.cnblogs.com的DNS查詢報文。
本地DNS服務器把查詢報文轉發到根DNS服務器,根DNS服務器注意到其com后綴,於是向本地DNS服務器返回comDNS服務器的IP地址。
本地DNS服務器再次向comDNS服務器發送查詢請求,comDNS服務器注意到其www.cnblogs.com后綴並用負責該域名的權威DNS服務器的IP地址作為回應。
最后,本地DNS服務器將含有www.cnblogs.com的IP地址的響應報文發送給客戶端。
(3)拿到服務器ip后,接下來就是網絡通信(過程如下圖),分層由高到低分別為:應用層、傳輸層、網絡層、數據鏈路層。發送端從應用層往下走,接收端從數據鏈路層往上走。

 

 

首先:應用層客戶端發送HTTP請求
HTTP請求包括請求報頭和請求主體兩個部分,其中請求報頭包含了至關重要的信息,包括請求的方法(GET / POST)、目標url、遵循的協議(http / https / ftp…),返回的信息是否需要緩存,以及客戶端是否發送cookie等。

 

 

然后:傳輸層TCP傳輸報文
3次握手,User-Agent(一般指瀏覽器)會以一個隨機端口(1024<端口<65535)向服務器的WEB程序(常用的有httpd,nginx)等的80端口。這個連接請求(原始的http請求經過TCP/IP4層模型的層層封包)到達服務器端后(這中間有各種路由設備,局域網內除外),進入到網卡,然后是進入到內核的TCP/IP協議棧(用於識別連接請求,解封包,一層一層的剝開),還有可能要經過Netfilter防火牆(屬於內核的模塊)的過濾,最終達到WEB程序,最終建立了TCP/IP的連接

 

 

第一次握手:host1發送一個TCP標志位 SYN=1、ACK=0的數據包給host2,並隨機會產生一個Sequence number=1110,當host2接受到這個數據后,host2由SYN=1可知客戶端是想要建立連接

第二次握手:host2要對客戶端的聯機請求進行確認,向host1發送應答號ACK=1、SYN=1、確認號Acknowledge number =1111,此值是host1的序列號+1,還會產生一個隨機的序列號Sequence number = 22222,這樣就告訴host1可以進行連接;

第三次握手:host1收到數據后檢查Acknowledge number 是否是1110 + 1的值,以及ACK的值是否為1,若為1,host1會發送ACK = 1、確認號碼Acknowledge number = 22222,告訴host2,你的請求連接被確認,連接可以建立

 

TCP(Transmission Control Protocol 傳輸控制協議)是一種面向連接的、可靠的、基於字節流的傳輸層通信協議。
在運用此協議進行數據傳輸前都會進行連接的建立工作(三次握手)
當數據傳輸完畢,連接的雙方都會通知對方要釋放此連接(四次揮手)
tcp標志位有6種標志位
1.SYN(synchronous )建立聯機

2.ACK(acknowledgement)確認

3.PSH(push)傳送

4.FIN(finsh)結束

5.RST(reset)重置

6.URG(urgent)緊急

接着:網絡層IP協議查詢MAC地址
   IP協議的作用是把TCP分割好的各種數據包傳送給接收方。而要保證確實能傳到接收方還需要接收方的MAC地址,也就是物理地址。IP地址和MAC地址是一一對應的關系,一個網絡設備的IP地址可以更換,但是MAC地址一般是固定不變的。ARP協議可以將IP地址解析成對應的MAC地址。當通信的雙方不在同一個局域網時,需要多次中轉才能到達最終的目標,在中轉的過程中需要通過下一個中轉站的MAC地址來搜索下一個中轉目標。
數據到達數據鏈路層
   在找到對方的MAC地址后,就將數據發送到數據鏈路層傳輸。這時,客戶端發送請求的階段結束
再次:服務器接收數據
   接收端的服務器在鏈路層接收到數據包,再層層向上直到應用層。這過程中包括在運輸層通過TCP協議將分段的數據包重新組成原來的HTTP請求報文。
服務器響應請求
   服務接收到客戶端發送的HTTP請求后,查找客戶端請求的資源,並返回響應報文,響應報文中包括一個重要的信息——狀態碼。狀態碼由三位數字組成,
其中比較常見的是200 OK表示請求成功。
301表示永久重定向,即請求的資源已經永久轉移到新的位置。在返回301狀態碼的同時,響應報文也會附帶重定向的url,客戶端接收到后將http請求的url做相應的改變再重新發送。
404 not found 表示客戶端請求的資源找不到。
最后: 服務器返回相應文件
    服務器端收到請求后的由web服務器(准確說應該是http服務器)處理請求,諸如Apache、Ngnix、IIS等。web服務器解析用戶請求,知道了需要調度哪些資源文件,再通過相應的這些資源文件處理用戶請求和參數,並調用數據庫信息,最后將結果通過web服務器返回給瀏覽器客戶端。
關閉TCP連接
為了避免服務器與客戶端雙方的資源占用和損耗,當雙方沒有請求或響應傳遞時,任意一方都可以發起關閉請求。與創建TCP連接的3次握手類似,關閉TCP連接,需要4次揮手。

 

 


第一次揮手:當傳輸的數據到達尾部時,host1向host2發送FIN = 1標志位;可理解成,host1向host2說,我這邊數據傳送完成了,我准備斷開連接了

第二次揮手:因TCP的連接是全雙工的雙向連接,關閉也是要從兩邊關閉;當host2收到host1發來的FIN=1的標志位后,host2不會立刻向host1發送FIND=1的請求關閉信息,而是先向host1發送一個ACK=1的應答信息,表示:你請求關閉的請求我已經收到,但我可能還有數據沒有完成傳送,你再等下,等我數據傳輸完成了我就告訴你

第三次揮手:host2數據傳輸完成,向host1發送FIN=1,host1收到請求關閉 連接的請求后,host1就明白host2的數據已經傳輸完成,現在可以斷開連接了

第四次揮手:host1收到FIN = 1后,host1還是怕由於網絡不穩定的原因,怕host2不知道他要斷開連接,於是向host2發送ACK = 1確認信息進行確認,把自己(host1)設置成TIME_WAIT的狀態並啟動2MSL定時器,如果host2沒有收到ACK,host2端重傳定時器觸發,會重發FIN = 1,要求host1重新發送ACK,當host2收到ACK后,host2就斷開連接;;當host1等待2MSL(2倍報文最大生存時間)后,仍然沒有收到host2的重傳請求,他就知道 host2已經收到了ACK,所以 host1此時才關閉連接,否則會重復上述過程,如果被動一方始終沒能收到ACK,最終會超過最大重傳次數,連接被關閉 這一點設計地很巧妙

 


 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM