解決TCP粘包演算法

2021-06-16 13:54:47 字數 1533 閱讀 9192

什麼是tcp粘包

tcp粘包就是通過tcp傳輸資料的時候,在接收方接收到的乙個資料報中包含的不是我們定義的n個完整的資料結構,也就是說n個資料結構頭尾相接,有時最後乙個或開頭乙個資料結構被截斷。

tcp粘包的原因

產生粘包的原因有兩種:一是傳送方造成的,二是接收方造成的。

傳送方引起的粘包是由tcp協議本身造成的,tcp為提高傳輸效率,傳送方往往要收集到足夠多的資料後才傳送一包資料。若連續幾次傳送的資料都很少,通常tcp會根據優化演算法把這些資料合成一包後一次傳送出去,這樣接收方就收到了粘包資料。

接收方引起的粘包是由於接收方使用者程序不及時接收資料,從而導致粘包現象。這是因為接收方先把收到的資料放在系統接收緩衝區,使用者程序從該緩衝區取資料,若下一包資料到達時前一包資料尚未被使用者程序取走,則下一包資料放到系統接收緩衝區時就接到前一包資料之後,而使用者程序根據預先設定的緩衝區大小從系統接收緩衝區取資料,這樣就一次取到了多包資料。

解決方法

既然粘包的原因有兩種,那麼我們就必須在傳送方和接收方想辦法。

1. 對於傳送方引起的粘包現象,使用者可通過程式設計設定來避免,tcp提供了強制資料立即傳送的操作指令push,tcp軟體收到該操作指令後,就立即將本段資料傳送出去,而不必等待傳送緩衝區滿。

但這樣做就等於關閉了tcp精心設計的優化演算法。push越多傳送越頻繁,勢必影響傳送端效率。

2. 對於接收方引起的粘包,則可通過優化程式設計、精簡接收程序工作量、提高接收程序優先順序等措施,使其及時接收資料,從而盡量避免出現粘包現象。

但這樣做只能減少出現粘包的可能性,但並不能完全避免粘包,當傳送頻率較高時,或由於網路突發可能使某個時間段資料報到達接收方較快,接收方還是有可能來不及接收,從而導致粘包。

因此,我推薦大家在收到資料之後在自己的程式中做一些處理,將收到的粘包拆開,雖然這樣做會對接收端的效率產生一點影響,但相較於前面兩種方法,這樣做簡單方便且解決粘包的成功率是百分之百。適用於大多數對實時效能要求不是非常高的程式。

演算法分析

由於是在做ios專案時遇到的這個問題,所以下面就貼出objectivec的**。

if (datasegment == nil) 

if (datasegment.length <= kminpacketlength) //如果緩衝區的資料還不夠我們定義的最小資料報長度,那麼不做處理繼續等待

nsmutabledata *datacopy = [[nsmutabledata alloc] initwithcapacity:1024];

datasegment.length = 0; //清空資料緩衝區

int32_t m = datacopy.length;

int32_t n = [self packetsize:datacopy]; //根據資料報頭部資訊計算包長

nsrange range = nsmakerange(0, n);

while (m > 0)

else if (m < n)

else }

- (uint32_t) packetsize:(nsdata*)data

tcp解決粘包

tcp協議相對於udp協議的差別 tcp udp 是否連線 面向連線 面向非連線 傳輸可靠性 可靠 不可靠 應用場合 少量資料 傳輸大量資料 速度 慢 快 根據這個確定運用場合就好。tcp粘包原因 tcp協議的優化導致而成,也就是在多少毫秒內需要等到多少大小的快取內容,才會進行傳送,在 高併發模式下...

TCP 粘包問題以及解決

如果傳送端資料傳送過塊,接收端的資料接受過慢,接受端tcp內部的快取區域會溢位,無法再傳送資料,造成網路阻塞。所以每次要盡可能的把緩衝區資料讀出來,而不是每次讀一條訊息頭。因此要在應用層設定第二緩衝區,再從第二緩衝區讀資料,拆分包 完整說明 緩衝區 char szrecv recv buff szi...

解決TCP網路傳輸「粘包」問題

解決tcp網路傳輸 粘包 問題http www.ciw.com.cn 當前在網路傳輸應用中,廣泛採用的是tcp ip通訊協議及其標準的socket應用開發程式設計介面 api tcp ip傳輸層有兩個並列的協議 tcp和udp。其中tcp transport control protocol,傳輸控...