在咱們TCP傳輸數據的時候,由於TCP底層並不瞭解上層業務數據的具體含義,它會根據緩衝區的實際狀況進行包的劃分,可能會把一個大的包拆成多個包進行發送,也有可能將不少小包封裝成大的數據發送,這就是TCP的拆包和粘包。服務器
按照上圖,因爲服務器一次讀取到的字節數是不肯定的。可能存在如下4中狀況服務器端
一、服務器兩次讀取到兩個獨立的包D1和D2,不存在粘包和拆包的狀況im
二、服務器一次接受到兩個包,D2和D1兩個粘在一塊兒,這就是粘包數據
三、這裏有個地方錯了,第三個應該是D2_2,服務器第一次讀取到了D1的完整包,和D2的部分。第二次讀取D2剩下的部分img
四、服務器第一次讀取到了D1的一部分,第二次讀取到了D2和剩下的D1部分服務端
如上所述,若是服務端的TCP接受滑窗很是小,而D1和D2比較大,可能會形成服務器端要不少次才能將兩個包徹底接受,期間發生屢次的拆包。底層