1. 程式人生 > >一次HTTP請求的背後

一次HTTP請求的背後

網路抓包工具:

  • Fiddler

  • WireShark

相關概念

網路七層模型

應用層

提供網路管理、檔案傳輸、事務處理,Telnet、FTP、HTTP、SNMP、DNS,HTTPS

HTTP
- http0.9 是http協議的第一個版本,只有普通的get請求.

  • http1.0引入post請求,讓HTML的表單可以提交表單.引入加入請求頭Header ,既一次TCP連線後,可以多次通訊,雖然HTTP1.0 預設是傳輸一次資料後就關閉。

  • http1.1加入keep alive等

HTTPS:加密資料傳輸

發起請求:通過443埠發起https請求*
關於HTTPS,這裡有一篇不錯的文章

[傳送門]

宿主host:

(主機名) 加快域名解析,當進行DNS請求時,系統會自動檢查host檔案是否有這個網路域名對映關係。如果有則,呼叫這個IP地址對映,如果沒有,再向已知的DNS伺服器提出域名解析。也就是說Hosts的請求級別比DNS高。

DNS(Domain Name System) 域名解析器,將域名和ip繫結

表示層

不同資料編碼格式的轉換,提供資料壓縮、解壓縮服務,對資料進行加密、解密。例如影象格式的顯示

會話層

將資料組合成資料Data,建立和維持對話.

傳輸層

將資料組合成段Segment,用tcp,udp等進行資料傳輸.

網路層

分割和重新組合資料包Packet,基於網路層地址IP,進行路徑選擇.例如路由器.
當前TCP/IP協議族:

  • IPv4的地址位數是32位,也就是說最多有2^32臺電腦可以連線到網際網路.

  • IPv6採用128位地址長度,也就是2^128臺電腦可以連線.幾乎可以不受限制地提供地址.除此之外,還改善了IPv4中解決不好的問題,主要有端到端IP連線、服務質量(QoS)、安全性、多播、移動性、即插即用等

  • ARP(Address Resolution Protocol) 地址解析協議(在IPv4)

資料鏈接層

在物理層上建立可靠的傳輸,單位是Frame.功能是:實體地址定址,資料成幀,流量控制,資料監測等.例如網橋,交換機.
協議包括:SDLC(sychronous Date Line Control),HDLC,PPP(Point-to-Point),STP等

物理層

是資料傳遞的實體,資料傳輸單位是bit,例如光纖,電纜等

在介紹TCP之前,先說一下UDP和TCP的區別

  • UDP傳輸就類似於寫信,接收方事先並不知道你要寫信給他;
    即無法判斷在傳輸過程中,會不會發生丟包,阻塞,等情況.

  • TCP傳輸就像是打電話,必須等對方按了接聽鍵你才能更他通話。
    TCP報文有自己的檢測機制,檢驗、序列號、確認應答、重發控制、連線管理以及視窗控制等機制實現可靠性傳輸.

TCP協議的特點

TCP協議是一種面向連線的,基於位元組流的傳輸層協議.TCP將使用者資料打成報文段(如下報文圖),在傳送的時候啟動一個定時器,在另外一端接受的時候,對資料會進行確認,排序,去重複(根據序列號,確認號比較進行確認)等操作.應用層的http,是使用TCP建立連線的.

如果想要充分讀懂TCP是如何收發包,以及序列號的,請點選[傳送門]

TCP報文首部:

  1. 源埠號:資料發起者的埠號,16bit

  2. 目的埠號:資料接收者的埠號,16bit

  3. 序號:32bit的序列號,由傳送方使用,根據傳送的位元組資料變化

  4. 確認序號32bit的確認號,是接收資料方期望收到傳送方的下一個報文段的序號,因此確認序號應當是上次已成功收到資料位元組序號加1。

  5. 首部長度:首部中32bit字的數目,可表示15*32bit=60位元組的首部。一般首部長度為20位元組。

  6. 保留:6bit, 均為0

  7. 緊急URG:當URG=1時,表示報文段中有緊急資料,應儘快傳送。

  8. 確認位元ACK:ACK = 1時代表這是一個確認的TCP包,取值0則不是確認包。

  9. 推送位元PSH:當傳送端PSH=1時,接收端儘快的交付給應用程序。

  10. 復位位元(RST):當RST=1時,表明TCP連線中出現嚴重差錯,必須釋放連線,再重新建立連線。

  11. 同步位元SYN:在建立連線是用來同步序號。SYN=1, ACK=0表示一個連線請求報文段。SYN=1,ACK=1表示同意建立連線。

  12. 終止位元FIN:FIN=1時,表明此報文段的傳送端的資料已經發送完畢,並要求釋放傳輸連線。

  13. 視窗:用來控制對方傳送的資料量,通知發放已確定的傳送視窗上限。

  14. 檢驗和:該欄位檢驗的範圍包括首部和資料這兩部分。由發端計算和儲存,並由收端進行驗證。

  15. 緊急指標:緊急指標在URG=1時才有效,它指出本報文段中的緊急資料的位元組數。

  16. 選項:長度可變,最長可達40位元組

HTTP請求流程

時間線流程

這裡寫圖片描述

網路層級關係

請求流程分析

解析域名(HOST/DNS)

  • 一個域名 會首先訪問本地的Host檔案,檢視有沒有域名對應的訪問ip的對映
  • 如果有,就直接得到IP,如果沒有,就通過DNS根伺服器,
  • DNS根伺服器會詢問.net域名伺服器,有沒有此域名
  • net域名伺服器會查詢blog.csdn.net是否存在
  • 如果存在,就返回相應的IP地址
  • ARP協議解析ip對應的實體地址,並加入到ARP快取
  • 進行TCP握手

