TCP粘包和拆包原因
最近研究Netty網絡編程,以前項目中頁遇到過數據接收過程中數據質量太差問題,很可能是TCP傳輸過程中問題,特此記錄。
?
問題產生
一個完整的業務可能會被TCP拆分成多個包進行發送,也有可能把多個小的包封裝成一個大的數據包發送,這個就是TCP的拆包和封包問題。
下面可以看一張圖,是客戶端向服務端發送包:
1.第一種情況,Data1和Data2都分開發送到了Server端,沒有產生粘包和拆包的情況。
2.第二種情況,Data1和Data2數據粘在了一起,打成了一個大的包發送到Server端,這個情況就是粘包。
3.第三種情況,Data2被分離成Data2_1和Data2_2, 并且Data2_1在Data1之前到達了服務端,這種情況就產生了拆包。
由于網絡的復雜性,可能數據會被分離成N多個復雜的拆包/粘包的情況,所以在做TCP服務器的時候就需要首先解決拆包/粘包的問題。
?
TCP粘包和拆包產生的原因
1.應用程序寫入數據的字節大小大于套接字發送緩沖區的大小,啟用Nagle算法對較小的數據包進行合并。
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協議等。
?
總結
以上是生活随笔為你收集整理的TCP粘包和拆包原因的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Unity3D对手机屏幕触摸的控制脚本
- 下一篇: sqlmap的使用----进阶