TCP的三次握手/四次揮手和TCP長連接和短連接的區別


TCP報文常用:

 Seq序號:占32位,用來標識從TCP源端向目的端發送的字節流,發起方發送數據時對此進行標記

 確認序號:Ack序號,占32位,只有ACK標志位為1時,確認序號字段才有效,Ack=Seq+1

 標志位:

  • SYN:發起一個新連接
  • ACK:確認序號有效
  • FIN  :釋放一個連接

一.TCP的三次握手

三次握手:建立TCP連接 即建立一個TCP連接時 需要客戶端和服務端發送三個包確認連接的建立 

  • 完成TCP三次握手,客戶端和服務端開始傳遞數據
  • TCP連接如果保持 則不會有多次三次握手的產生  

第一次握手:客戶端將標識位SYN設置為1 並且隨機產生一個字節流值seq=J,並將該數據包發送給服務器,客戶端進入SYN_SENT狀態,等待服務器確認

(客戶端詢問服務器是否可以使用)

第二次握手:服務器接收到數據包后,通過SYN=1知道客戶端要求建立連接 ,服務器設置SYN=1,ACK=1,ack=J+1 來隨機產生一個seq=k,將該數據包發送給客戶端

來確認請求連接 服務端進入SYN_REVD狀態

(服務器告訴瀏覽器可以使用)

第三次握手:客戶端接收到確認后 檢查ack是否為J+1 ACK=1 如果正確 則將標識位ACK=1 ask=K+1發送給服務端 服務端檢查數據包是否正確 如果正確則建立連接,並且客戶端和服務端都進入ESTABLISHED狀態 完成三次握手 隨后客戶端和服務端讀可以建立連接啦
(客戶端二次告訴服務器明白啦 接下來可以進行請求)

 

二,TCP的四次揮手

四次揮手:終止TCP連接  即斷開一個TCP連接時 需要客戶端和服務端共發送4個包確認斷開連接 

情況一:一方主動關閉,另一方被動關閉

第一次揮手:客戶端發送一個FIN 用來關閉客戶端和服務端的數據傳送 客戶端進入FIN_WINT_1狀態

第二次揮手:服務端收到FIN后 發送一個ack給客戶端 確認序號為收到序號M+1 服務器進入CLOSE_WAIT狀態

第三次揮手:服務端發送一個FIN  用來關閉服務端到客戶端的數據傳輸 服務端進入LAST_ACK狀態

第四次揮手:客戶端收到FIN后 發送一個ACK給服務端 確認序號為N+1 服務端進入CLOSED狀態 完成四次揮手

情況二:同時發起主動關閉

為何要三次握手?

為了防止服務端對客戶端開啟較多的無用連接,而導致的服務器的開銷

網絡傳輸有延時(有時候距離較遠)如果說客戶端發送包給服務器 服務器直接創建TCP連接返回內容給客戶端 如果中間數據包丟失 客戶端有超時時間關閉重新發送數據包 而服務端不清楚客戶端連接是否成功 開啟多次TCP請求

為何三次握手四次揮手?

 服務端在監聽狀態下,收到建立連接請求的SYN報文后,把ACK和SYN放在一個報文里發送給客戶端。而關閉連接時,當收到對方的FIN報文時,僅僅表示對方不再發送數據了但是還能接收數據,自己也未必全部數據都發送給對方了,所以自己可以立即close,也可以發送一些數據給對方后,再發送FIN報文給對方來表示同意現在關閉連接,因此,自己ACK和FIN一般都會分開發送

 

三.查看瀏覽器中TCP長連接還是短連接

TCP的連接分為長連接和短連接。

長連接:指在一個TCP連接上可以連續發送多個數據包,在TCP連接保持期間,如果沒有數據包發送,需要雙方發檢測包以維持此連接,

一般需要自己做在線維持。連接→數據傳輸→保持連接→數據傳輸→保持連接→……→關閉連接  (減少多次TCP的三次握手和四次揮手)

短連接:短連接是指通信雙方有數據交互時,就建立一個TCP連接,數據發送完成后,則斷開此TCP連接。 連接→數據傳輸→關閉連接

檢查F12->Network->頭信息

Request Headers :Connection:keep-alive    瀏覽器希望服務器返回的是長連接( 長連接:連接被保持不會請求結束就關閉
Response Headers :Connection:keep-alive    服務器可以返回長連接接keep-alive 短連接接:close 
一般項目中保持長連接 

HTTP和TCP的聯系?

同一個TCP連接中可以發送很多HTTP請求 一個HTTP請求一定在某一個TCP里面發送的 

在HTTP1.1中 同一個TCP連接里面連續發送多個請求 但是要按照順序返回 前一個等待時間過長 后面依舊要排隊 串行影響效率

在HTTP2中 同一個TCP連接里面連續發送多個請求不再需要按照順序來進行返回處理 可以同時返回第一個里面的數據 和第二個里面的數據 並行處理 更大限度使web效率質的提升

對於長連接如何查看HTTP請求里需要的TCP數量?

步驟:檢查F12->Network->Name/Status欄->右健->勾選Connection ID(TCP鏈接的id)  //記得提前勾選Disable catch禁止緩存 

 

 HTTP1.1 同一域名連續發送6條HTTP請求 建立6個TCP 從7個開始前面6個誰先加載完成 就復用誰的TCP連接

 HTTP2  同一域名可以共用同一個TCP 性能會有質的飛躍

 


免責聲明!

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



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