三次握手

相互請求,相互確認的過程.

就像長途運貨車
你和總部說,我想運貨,
然後總部收到你的簡訊,給你回信說:恩,收到,去吧
你說,收到,馬上去.

在此先設定

SYN1表示客戶端的同步訊號,ACK1表示客戶端的確認訊號,FIN1表示客戶端對伺服器通道停止訊號

SYN2表示伺服器的同步訊號,ACK2表示伺服器的確認訊號,FIN2表示伺服器對客戶端通道停止訊號

SYN根據ACK的相應而變化.使用確認號1響應服務端的序列號0

序列號代表傳送的資料編號,確認序列代表收到的資料編號.

序列號和確認序列在握手的時候傳送的時候都會自動+1(說的不太恰當);

序列號為當前端成功傳送的資料位數,確認號為當前端成功接收的資料位數,SYN標誌位和FIN標誌位也要佔1位

第一次:

客戶端發起請求(傳送SYN1=1,ACK1=0)到伺服器,此時,伺服器進入’SYN_SENT’(客戶端已經提交SYN報文)狀態,等待伺服器響應.

第二次:

伺服器收到SYN包,確認客戶端的SYN包而生成ACK(ACK=j+1)包,還有自己的一個請求編號SYN
(SYN=k), 即傳送SYN+ACK包(傳送SYN2=0,ACK2=1)到客戶端.此時,伺服器進入’SYN_RECV’狀態.

第三次:

客戶端收到伺服器的SYN+ACK包,然後,自己向伺服器傳送確認包ACK(傳送SYN1=0+1,ACK1=0+1=1),此時,伺服器進入’ESTABLISHED’(連結成功)狀態,完成三次握手
(連線完成狀態表示為SYN1=1,ACK1=1,SYN2=1,ACK2=1).

資料傳輸過程

第四次(客戶端請求伺服器發出的有效資料包)

這是流中第一個攜帶有效資料的包(確切的說,是客戶端傳送的HTTP請求),序列號依然為1,因為到上個包為止,還沒有傳送任何資料,確認號也保持1不變,因為客戶端沒有從服務端接收到任何資料

需要注意的是,包中有效資料的長度為125位元組,但是一共有125+1個數據,因為序列號也佔用位元組.

服務端的序列號為1.確認號為1,TCP客戶端的序列號為126.確認號為1

第五次(伺服器得到包,並處理得到的資料)

當上層處理HTTP請求時,服務端傳送該包來確認客戶端在包4中發來的資料,需要注意的是,確認號的值增加了125(125是包4中有效資料長度),變為126,
服務端以此來告知客戶端端,目前為止,我總共收到了126位元組的資料,服務端的序列號保持為1不變

服務端的序列號為1.確認號為126,TCP客戶端的序列號仍為126.確認號為1

第六次(伺服器發出資料包)

這個包標誌著服務端返回HTTP響應的開始,序列號依然為1,因為服務端在該包之前返回的包中都不帶有有效資料,該包帶有512位元組的有效資料.

服務端的序列號為513.確認號為126,TCP客戶端的序列號仍為126.確認號為1

第七次(客戶端接受資料包)

客戶端接收到資料.到此為止,一次tcp的短連線,一次網路請求完成().
當tcp進行長連結的時候,會不斷地相互增長.
服務端的序列號為513.確認號為126,TCP客戶端的序列號仍為126.確認號為1+513=514

連線終止協議(四次揮手)

第一次:

TCP的客戶端傳送一個FIN(FIN=1),用來關閉客戶到伺服器的資料傳輸.

此時,將標誌位FIN1=1.

服務端的序列號為513.確認號為126,TCP客戶端的序列號仍為126+1.確認號為514

第二次:

伺服器收到這個FIN,它發出一個ACK2=1,確認序號為收到的序號加1。和SYN一樣,一個FIN將佔用一個序號。

此時,FIN1=1,ACK2=1,通道1關閉,伺服器確定

服務端的序列號為513.確認號為126+1=127,TCP客戶端的序列號仍為126.確認號為514

第三次:

伺服器關閉客戶端連線,發一個FIN2=1的標誌位給客戶端,

此時,將標誌位FIN1=1,FIN2=1.ACK2=1,通道1,2關閉,伺服器確定

服務端的序列號為513.確認號為126+1=127,TCP客戶端的序列號仍為126.確認號為514

第四次:

客戶端發回ACK1=1報文確認,並將確認序號設定為收到序號加1。

此時,FIN1=1,ACK2=1,ACK1=1,ACK2=1,通道1,2關閉,客戶端確認,服務端確認.連線關閉

服務端的序列號為513.確認號為126+1+1=128,TCP客戶端的序列號為126+1=127(最終序列號).確認號為514

附軟體截圖

總結

1.正常網路連線的實質都是TCP連線下的bit流的傳輸(沒有考慮UDP等).

2.一個網路請求,過程複雜,需要跨過閘道器,解析域名,TCP握手,各種快取策略,協議和報文等機制複雜.

3.HTTP協議,所有資訊都是公開的,容易被第三方獲取.HTTPS運用了SSL加密,對稱,非對稱,hash加密等.

4.三次握手的意義在於,雙方都進行了確認後再代開連線,防止已經連結失效,或者因為網路延時造成的重複分組.造成建立新的tcp連結,造成service一直等待,浪費資源.

5.四次揮手的原因是,TCP是全雙工,因此每個方向都必須單獨關閉.收到一個FIN,代表這個通道,在此之後不會傳輸資料.但是一個TCP連線在發出FIN之前,收到一個FIN後仍能傳送資料.

6.協議在不斷地更新換代,效率越來越高!