什麼是TCP粘包/拆包問題
TCP以流方式傳輸,是沒有界限的一串數據,並無消息邊界。 - TCP傳輸數據時,會根據底層的TCP緩存區實際狀況進行數據包劃分: - 1.業務上定義的完整數據(比方說一個完整的json串),可能會被TCP拆分紅多個數據包進行發送(拆包)。 - 2.業務上特殊含義的獨立數據,也有可能由於大小或者緩衝區緣由,被TCP封裝成一個大數據包發送(粘包)。
經過一個圖來理解
經過圖咱們能夠發現,數據包接收有不少狀況: 一、沒有粘包拆包,終端2收到了完整的數據包A和數據包B。 二、終端2一次性讀取到數據包A和數據包B,這就是粘包。 三、終端2讀取到完整的數據包A和部分數據包B1,第二次纔讀取到數據包B剩餘部分(數據包B2),這就是拆包。 四、相似第三點,數據包A也有可能分紅兩部分(A一、A2), 被先後讀取。 五、假設數據包很大,那麼可能產生屢次拆包,如數據包A分N次被讀取。