最近研究netty網路程式設計,以前專案中也遇到過資料接收過程中資料質量太差問題,很可能是tcp傳輸過程中問題,特此記錄。
乙個完整的業務可能會被tcp拆分成多個包進行傳送,也有可能把多個小的包封裝成乙個大的資料報傳送,這個就是tcp的拆包和封包問題。
下面可以看一張圖,是客戶端向服務端傳送包:
1. 第一種情況,data1和data2都分開發送到了server端,沒有產生粘包和拆包的情況。
2. 第二種情況,data1和data2資料粘在了一起,打成了乙個大的包傳送到server端,這個情況就是粘包。
3. 第三種情況,data2被分離成data2_1和data2_2,並且data2_1在data1之前到達了服務端,這種情況就產生了拆包。
由於網路的複雜性,可能資料會被分離成n多個複雜的拆包/粘包的情況,所以在做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分片可以發生在原始傳送端主機上,也可以發生在中間路由器上。
1. 訊息定長。例如100位元組。
2. 在包尾部增加回車或者空格符等特殊字元進行分割,典型的如ftp協議
3. 將訊息分為訊息頭和訊息尾。
4. 其它複雜的協議,如rtmp協議等。
TCP粘包和拆包
當傳送包同時傳送兩個資料報時,接收包只收到了乙個資料報,其中包含了兩個資料報的資訊,這種現象為粘包。這種情況下,接收方無法分清兩個資料報的界限,很難處理 當傳送包同時傳送兩個資料報時,接收方也收到了兩個資料報。但是這兩個資料報,乙個是不完整的,乙個是多出來一塊,這種現象為拆包。訊息定長 傳送方將資料...
TCP粘包 拆包
tcp粘包 拆包 客戶端發服務端傳送了兩個資料報a和b 粘包 服務端一次性接收到了a和b 拆包 服務端第一次接收了a和b的一部分,第二次接收到了b的剩餘部分 粘包 拆包原因 1 應用程式寫入的位元組大小 socket傳送緩衝區大小 2 tcp分段 tcp data部分的大小 mss max segm...
TCP粘包,拆包
粘包 拆包表現形式 現在假設客戶端向服務端連續傳送了兩個資料報,用packet1和packet2來表示,那麼服務端收到的資料可以分為三種,現列舉如下 第一種情況,接收端正常收到兩個資料報,即沒有發生拆包和粘包的現象,此種情況不在本文的討論範圍內。第二種情況,接收端只收到乙個資料報,由於tcp是不會出...