banner
cells

cells

为美好的世界献上 bug

TCP

TCP/IP 協議三次握手(Three Way Handshake)#

三次握手是用於建立客戶端與伺服器的 TCP 連接,確保連接是可靠的、同步的。

  1. 第一次握手:SYN

    • 客戶端向伺服器發送一個 SYN(Synchronize)報文,表示請求建立連接。
    • 客戶端進入 SYN-SENT 狀態,等待伺服器響應。
    客戶端 - SYN ---> 伺服器
    
  2. 第二次握手:SYN-ACK

    • 伺服器受到客戶端的 SYN 報文後,回應一個 SYN-ACK(Synchronize Acknowledge)報文,表示接受並同意建立連接,同時也向客戶端發送一個 SYN,請求建立反向連接。
    • 伺服器進入 SYN-RECEIVED 狀態。
    客戶端 <--- SYN-ACK - 伺服器
    
  3. 第三次握手:ACK

    • 客戶端收到伺服器的 SYN-ACK 報文後,發送一個確認 ACK 報文,表示連接已建立。
    • 客戶端進入 ESTABLISHED 狀態,伺服器收到 ACK 後也進入 ESTABLISHED 狀態。
    客戶端 - ACK ---> 伺服器
    

三次握手的目的#

確保雙方能正確發送和接收數據,並同步雙方的序列號。

解釋 TCP 需要三次握手的原因#

三次握手是為了確保雙方都有發送和接收的能力(雙方都要確認對方有發送和接收的能力)。

  • 第一次握手:客戶端告訴伺服器,自己可以發送數據。
  • 第二次握手:伺服器告訴客戶端,自己可以收發數據。
  • 第三次握手:客戶端告訴伺服器,自己可以接收數據。

TCP/IP 協議四次揮手(Four Way Handshake)#

四次回收用於斷開客戶端與伺服器的連接,由於 TCP 是全雙工協議,連接斷開時需要雙方各自關閉發送和接收通道,因此需要四次揮手來完成斷開操作。

  1. 第一次揮手:FIN

    • 客戶端發送 FIN(Finish)報文,表示不再發送數據,但仍可以接收數據。
    • 客戶端進入 FIN-WAIT-1 狀態。
    客戶端 - FIN ---> 伺服器
    
  2. 第二次揮手:ACK

    • 伺服器受到客戶端的 FIN 報文後,發送一個 ACK 報文,表示確認受到 FIN 報文,但伺服器仍可能有數據需要發送。
    • 伺服器進入 CLOSE-WAIT 狀態,客戶端進入 FIN-WAIT-2 狀態。
    客戶端 <--- ACK - 伺服器
    
  3. 第三次揮手:FIN

    • 伺服器完成數據發送後,向客戶端發送 FIN 報文,表示數據傳輸結束,準備關閉連接。
    • 伺服器進入 LAST-ACK 狀態。
    客戶端 <--- FIN - 伺服器
    
  4. 第四次揮手:ACK

    • 客戶端收到伺服器的 FIN 報文後,發送一個 ACK 報文,表示確認關閉連接。
    • 客戶端進入 TIME-WAIT 狀態,等待一段時間(一般為 2 * MSL,最大報文存活時間)後,正式關閉連接,進入 CLOSED 狀態。伺服器在收到 ACK 後立即進入 CLOSED 狀態。
    客戶端 - ACK ---> 伺服器
    

簡述 TCP 擁塞控制算法#

  • 慢啟動:建立連接後,初始化發送窗口大小,隨著每次發送 ACK 到達,窗口大小呈指數級增長,直到達到擁塞閾值。
  • 擁塞避免:當窗口大小達到閾值後,發送方每次只增加一個 MSS。
  • 快速重傳:在沒有等待超時的情況下,接收方連續發送 3 個重複的 ACK 時,發送方立即重傳相應的報文段。
  • 快速恢復:當進入快速重傳階段後,發送方將窗口減半。

簡述 MTU 和 MSS#

MTU(Maximum Transmission Unit):最大傳輸單元,表示網路層一次能傳輸的最大數據包大小,以太網通常為 1500 Byte。

MSS(Maximum Segment Size):最大報文段大小,TCP 層能夠發送的單個數據段的最大字節數,通常是 MTU 減去 TCP/IP 頭部大小。

TCP 粘包問題#

當客戶端發送多個數據包給伺服器時,伺服器底層的 TCP 接收緩衝區受到的數據為粘在一起的。

TCP 底層通信是面向字節流的,面向連接的協議,TCP 保證發送數據的準確性和順序性,字節流以字節為單位。

假設 TCP 緩衝區的大小為 10 個字節,當發送 4 個字節的數據("aaaa"),緩衝區還剩餘 6 個字節的空閒空間,再次發送 7 個字節的數據("bbbbbbc"),則客戶端第一次接收的數據是 "aaaabbbbbb" ,剩餘 1 個字節的數據未發送,等待下一次發送。

TCP 粘包產生的原因#

多個小數據包在傳輸過程中粘在一起,接收端無法區分這些包的邊界,導致接收到的數據合併在一起。

  1. (發的太快)當客戶端的發送頻率遠高於伺服器的接收頻率。
  2. (發的太少)TCP 底層的安全和效率機制,其不允許字節數特別少的小包發送頻率過高,TCP 會在底層累計到一定大小才一起發送。(Nagle
  3. (緩衝區殘留)發送端的緩衝區中有上一次未發送完的數據,或接收端的緩衝區中有未取出的數據。

TCP 黏包處理的方式#

主要採用應用層定義收發包格式的方法,俗稱切包處理

使用 TLV 協議#

TLV(Type Length Value)協議。

+---------+---------+---------+
|  type   |  length |  value  |
+---------+---------+---------+

打包發送的數據,解包接收的數據。

使用分隔符#

在報文之間增加特殊字符

設置固定長度的報文#

規定報文的長度,接收方根據長度拆分。

TCP 實現全雙工的方式#

  1. 獨立的發送和接收緩衝區,通信雙方都有一個發送緩衝區和接收緩衝區,通信雙方在發送數據時可以接收數據,反之依然。
  2. 獨立的序列號和確認機制,TCP 將要發送的數據流切分為多個報文段,每個報文段的字節都有唯一的序列號,確保發送的數據包在整個數據流中的位置,接收方可以根據序列號判斷數據的正確順序以及是否有丟包。
  3. 流量控制,TCP 通過控制滑動窗口機制調整發送速率,保證不會讓接收方的緩衝區溢出(被數據淹沒)。
  4. 擁塞控制,控制通過調節發送方的發送速率來防止網路過載。
載入中......
此文章數據所有權由區塊鏈加密技術和智能合約保障僅歸創作者所有。