http請求是如何先建立的三次握手?

Jack2k發表於2021-09-09

先清楚一個概念http請求與tcp連結之間的關係,在客戶端向服務端請求和返回的過程中,是需要去建立一個TCP connection,因為http是不存在連結這樣一個概念的,它只有請求和響應這樣一個概念,請求和響應都是一個資料包,中間要透過一個傳輸通道,這個傳輸通道就是在TCP裡面建立了一個從客戶端發起和服務端接收的一個連結,TCP連結在建立的時候是有一個三次握手(三次網路傳輸)這樣一個消耗在的。

三次握手時序圖

圖片描述
第一次握手: 建立連線,客戶端A傳送SYN=1、隨機產生Seq=client_isn的資料包到伺服器B,等待伺服器確認。

第二次握手: 伺服器B收到請求後確認聯機(可以接受資料),發起第二次握手請求,ACK=(A的Seq+1)、SYN=1,隨機產生Seq=client_isn的資料包到A。

第三次握手: A收到後檢查ACK是否正確,若正確,A會在傳送確認包ACK=伺服器B的Seq+1、ACK=1,伺服器B收到後確認Seq值與ACK值,若正確,則建立連線。

TCP標示

  1. SYN(synchronous建立聯機)
  2. ACK(acknowledgement 確認)
  3. Sequence number(順序號碼)

三次握手資料包詳細內容分析

這裡採用的是,是一個很好的網路資料包抓取和分析軟體。

示例採用的網址,windows下開啟cmd、Mac下開啟終端ping下得到ip可以利用wireshark工具進行一次ip地址過濾,只分析指定的資料。

  • 第一次握手,客戶端傳送一個TCP,標誌位為SYN,Seq(序列號)=0,代表客戶端請求建立連結,如下圖所示

圖片描述

  • 第二次握手,伺服器發回資料包,標誌位為[SYN, ACK],ACK設定為客戶端第一次握手請求的Seq+1,即ACK=0+1=1,在隨機產生一個Seq的資料包到客戶端。

圖片描述

  • 第三次握手請求,客戶端在次傳送確認資料包,標識位為ACK,把伺服器發來的Seq+1,即ACK=0+1,傳送給伺服器,伺服器成功收到ACK報文段之後,連線就建立成功了。

圖片描述

總結

至於為什麼要經過三次握手呢,是為了防止服務端開啟一些無用的連結,網路傳輸是有延時的,中間可能隔著非常遠的距離,透過光纖或者中間代理伺服器等,客戶端傳送一個請求,服務端收到之後如果直接建立一個連結,返回內容給到客戶端,因為網路傳輸原因,這個資料包丟失了,客戶端就一直接收不到伺服器返回的這個資料,超過了客戶端設定的時間就關閉了,那麼這時候服務端是不知道的,它的埠就會開著等待客戶端傳送實際的請求資料,服務這個開銷也就浪費掉了。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/36/viewspace-2812611/,如需轉載,請註明出處,否則將追究法律責任。

相關文章