TCP協議中的粘包分包問題

2021-10-08 01:28:03 字數 1155 閱讀 6944

使用tcp協議進行網路遊戲開發的時候,有粘包和分包兩個問題。

粘包和分包是利用socket在tcp協議下內部的優化機制,在使用tcp協議進行資料的傳輸進行通訊的時候,會出現粘包分包問題的話,是由於優化導致,即內部的資料傳輸機制所導致的。

在客戶端呼叫send()方法傳送資料,每傳送的資料稱為包

當傳送資料比較頻繁的時候,且資料的內容較短。不會立馬傳送伺服器,會包包結合進行打包,伺服器收到多條訊息但是只呼叫一次。伺服器接收到的訊息不一定是一條訊息,可能是多條訊息的整合。

// 向服務端傳送100條資料

for(

int i =

0; i <

100; i++

)

實際客戶端傳送100次資料。會看到服務端只從客戶端只接收了1次資料。

再次測試發現傳送的100次資料,服務端只接受了3次。所以伺服器粘包也是不固定的,他與執行的快慢有關 。

不管粘包多少條資料,從客戶端傳送來的資料的順序是不會改變的。

與粘包相似,傳送特別大的資料量,可能進行分包傳送。分成多條訊息傳送給伺服器。包大占用網速時間都比較長。乙個包被分為10次,伺服器會接收10次。

分包問題不在於傳送有多快,而在於傳送的資料有多大。如圖客戶端傳送一條大的資料,伺服器接收兩次。

同步接受即使接收陣列足夠大,資料太大也會進行分包,非同步的方式陣列太大不會產生分包。接收的陣列在做網路遊戲時,由於伺服器每條接收的訊息僅包含位置資訊等小資料,設定1024就可以。

所以每一次讀到訊息的時候需要知道,一次接收裡面包含多少條訊息,然後再進行處理。

補充說明

關於上圖中的亂碼,伺服器收到的第二條訊息的時候前面有兩個字元是亂碼,這是因為漢字字元的關係,因為我這裡測試的資料用的是漢字,由於漢字不可拆分這才造成亂碼,但不影響後面的資料處理,只要保證時序的重要性就可以了。

TCP粘包分包現象

服務端,接收資料,在每次接收到的資料末尾添上乙個 尾 字 客戶端傳送資料,將同樣的資料連續傳送若干次 不是將資料複製若干份一次傳送 using system using system.collections.generic using system.componentmodel using syst...

Qt的TCP粘包分包

粘包只可能出現在流傳輸中,tcp是基於流傳輸的,而udp是不會出現粘包,因為udp是基於報文的,也就是說udp傳送端呼叫幾次write,接收端必須呼叫相同次數的read讀完,每次最多只能讀取乙個報文,報文與報文是不會合併的,如果緩衝區小於報文長度,則多出來的部分會被丟掉。tcp不同了,它會合併訊息,...

TCP以及TCP中的粘包與分包

1.tcp tcp 確認,重傳機制,按序到達 擁塞控制 防止過多的資料注入到網路中 流量控制 流量控制所要做的就是抑制傳送端傳送資料的速率,以便使接收端來得及接收 不同的協議層對資料報有不同的稱謂,在傳輸層叫做段 segment 在網路層叫做資料報 datagram 在鏈路層叫做幀 frame 採用...