TCP通訊處理粘包詳解

2021-07-29 07:17:59 字數 1048 閱讀 3695

在平時交流過程發現一些朋友即使做了這些協議的處理,但有時在處理資料的時候也會出現資料不對的情況。這主要原因他們在一些個別情況下沒有處理好。因為當一系列的訊息傳送過來的時候,對於4節字頭或結束符分布位置都是不確定的。一種簡單的情況就是當前訊息處理完成後,緊接著就是處理一下個訊息的4節字描述,但在實際情況下當前接收的buffer剩下的內容有可能不足4節字的。如果你想通過通訊的程式來測這情況相對來說觸發的機率性不高,所以對於協議分析的功能最好通過單元測試來模擬。

通過下面這個圖可以更清晰地了解協議標記資料分布的情況

下面簡單地介紹一下4位元組描述大小和結束符和處理方式。

4位元組大小描述方式
複製**

1 public void import(byte data, int start, int count)

2 12 if (mchecksize.length == -1)

13

20 }

21 else

22

31 }

32 }

33 }

34 }

35 36

37 public void import(byte value)

38

46 else

47

50 }

複製**

**很簡單如果沒有長度描述的情況就把資料匯入到訊息長度描述的buffer中,如果當前buffer滿足4位的情況直接得到相應長度。後面的工作就是獲取相應長度的buffer即可。

結束符方式
複製**

1 public void import(byte data, int start, int count)

2 11 if (data[x] == meof[0])

12

21 }

22 else

23

28 }

29 }

複製**

結束符的處理方式就相對來說簡單多了。

處理tcp粘包問題

tcp是位元組流,無邊界,udp是訊息,是有邊界的。就是udp返回的就是乙個訊息。所以tcp會產生粘包問題。如何解決粘包問題,所以我們要在應用層維護訊息與訊息的邊界。比如說定長包,包尾加 r n ftp 包頭加包體長度,更複雜的應用層協議。readn接受確切資料的讀操作 cli include in...

TCP粘包的拆包處理

因為tcp是流式處理的,所以包沒有邊界,必須設計乙個包頭,裡面表示包的長度 一般用位元組表示 根據這個來逐個拆包。如果對於傳送 接收頻率不高的話,一般也就不做拆包處理了,因為不大可能有粘包現象。以下是粘包和拆包的分析 用qt的tcpsocket讀出的資料來拆 1 m imp m thread boo...

swoole 對tcp粘包處理

1,在短時間內資料傳送過快時,會發生粘包現象,比如下面的 這個現象是雙向的,客戶端,服務端均可能出現此問題 下面只是以客戶端 to 服務端舉例 server.php host 0.0.0.0 建立server物件,監聽 127.0.0.1 9501埠 serv new swoole server h...