tcp粘包情況分析

2022-03-14 20:28:08 字數 1328 閱讀 6355

1 什麼是粘包現象

tcp粘包

是指傳送方傳送的若干包資料到接收方接收時粘成一包,從接收緩衝區看,後一包資料的頭緊接著前一包資料的尾。在tcp長連線時,傳送端發到buffer裡面,接收端也有個buffer。如果沒有及時從buf中取出,會造成粘包現象。

2 為什麼出現粘包現象

(1)傳送方原因

我們知道,tcp缺省會使用nagle演算法。而nagle演算法主要做兩件事:1)只有上乙個分組得到確認,才會傳送下乙個分組;

2)收集多個小分組,在乙個確認到來時一起傳送。

所以,正是nagle演算法造成了傳送方有可能造成粘包現象。

(2)接收方原因

tcp接收到分組時,並不會立刻送至應用層處理,或者說,應用層並不一定會立即處理;實際上,tcp將收到的分組儲存至接收快取裡,然後應用程式主動從快取裡讀收到的分組。這樣一來,如果tcp接收分組的速度大於應用程式讀分組的速度,多個包就會被存至快取,應用程式讀時,就會讀到多個首尾相接粘到一起的包。

3 什麼時候需要處理粘包現象

(1)如果傳送方傳送的多個分組本來就是同乙個資料的不同部分,比如乙個很大的檔案被分成多個分組傳送,這時,當然不需要處理粘包的現象;

(2)但如果多個分組本毫不相干,甚至是並列的關係,我們就一定要處理粘包問題了。比如,我當時要接收的每個分組都是乙個有固定格式的商品資訊,如果不處理粘包問題,每個讀進來的分組我只會處理最前邊的那個商品,後邊的就會被丟棄。這顯然不是我要的結果。

4 如何處理粘包現象

(1)傳送方

對於傳送方造成的粘包現象,我們可以通過關閉nagle演算法來解決,使用tcp_nodelay選項來關閉nagle演算法。

(2)接收方

遺憾的是tcp並沒有處理接收方粘包現象的機制,我們只能在應用層進行處理。

(3)應用層處理

應用層的處理簡單易行!並且不僅可以解決接收方造成的粘包問題,還能解決傳送方造成的粘包問題。

解決方法就是迴圈處理:應用程式在處理從快取讀來的分組時,讀完一條資料時,就應該迴圈讀下一條資料,直到所有的資料都被處理;但是如何判斷每條資料的長度呢?

兩種途徑:

1)設定時間間隔:傳送乙個資料之後(位元組流),延時那麼10ms,然後繼續傳送;

2)傳送長度:傳送每條資料的時候,將資料的長度一併傳送,比如可以選擇每條資料的前4位是資料的長度,應用層處理時可以根據長度來判斷每條資料的開始和結束。

3)傳輸層的短連線不建議!

當時在做購物車的時候,我最開始的做法是設定開始符(0x7e)和結束符(0xe7),但在測試大量資料的時候,發現了資料異常。正如我所猜測,在除錯過程中發現某些資料內部包含了它們。因為要處理的資料是量非常龐大,為做到萬無一失,最後我採用了傳送長度的方式。再也沒有因為粘包而出過問題。

TCP粘包 拆包

tcp粘包 拆包 客戶端發服務端傳送了兩個資料報a和b 粘包 服務端一次性接收到了a和b 拆包 服務端第一次接收了a和b的一部分,第二次接收到了b的剩餘部分 粘包 拆包原因 1 應用程式寫入的位元組大小 socket傳送緩衝區大小 2 tcp分段 tcp data部分的大小 mss max segm...

TCP粘包,拆包

粘包 拆包表現形式 現在假設客戶端向服務端連續傳送了兩個資料報,用packet1和packet2來表示,那麼服務端收到的資料可以分為三種,現列舉如下 第一種情況,接收端正常收到兩個資料報,即沒有發生拆包和粘包的現象,此種情況不在本文的討論範圍內。第二種情況,接收端只收到乙個資料報,由於tcp是不會出...

TCP粘包 拆包

粘包 拆包問題是網路比較底層的問題,在資料鏈路層 網路層以及傳輸層都有可能發生。我們日常的網路應用開發大都在傳輸層進行,由於udp有訊息保護邊界,不會發生粘包拆包問題,因此粘包拆包問題只發生在tcp協議中。假設客戶端向服務端連續傳送了兩個資料報,用packet1和packet2來表示,那麼服務端收到...