Unity Socket傳輸 TCP粘包和拆包原因以及解決策略

問題產生
一個完整的業務可能會被TCP拆分成多個包進行發送,也有可能把多個小的包封裝成一個大的數據包發送,這個就是TCP的拆包和封包問題。
下面可以看一張圖,是客戶端向服務端發送包:

1. 第一種情況,Data1和Data2都分開發送到了Server端,沒有產生粘包和拆包的情況。
2. 第二種情況,Data1和Data2數據粘在了一起,打成了一個大的包發送到Server端,這個情況就是粘包
3. 第三種情況,Data2被分離成Data2_1和Data2_2,並且Data2_1在Data1之前到達了服務端,這種情況就產生了拆包
由於網絡的複雜性,可能數據會被分離成N多個複雜的拆包/粘包的情況,所以在做TCP服務器的時候就需要首先解決拆包/粘包的問題。

TCP粘包和拆包產生的原因
1. 應用程序寫入數據的字節大小大於套接字發送緩衝區的大小
2. 進行MSS大小的TCP分段。MSS是最大報文段長度的縮寫。MSS是TCP報文段中的數據字段的最大長度。數據字段加上TCP首部纔等於整個的TCP報文段。所以MSS並不是TCP報文段的最大長度,而是:MSS=TCP報文段長度-TCP首部長度
3. 以太網的payload大於MTU進行IP分片。MTU指:一種通信協議的某一層上面所能通過的最大數據包大小。如果IP層有一個數據包要傳,而且數據的長度比鏈路層的MTU大,那麼IP層就會進行分片,把數據包分成若干片,讓每一片都不超過MTU。注意,IP分片可以發生在原始發送端主機上,也可以發生在中間路由器上。

TCP粘包和拆包的解決策略
1. 消息定長。例如100字節。
2. 在包尾部增加回車或者空格符等特殊字符進行分割,典型的如FTP協議
3. 將消息分爲消息頭和消息尾。
4. 其它複雜的協議,如RTMP協議等。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章