1. 程式人生 > >Tcp粘包和拆包的原因

Tcp粘包和拆包的原因

最近研究Netty網路程式設計,以前專案中也遇到過資料接收過程中資料質量太差問題,很可能是TCP傳輸過程中問題,特此記錄。

問題產生
一個完整的業務可能會被TCP拆分成多個包進行傳送,也有可能把多個小的包封裝成一個大的資料包傳送,這個就是TCP的拆包和封包問題。

下面可以看一張圖,是客戶端向服務端傳送包:
這裡寫圖片描述

上圖中第三中情況有誤,TCP為有序傳輸,順序應該是Data2_2 Data2_1 Data1

  1. 第一種情況,Data1和Data2都分開發送到了Server端,沒有產生粘包和拆包的情況。

  2. 第二種情況,Data1和Data2資料粘在了一起,打成了一個大的包傳送到Server端,這個情況就是粘包。

  3. 第三種情況,Data2被分離成Data2_1和Data2_2,並且Data2_1在Data1之前到達了服務端,這種情況就產生了拆包。

由於網路的複雜性,可能資料會被分離成N多個複雜的拆包/粘包的情況,所以在做TCP伺服器的時候就需要首先解決拆包/粘包的問題。

TCP粘包和拆包產生的原因
1. 應用程式寫入資料的位元組大小大於套接字傳送緩衝區的大小

  1. 進行MSS大小的TCP分段。MSS是最大報文段長度的縮寫。MSS是TCP報文段中的資料欄位的最大長度。資料欄位加上TCP首部才等於整個的TCP報文段。所以MSS並不是TCP報文段的最大長度,而是:MSS=TCP報文段長度-TCP首部長度

  2. 乙太網的payload大於MTU進行IP分片。MTU指:一種通訊協議的某一層上面所能通過的最大資料包大小。如果IP層有一個數據包要傳,而且資料的長度比鏈路層的MTU大,那麼IP層就會進行分片,把資料包分成若干片,讓每一片都不超過MTU。注意,IP分片可以發生在原始傳送端主機上,也可以發生在中間路由器上。

TCP粘包和拆包的解決策略
1. 訊息定長。例如100位元組。

  1. 在包尾部增加回車或者空格符等特殊字元進行分割,典型的如FTP協議

  2. 將訊息分為訊息頭和訊息尾。

  3. 其它複雜的協議,如RTMP協議等。

相關推薦

Tcp原因

最近研究Netty網路程式設計,以前專案中也遇到過資料接收過程中資料質量太差問題,很可能是TCP傳輸過程中問題,特此記錄。 問題產生 一個完整的業務可能會被TCP拆分成多個包進行傳送,也有可能把多個小的包封裝成一個大的資料包傳送,這個就是TCP的拆包和封包問

Unity Socket傳輸 TCP原因以及解決策略

3. 乙太網的payload大於MTU進行IP分片。MTU指:一種通訊協議的某一層上面所能通過的最大資料包大小。如果IP層有一個數據包要傳,而且資料的長度比鏈路層的MTU大,那麼IP層就會進行分片,把資料包分成若干片,讓每一片都不超過MTU。注意,IP分片可以發生在原始傳送端主機上,也可以發生在中間路由器上

