1. 程式人生 > >TCP通訊粘包問題分析和解決

TCP通訊粘包問題分析和解決

什麼時候需要考慮粘包問題?
1.如果利用tcp每次傳送資料,就與對方建立連線,然後雙方傳送完一段資料後,就關閉連線,這樣就不會出現粘包問題(因為只有一種包結構,類似於http協議)。
關閉連線主要是要雙方都發送close連線(參考tcp關閉協議)。如:A需要傳送一段字串給B,那麼A與B建立連線,然後傳送雙方都預設好的協議字元如"hello give me sth abour yourself",然後B收到報文後,就將緩衝區資料接收,然後關閉連線,這樣粘包問題不用考慮到,因為大家都知道是傳送一段字元。

2.如果傳送資料無結構,如檔案傳輸,這樣傳送方只管傳送,接收方只管接收儲存就ok,也不用考慮粘包3如果雙方建立連線,需要在連線後一段時間內傳送不同結構資料,如連線後,有好幾種結構:
1)"hellogive me sth abour yourself"
2)"Don'tgive me sth abour yourself"

那這樣的話,如果傳送方連續傳送這個兩個包出去,接收方一次接收可能會是"hellogive me sth abour yourselfDon't give me sth abour yourself"這樣接收方就傻了,到底是要幹嘛?不知道,因為協議沒有規定這麼詭異的字串,所以要處理把它分包,怎麼分也需要雙方組織一個比較好的包結構,所以一般可能會在頭加一個數據長度之類的包,以確保接收。

粘包出現原因:
簡單得說,在流傳輸中出現,UDP不會出現粘包,因為它有訊息邊界(參考Windows網路程式設計)
1.傳送端需要等緩衝區滿才傳送出去,造成粘包

2.接收方不及時接收緩衝區的包,造成多個包接收

TCP無保護訊息邊界的解決:
針對這個問題,一般有3種解決方案:
(1)傳送固定長度的訊息
(2)把訊息的尺寸與訊息一塊傳送
(3)使用特殊標記來區分訊息間隔