使用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 採用...