tcp、斷

    while (1) {       var packLen = _.unpack('packLen', tcpBuffer.slice(0, 2));       len = packLen.len;       // console.log('pack len------:' + len);    

tcp的處理方案

隨著智慧硬體越來越流行,很多後端開發人員都有可能接觸到socket程式設計。而很多情況下,伺服器與端上需要保證資料的有序,穩定到達,自然而然就會選擇基於tcp/ip協議的socekt開發。開發過程中,經常會遇到tcp粘包,拆包的問題,本文將從產生原因,和解決方案以及work

Netty中處理TCP

什麼是粘包和拆包 TCP是個”流”協議,流其實就是沒有界限的一串資料。 TCP底層中並不瞭解上層業務資料的具體含義,它會根據TCP緩衝區的實際情況進行包劃分,所以在TCP中就有可能一個完整地包會被TCP拆分成多個包,也有可能吧多個小的包封裝成一個大的資料包傳

Netty學習10-

1 粘包拆包基本概念 TPC是一個面向流的協議。所謂流就是沒有邊界的一串資料,如同河水般連成一片,其中並沒有分界線。TCP底層並不瞭解上層業務資料的具體含義,它會根據TCP緩衝區的具體情況進行包的劃分,所以在業務上認為,一個完整的包可能會被TCP拆成多個包傳送,也有可能

CocoaAsyncSocket + Protobuf 處理問題

 在上一篇文章《iOS之ProtocolBuffer搭建和示例demo》分享環境的搭建, 我們和伺服器進行IM通訊用了github有名的框架CocoaAsynSocket, 然後和伺服器之間的資料媒介是ProtoBuf。然後後面在開發的過程中也碰到了拆包和粘包問題,這方面

Netty解決問題的四種方案

兩個 json反序列 obj 合並 間隔 分享圖片 發送數據 返回 想是 在RPC框架中,粘包和拆包問題是必須解決一個問題,因為RPC框架中,各個微服務相互之間都是維系了一個TCP長連接,比如dubbo就是一個全雙工的長連接。由於微服務往對方發送信息的時候,所有的請求都是使

Netty入門系列(2) --使用Netty解決問題

前言 上一篇我們介紹瞭如果使用Netty來開發一個簡單的服務端和客戶端,接下來我們來討論如何使用解碼器來解決TCP的粘包和拆包問題 TCP為什麼會粘包/拆包 我們知道,TCP是以一種流的方式來進行網路轉播的,當tcp三次握手簡歷通訊後,客戶端服務端之間就建立了一種通訊管道,我們可以想象成自來水管道,流出來的水

Netty中的解決方案

粘包和拆包是TCP網路程式設計中不可避免的,無論是服務端還是客戶端,當我們讀取或者傳送訊息的時候,都需要考慮TCP底層的粘包/拆包

SOCKET 封

資源 isl 個數 遊戲服務器 指正 長度 num 部分 程序開發 對於基於TCP開發的通訊程序,有個很重要的問題需要解決,就是封包和拆包.自從我從事網絡通訊編程工作以來(大概有三年的時間了),我一直在思索和改進封包和拆包的方法.下面就針對這個問題談談我的想法,拋磚引玉.若

描述在IPSec傳輸模式下ESP報文裝過程

        AH(Authentication Header):提供資料完整性驗證,通過Hash實現;資料來源身份認證,在計算驗證碼時加入共享金鑰;防止重放攻擊,AH包頭的序列號可防止重放攻擊。ESP(Encapsulating Security Payload):ESP的協議號是50,提供AH的三種服務

tcpupd、ip分片問題

我們都知道TCP屬於傳輸層的協議,傳輸層除了有TCP協議外還有UDP協議。那麼UDP是否會發生粘包或拆包的現象呢?答案是不會。UDP是基於報文傳送的,從UDP的幀結構可以看出,在UDP首部採用了16bit來指示UDP資料報文的長度,因此在應用層能很好的將不同的資料報文區分開,

TCP及解決方法、丟原因及解決辦法

粘包、拆包發生原因 發生TCP粘包或拆包有很多原因,現列出常見的幾點,可能不全面,歡迎補充, 1、要傳送的資料大於TCP傳送緩衝區剩餘空間大小,將會發生拆包。 2、待發送資料大於MSS(最大報文長度),TCP在傳輸前將進行拆包。 3、要傳送的資料小於

tcp

傳輸 packet ima .cn bsp log src blog 一次 粘包、拆包發生原因:發生TCP粘包或拆包有很多原因,現列出常見的幾點,可能不全面,歡迎補充,1、要發送的數據大於TCP發送緩沖區剩余空間大小,將會發生拆包。2、待發送數據大於MSS(最大報文長度),

C#.網路程式設計 Tcp基礎(二) TCP的原理

一、TCP粘包,拆包及解決方法    轉https://blog.csdn.net/scythe666/article/details/51996268 以下是轉發的部分內容          我們都知道TCP屬於傳

TCP問題

之前在做專案時,使用 Java NIO 來搭建伺服器端及客戶端程式,發現待發送的資料大於傳送緩衝區 ByteBuffer 大小時,將發生拆包情況,會把待發送的資料包分多次傳送到客戶端。當時是分配了更大的位元組緩衝區來解決這個問題,後來瞭解到這是 TCP 協議中的粘包與拆包問題。首先我們瞭解一下

TCP與通訊協議

在TCP程式設計中,通常Sever端與Client通訊時的訊息都有著固定的訊息格式,稱之為協議(protocol),例如FTP協議、Telnet協議等,有的公司也會自己開發協議。 那麼協議到底是幹什麼的呢?說白了,協議了就是定義了資料通訊的格式。主要是為了解決

關於TCP及解決方法

在進行Java NIO學習時,發現,如果客戶端連續不斷的向服務端傳送資料包時,服務端接收的資料會出現兩個資料包粘在一起的情況,這就是TCP協議中經常會遇到的粘包以及拆包的問題。 我們都知道TCP屬於傳輸層的協議,傳輸層除了有TCP協議外還有UDP協議。那麼UDP是否會發生粘包或拆包的現象呢?答案

TCP及解決方法

在進行Java NIO學習時,發現,如果客戶端連續不斷的向服務端傳送資料包時,服務端接收的資料會出現兩個資料包粘在一起的情況,這就是TCP協議中經常會遇到的粘包以及拆包的問題。 我們都知道TCP屬於傳輸層的協議,傳輸層除了有TCP協議外還有UDP協議。那麼UDP