1、粘包的概念
粘包:多個數據包被連續存儲於連續的緩存中,在對數據包進行讀取時由於無法確定發生方的發送邊界,而采用某一估測值大小來進行數據讀出,若雙方的size不一致時就會使指發送方發送的若干包數據到接收方接收時粘成一包,從接收緩沖區看,后一包數據的頭緊接着前一包數據的尾。
2、出現粘包的原因
出現粘包現象的原因是多方面的,它既可能由發送方造成,也可能由接收方造成。
發送方引起的粘包是由TCP協議本身造成的,TCP為提高傳輸效率,發送方往往要收集到足夠多的數據后才發送一包數據。若連續幾次發送的數據都很少,通常TCP會根據優化算法把這些數據合成一包后一次發送出去,這樣接收方就收到了粘包數據。
接收方引起的粘包是由於接收方用戶進程不及時接收數據,從而導致粘包現象。這是因為接收方先把收到的數據放在系統接收緩沖區,用戶進程從該緩沖區取數據,若下一包數據到達時前一包數據尚未被用戶進程取走,則下一包數據放到系統接收緩沖區時就接到前一包數據之后,而用戶進程根據預先設定的緩沖區大小從系統接收緩沖區取數據,這樣就一次取到了多包數據。
3、粘包的處理方式:
(1)當時短連接的情況下,不用考慮粘包的情況
(2)如果發送數據無結構,如文件傳輸,這樣發送方只管發送,接收方只管接收存儲就ok,也不用考慮粘包
(3)如果雙方建立長連接,需要在連接后一段時間內發送不同結構數據
接收方創建預處理線程,對接收到的數據包進行預處理,將粘連的包分開;
分包是指在出現粘包的時候我們的接收方要進行分包處理。(在長連接中都會出現) 數據包的邊界發生錯位,導致讀出錯誤的數據分包,進而曲解原始數據含義。
粘包情況有兩種,一種是粘在一起的包都是完整的數據包,另一種情況是粘在一起的包有不完整的包。