TCP的粘包現象

2021-08-18 10:34:57 字數 1270 閱讀 4269

1 什麼是粘包現象

tcp粘包是指傳送方傳送的若干包資料到接收方接收時粘成一包,從接收緩衝區看,後一包資料的頭緊接著前一包資料的尾。

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)格式化資料:每條資料有固定的格式(開始符、結束符),這種方法簡單易行,但選擇開始符和結束符的時候一定要注意每條資料的內部一定不能出現開始符或結束符;

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

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

tcp粘包現象

二 什麼時候需要考慮粘包問題?1 如果利用tcp每次傳送資料,就與對方建立連線,然後雙方傳送完一段資料後,就關閉連線,這樣就不會出現粘包問題 因為只有一種包結構,類似於http協議 關閉連線主要要雙方都傳送close連線 參考tcp關閉協議 如 a需要傳送一段字串給b,那麼a與b建立連線,然後傳送雙...

TCP的粘包現象

原文 看面經時,看到有面試官問tcp的粘包問題。想起來研一做購物車處理資料更新時遇到粘包問題,就總結一下吧。1 什麼是粘包現象 tcp粘包是指傳送方傳送的若干包資料到接收方接收時粘成一包,從接收緩衝區看,後一包資料的頭緊接著前一包資料的尾。2 為什麼出現粘包現象 1 傳送方原因 所以,正是nagle...

TCP的粘包現象

原文 看面經時,看到有面試官問tcp的粘包問題。想起來研一做購物車處理資料更新時遇到粘包問題,就總結一下吧。1 什麼是粘包現象 tcp粘包是指傳送方傳送的若干包資料到接收方接收時粘成一包,從接收緩衝區看,後一包資料的頭緊接著前一包資料的尾。2 為什麼出現粘包現象 1 傳送方原因 所以,正是nagle...