本發(fā)明屬于數(shù)據(jù)處理領(lǐng)域,尤其涉及一種tcp粘包處理方法、服務(wù)器及系統(tǒng)。
背景技術(shù):
tcp(transmissioncontrolprotocol傳輸控制協(xié)議)是一種面向連接的、可靠的、基于字節(jié)流的傳輸層通信協(xié)議。雖然tcp為用戶提供可靠的端到端連接,以保證tcp消息有序無(wú)誤的傳輸。由于tcp是長(zhǎng)連接且無(wú)消息邊界,數(shù)據(jù)在傳輸過(guò)程中會(huì)中網(wǎng)絡(luò)延時(shí)等問(wèn)題導(dǎo)粘包問(wèn)題,不做算法處理無(wú)法正常解析處理數(shù)據(jù)。
目前現(xiàn)有的tcp粘包處理方法中對(duì)于接收端引起的粘包,大部分均通過(guò)優(yōu)化程序設(shè)計(jì)、精簡(jiǎn)接收進(jìn)程工作量及提高接收進(jìn)程優(yōu)先級(jí)這些措施,使接收端及時(shí)接收數(shù)據(jù)包來(lái)盡量避免出現(xiàn)粘包現(xiàn)象,但是上述所有方法在發(fā)送端的發(fā)送頻率較高或由于網(wǎng)絡(luò)突發(fā)可能使到達(dá)接收端的數(shù)據(jù)包較快,接收端仍無(wú)法及時(shí)接收,從而導(dǎo)致粘包;此外,現(xiàn)有的tcp粘包處理方法還存在無(wú)法針對(duì)忽略了對(duì)接收到的每幀數(shù)據(jù)的幀頭判斷,因?yàn)榧词古袛鄶?shù)據(jù)包的長(zhǎng)度與預(yù)設(shè)幀長(zhǎng)度相同,但若當(dāng)前幀數(shù)據(jù)的開(kāi)頭字節(jié)不是幀頭,那么該幀數(shù)據(jù)同樣是不完整數(shù)據(jù),即使發(fā)送到接收方,接收方也無(wú)法解析出完整的信息。
技術(shù)實(shí)現(xiàn)要素:
為了解決現(xiàn)有技術(shù)的不足,本發(fā)明的第一目的是提供一種tcp粘包處理方法,該方法定義tcp傳輸?shù)臄?shù)據(jù)幀結(jié)構(gòu),通過(guò)對(duì)當(dāng)前幀數(shù)據(jù)的開(kāi)頭字節(jié)的判斷,來(lái)確定當(dāng)前幀數(shù)據(jù)的幀頭,從而解決數(shù)據(jù)完整性以及準(zhǔn)確性的問(wèn)題。
本發(fā)明的一種tcp粘包處理方法,該方法適用于網(wǎng)絡(luò)通信接收方,包括:
接收網(wǎng)絡(luò)通信發(fā)送方按照預(yù)定義的tcp傳輸?shù)臄?shù)據(jù)幀結(jié)構(gòu)打包傳輸來(lái)的數(shù)據(jù);
每接收到一幀數(shù)據(jù)的同時(shí),解析當(dāng)前幀數(shù)據(jù)的數(shù)據(jù)幀結(jié)構(gòu);
判斷接收到的每幀數(shù)據(jù)的開(kāi)頭字節(jié)是否為幀頭,若是,則根據(jù)預(yù)定義的數(shù)據(jù)幀結(jié)構(gòu)來(lái)判定當(dāng)前幀數(shù)據(jù)的完整性;否則,保存數(shù)據(jù)并標(biāo)記為斷包數(shù)據(jù)段;
若當(dāng)前幀數(shù)據(jù)的幀長(zhǎng)度等于預(yù)定義的數(shù)據(jù)幀結(jié)構(gòu)長(zhǎng)度,則當(dāng)前幀數(shù)據(jù)為一個(gè)完整幀數(shù)據(jù);
若當(dāng)前幀數(shù)據(jù)的幀長(zhǎng)度大于預(yù)定義的數(shù)據(jù)幀結(jié)構(gòu)長(zhǎng)度,則對(duì)當(dāng)前幀數(shù)據(jù)進(jìn)行拆解處理,并繼續(xù)判斷拆解處理后最后一段數(shù)據(jù)的完整性,若不完整,則保存數(shù)據(jù)并與斷包數(shù)據(jù)段做拼包處理形成一個(gè)完整幀的數(shù)據(jù)。
其中,所述預(yù)定義的tcp傳輸?shù)臄?shù)據(jù)幀結(jié)構(gòu)包括幀頭、幀長(zhǎng)度和幀校驗(yàn)。
進(jìn)一步的,對(duì)當(dāng)前幀數(shù)據(jù)進(jìn)行拆解處理的過(guò)程為:
按預(yù)定義的數(shù)據(jù)幀結(jié)構(gòu)長(zhǎng)將當(dāng)前幀數(shù)據(jù)拆分成若干段數(shù)據(jù);
解析分成的最后一段數(shù)據(jù)的幀長(zhǎng)度,并與預(yù)定義的數(shù)據(jù)幀結(jié)構(gòu)長(zhǎng)度比較,若前者等于后者,則當(dāng)前幀數(shù)據(jù)進(jìn)行拆解處理后均拆解成若干個(gè)完整幀數(shù)據(jù);若前者小于后者,則最后一段數(shù)據(jù)不完整,則為保存該段數(shù)據(jù)。
本發(fā)明的第二目的是提供一種tcp粘包處理服務(wù)器。
本發(fā)明的一種tcp粘包處理服務(wù)器,該服務(wù)器為網(wǎng)絡(luò)通信接收方服務(wù)器,包括:
數(shù)據(jù)接收模塊,其用于接收網(wǎng)絡(luò)通信發(fā)送方按照預(yù)定義的tcp傳輸?shù)臄?shù)據(jù)幀結(jié)構(gòu)打包傳輸來(lái)的數(shù)據(jù);
數(shù)據(jù)解析模塊,其用于每接收到一幀數(shù)據(jù)的同時(shí),解析當(dāng)前幀數(shù)據(jù)的數(shù)據(jù)幀結(jié)構(gòu);
數(shù)據(jù)幀頭及完整性判斷模塊,其用于判斷接收到的每幀數(shù)據(jù)的開(kāi)頭字節(jié)是否為幀頭,若是,則根據(jù)預(yù)定義的數(shù)據(jù)幀結(jié)構(gòu)來(lái)判定當(dāng)前幀數(shù)據(jù)的完整性;否則,保存數(shù)據(jù)并標(biāo)記為斷包數(shù)據(jù)段;
若當(dāng)前幀數(shù)據(jù)的幀長(zhǎng)度等于預(yù)定義的數(shù)據(jù)幀結(jié)構(gòu)長(zhǎng)度,則當(dāng)前幀數(shù)據(jù)為一個(gè)完整幀數(shù)據(jù);
若當(dāng)前幀數(shù)據(jù)的幀長(zhǎng)度大于預(yù)定義的數(shù)據(jù)幀結(jié)構(gòu)長(zhǎng)度,則對(duì)當(dāng)前幀數(shù)據(jù)進(jìn)行拆解處理,并繼續(xù)判斷拆解處理后最后一段數(shù)據(jù)的完整性,若不完整,則保存數(shù)據(jù)并與斷包數(shù)據(jù)段做拼包處理形成一個(gè)完整幀的數(shù)據(jù)。
所述預(yù)定義的tcp傳輸?shù)臄?shù)據(jù)幀結(jié)構(gòu)包括幀頭、幀長(zhǎng)度和幀校驗(yàn)。
所述數(shù)據(jù)幀頭及完整性判斷模塊還包括:
數(shù)據(jù)拆解模塊,其用于按預(yù)定義的數(shù)據(jù)幀結(jié)構(gòu)長(zhǎng)將當(dāng)前幀數(shù)據(jù)拆分成若干段數(shù)據(jù);
完整性判斷模塊,其用于解析分成的最后一段數(shù)據(jù)的幀長(zhǎng)度,并與預(yù)定義的數(shù)據(jù)幀結(jié)構(gòu)長(zhǎng)度比較,若前者等于后者,則當(dāng)前幀數(shù)據(jù)進(jìn)行拆解處理后均拆解成若干個(gè)完整幀數(shù)據(jù);若前者小于后者,則最后一段數(shù)據(jù)不完整,則為保存該段數(shù)據(jù)。
本發(fā)明的第三目的是提供一種tcp粘包處理系統(tǒng)。
本發(fā)明的tcp粘包處理系統(tǒng),該系統(tǒng)包括tcp粘包處理服務(wù)器;
所述tcp粘包處理服務(wù)器,被配置為:
接收網(wǎng)絡(luò)通信發(fā)送方按照預(yù)定義的tcp傳輸?shù)臄?shù)據(jù)幀結(jié)構(gòu)打包傳輸來(lái)的數(shù)據(jù);
每接收到一幀數(shù)據(jù)的同時(shí),解析當(dāng)前幀數(shù)據(jù)的數(shù)據(jù)幀結(jié)構(gòu);
判斷接收到的每幀數(shù)據(jù)的開(kāi)頭字節(jié)是否為幀頭,若是,則根據(jù)預(yù)定義的數(shù)據(jù)幀結(jié)構(gòu)來(lái)判定當(dāng)前幀數(shù)據(jù)的完整性;否則,保存數(shù)據(jù)并標(biāo)記為斷包數(shù)據(jù)段;
若當(dāng)前幀數(shù)據(jù)的幀長(zhǎng)度等于預(yù)定義的數(shù)據(jù)幀結(jié)構(gòu)長(zhǎng)度,則當(dāng)前幀數(shù)據(jù)為一個(gè)完整幀數(shù)據(jù);
若當(dāng)前幀數(shù)據(jù)的幀長(zhǎng)度大于預(yù)定義的數(shù)據(jù)幀結(jié)構(gòu)長(zhǎng)度,則對(duì)當(dāng)前幀數(shù)據(jù)進(jìn)行拆解處理,并繼續(xù)判斷拆解處理后最后一段數(shù)據(jù)的完整性,若不完整,則保存數(shù)據(jù)并與斷包數(shù)據(jù)段做拼包處理形成一個(gè)完整幀的數(shù)據(jù)。
所述tcp粘包處理服務(wù)器與網(wǎng)絡(luò)通信接收方服務(wù)器相連,網(wǎng)絡(luò)通信接收方服務(wù)器將接收到的數(shù)據(jù)發(fā)送至tcp粘包處理器進(jìn)行處理。
所述預(yù)定義的tcp傳輸?shù)臄?shù)據(jù)幀結(jié)構(gòu)包括幀頭、幀長(zhǎng)度和幀校驗(yàn)。
所述tcp粘包處理服務(wù)器還被配置為:
按預(yù)定義的數(shù)據(jù)幀結(jié)構(gòu)長(zhǎng)將當(dāng)前幀數(shù)據(jù)拆分成若干段數(shù)據(jù);
解析分成的最后一段數(shù)據(jù)的幀長(zhǎng)度,并與預(yù)定義的數(shù)據(jù)幀結(jié)構(gòu)長(zhǎng)度比較,若前者等于后者,則當(dāng)前幀數(shù)據(jù)進(jìn)行拆解處理后均拆解成若干個(gè)完整幀數(shù)據(jù);若前者小于后者,則最后一段數(shù)據(jù)不完整,則為保存該段數(shù)據(jù)。
與現(xiàn)有技術(shù)相比,本發(fā)明的有益效果是:
本發(fā)明將接收到的網(wǎng)絡(luò)通信發(fā)送方按照預(yù)定義的tcp傳輸?shù)臄?shù)據(jù)幀結(jié)構(gòu)打包傳輸來(lái)的數(shù)據(jù)進(jìn)行解析,得到當(dāng)前幀數(shù)據(jù)的數(shù)據(jù)幀結(jié)構(gòu);再判斷接收到的每幀數(shù)據(jù)的開(kāi)頭字節(jié)是否為幀頭,并根據(jù)預(yù)定義的數(shù)據(jù)幀結(jié)構(gòu)來(lái)判定當(dāng)前幀數(shù)據(jù)的完整性,若當(dāng)前幀數(shù)據(jù)的幀長(zhǎng)度大于預(yù)定義的數(shù)據(jù)幀結(jié)構(gòu)長(zhǎng)度,則對(duì)當(dāng)前幀數(shù)據(jù)進(jìn)行拆解處理,并繼續(xù)判斷拆解處理后最后一段數(shù)據(jù)的完整性,若不完整,則保存數(shù)據(jù)并與斷包數(shù)據(jù)段做拼包處理形成一個(gè)完整幀的數(shù)據(jù)。該方法按定義協(xié)議采用遞歸算法逐層拆、拼處理可以解決tcp傳輸過(guò)程中存在的任意數(shù)量、形式的粘包問(wèn)題,確保傳輸過(guò)程中能及時(shí)準(zhǔn)確地處理接收到的數(shù)據(jù)。
附圖說(shuō)明
構(gòu)成本申請(qǐng)的一部分的說(shuō)明書(shū)附圖用來(lái)提供對(duì)本申請(qǐng)的進(jìn)一步理解,本申請(qǐng)的示意性實(shí)施例及其說(shuō)明用于解釋本申請(qǐng),并不構(gòu)成對(duì)本申請(qǐng)的不當(dāng)限定。
圖1是本發(fā)明的一種tcp粘包處理方法的流程示意圖。
圖2是本發(fā)明的一種tcp粘包處理服務(wù)器的結(jié)構(gòu)示意圖。
具體實(shí)施方式
應(yīng)該指出,以下詳細(xì)說(shuō)明都是例示性的,旨在對(duì)本申請(qǐng)?zhí)峁┻M(jìn)一步的說(shuō)明。除非另有指明,本文使用的所有技術(shù)和科學(xué)術(shù)語(yǔ)具有與本申請(qǐng)所屬技術(shù)領(lǐng)域的普通技術(shù)人員通常理解的相同含義。
需要注意的是,這里所使用的術(shù)語(yǔ)僅是為了描述具體實(shí)施方式,而非意圖限制根據(jù)本申請(qǐng)的示例性實(shí)施方式。如在這里所使用的,除非上下文另外明確指出,否則單數(shù)形式也意圖包括復(fù)數(shù)形式,此外,還應(yīng)當(dāng)理解的是,當(dāng)在本說(shuō)明書(shū)中使用術(shù)語(yǔ)“包含”和/或“包括”時(shí),其指明存在特征、步驟、操作、器件、組件和/或它們的組合。
圖1是本發(fā)明的一種tcp粘包處理方法的流程示意圖。
如圖1所示,本發(fā)明的一種tcp粘包處理方法,該方法適用于網(wǎng)絡(luò)通信接收方,包括:
s101:接收網(wǎng)絡(luò)通信發(fā)送方按照預(yù)定義的tcp傳輸?shù)臄?shù)據(jù)幀結(jié)構(gòu)打包傳輸來(lái)的數(shù)據(jù);
其中,所述預(yù)定義的tcp傳輸?shù)臄?shù)據(jù)幀結(jié)構(gòu)包括幀頭、幀長(zhǎng)度和幀校驗(yàn)。
所謂數(shù)據(jù)幀(dataframe),指應(yīng)用層的數(shù)據(jù)包,它包括三部分:幀頭,數(shù)據(jù)部分,幀尾。其中,幀頭和幀尾包含一些必要的控制信息,比如同步信息、地址信息、差錯(cuò)控制信息等;數(shù)據(jù)部分則包含網(wǎng)絡(luò)層傳下來(lái)的數(shù)據(jù),比如ip數(shù)據(jù)包。
s102:每接收到一幀數(shù)據(jù)的同時(shí),解析當(dāng)前幀數(shù)據(jù)的數(shù)據(jù)幀結(jié)構(gòu)。
具體地,當(dāng)接收當(dāng)一幀數(shù)據(jù)后,其解析方法是利用現(xiàn)有的方法,來(lái)分析當(dāng)前幀的結(jié)構(gòu)包括幀頭、幀長(zhǎng)度和幀校驗(yàn),分別得到當(dāng)前幀的這些信息。
s103:判斷接收到的每幀數(shù)據(jù)的開(kāi)頭字節(jié)是否為幀頭,若是,則根據(jù)預(yù)定義的數(shù)據(jù)幀結(jié)構(gòu)來(lái)判定當(dāng)前幀數(shù)據(jù)的完整性;否則,保存數(shù)據(jù)并標(biāo)記為斷包數(shù)據(jù)段;
若當(dāng)前幀數(shù)據(jù)的幀長(zhǎng)度等于預(yù)定義的數(shù)據(jù)幀結(jié)構(gòu)長(zhǎng)度,則當(dāng)前幀數(shù)據(jù)為一個(gè)完整幀數(shù)據(jù);
若當(dāng)前幀數(shù)據(jù)的幀長(zhǎng)度大于預(yù)定義的數(shù)據(jù)幀結(jié)構(gòu)長(zhǎng)度,則對(duì)當(dāng)前幀數(shù)據(jù)進(jìn)行拆解處理,并繼續(xù)判斷拆解處理后最后一段數(shù)據(jù)的完整性,若不完整,則保存數(shù)據(jù)并與斷包數(shù)據(jù)段做拼包處理形成一個(gè)完整幀的數(shù)據(jù)。
具體地,對(duì)當(dāng)前幀數(shù)據(jù)進(jìn)行拆解處理的過(guò)程為:
按預(yù)定義的數(shù)據(jù)幀結(jié)構(gòu)長(zhǎng)將當(dāng)前幀數(shù)據(jù)拆分成若干段數(shù)據(jù);
解析分成的最后一段數(shù)據(jù)的幀長(zhǎng)度,并與預(yù)定義的數(shù)據(jù)幀結(jié)構(gòu)長(zhǎng)度比較,若前者等于后者,則當(dāng)前幀數(shù)據(jù)進(jìn)行拆解處理后均拆解成若干個(gè)完整幀數(shù)據(jù);若前者小于后者,則最后一段數(shù)據(jù)不完整,則為保存該段數(shù)據(jù)。
本發(fā)明將接收到的網(wǎng)絡(luò)通信發(fā)送方按照預(yù)定義的tcp傳輸?shù)臄?shù)據(jù)幀結(jié)構(gòu)打包傳輸來(lái)的數(shù)據(jù)進(jìn)行解析,得到當(dāng)前幀數(shù)據(jù)的數(shù)據(jù)幀結(jié)構(gòu);再判斷接收到的每幀數(shù)據(jù)的開(kāi)頭字節(jié)是否為幀頭,并根據(jù)預(yù)定義的數(shù)據(jù)幀結(jié)構(gòu)來(lái)判定當(dāng)前幀數(shù)據(jù)的完整性,若當(dāng)前幀數(shù)據(jù)的幀長(zhǎng)度大于預(yù)定義的數(shù)據(jù)幀結(jié)構(gòu)長(zhǎng)度,則對(duì)當(dāng)前幀數(shù)據(jù)進(jìn)行拆解處理,并繼續(xù)判斷拆解處理后最后一段數(shù)據(jù)的完整性,若不完整,則保存數(shù)據(jù)并與斷包數(shù)據(jù)段做拼包處理形成一個(gè)完整幀的數(shù)據(jù)。該方法按定義協(xié)議采用遞歸算法逐層拆、拼處理可以解決tcp傳輸過(guò)程中存在的任意數(shù)量、形式的粘包問(wèn)題,確保傳輸過(guò)程中能及時(shí)準(zhǔn)確地處理接收到的數(shù)據(jù)。
圖2是本發(fā)明的一種tcp粘包處理服務(wù)器的結(jié)構(gòu)示意圖。
如圖2所示,本發(fā)明的tcp粘包處理服務(wù)器,該服務(wù)器為網(wǎng)絡(luò)通信接收方服務(wù)器,包括:
(1)數(shù)據(jù)接收模塊,其用于接收網(wǎng)絡(luò)通信發(fā)送方按照預(yù)定義的tcp傳輸?shù)臄?shù)據(jù)幀結(jié)構(gòu)打包傳輸來(lái)的數(shù)據(jù);
所述預(yù)定義的tcp傳輸?shù)臄?shù)據(jù)幀結(jié)構(gòu)包括幀頭、幀長(zhǎng)度和幀校驗(yàn)。
所謂數(shù)據(jù)幀(dataframe),指應(yīng)用層的數(shù)據(jù)包,它包括三部分:幀頭,數(shù)據(jù)部分,幀尾。其中,幀頭和幀尾包含一些必要的控制信息,比如同步信息、地址信息、差錯(cuò)控制信息等;數(shù)據(jù)部分則包含網(wǎng)絡(luò)層傳下來(lái)的數(shù)據(jù),比如ip數(shù)據(jù)包。
(2)數(shù)據(jù)解析模塊,其用于每接收到一幀數(shù)據(jù)的同時(shí),解析當(dāng)前幀數(shù)據(jù)的數(shù)據(jù)幀結(jié)構(gòu)。
(3)數(shù)據(jù)幀頭及完整性判斷模塊,其用于判斷接收到的每幀數(shù)據(jù)的開(kāi)頭字節(jié)是否為幀頭,若是,則根據(jù)預(yù)定義的數(shù)據(jù)幀結(jié)構(gòu)來(lái)判定當(dāng)前幀數(shù)據(jù)的完整性;否則,保存數(shù)據(jù)并標(biāo)記為斷包數(shù)據(jù)段;
若當(dāng)前幀數(shù)據(jù)的幀長(zhǎng)度等于預(yù)定義的數(shù)據(jù)幀結(jié)構(gòu)長(zhǎng)度,則當(dāng)前幀數(shù)據(jù)為一個(gè)完整幀數(shù)據(jù);
若當(dāng)前幀數(shù)據(jù)的幀長(zhǎng)度大于預(yù)定義的數(shù)據(jù)幀結(jié)構(gòu)長(zhǎng)度,則對(duì)當(dāng)前幀數(shù)據(jù)進(jìn)行拆解處理,并繼續(xù)判斷拆解處理后最后一段數(shù)據(jù)的完整性,若不完整,則保存數(shù)據(jù)并與斷包數(shù)據(jù)段做拼包處理形成一個(gè)完整幀的數(shù)據(jù)。
其中,所述數(shù)據(jù)幀頭及完整性判斷模塊還包括:
數(shù)據(jù)拆解模塊,其用于按預(yù)定義的數(shù)據(jù)幀結(jié)構(gòu)長(zhǎng)將當(dāng)前幀數(shù)據(jù)拆分成若干段數(shù)據(jù);
完整性判斷模塊,其用于解析分成的最后一段數(shù)據(jù)的幀長(zhǎng)度,并與預(yù)定義的數(shù)據(jù)幀結(jié)構(gòu)長(zhǎng)度比較,若前者等于后者,則當(dāng)前幀數(shù)據(jù)進(jìn)行拆解處理后均拆解成若干個(gè)完整幀數(shù)據(jù);若前者小于后者,則最后一段數(shù)據(jù)不完整,則為保存該段數(shù)據(jù)。
本發(fā)明將接收到的網(wǎng)絡(luò)通信發(fā)送方按照預(yù)定義的tcp傳輸?shù)臄?shù)據(jù)幀結(jié)構(gòu)打包傳輸來(lái)的數(shù)據(jù)進(jìn)行解析,得到當(dāng)前幀數(shù)據(jù)的數(shù)據(jù)幀結(jié)構(gòu);再判斷接收到的每幀數(shù)據(jù)的開(kāi)頭字節(jié)是否為幀頭,并根據(jù)預(yù)定義的數(shù)據(jù)幀結(jié)構(gòu)來(lái)判定當(dāng)前幀數(shù)據(jù)的完整性,若當(dāng)前幀數(shù)據(jù)的幀長(zhǎng)度大于預(yù)定義的數(shù)據(jù)幀結(jié)構(gòu)長(zhǎng)度,則對(duì)當(dāng)前幀數(shù)據(jù)進(jìn)行拆解處理,并繼續(xù)判斷拆解處理后最后一段數(shù)據(jù)的完整性,若不完整,則保存數(shù)據(jù)并與斷包數(shù)據(jù)段做拼包處理形成一個(gè)完整幀的數(shù)據(jù)。該方法按定義協(xié)議采用遞歸算法逐層拆、拼處理可以解決tcp傳輸過(guò)程中存在的任意數(shù)量、形式的粘包問(wèn)題,確保傳輸過(guò)程中能及時(shí)準(zhǔn)確地處理接收到的數(shù)據(jù)。
本發(fā)明的tcp粘包處理系統(tǒng),該系統(tǒng)包括tcp粘包處理服務(wù)器;
所述tcp粘包處理服務(wù)器,被配置為:
接收網(wǎng)絡(luò)通信發(fā)送方按照預(yù)定義的tcp傳輸?shù)臄?shù)據(jù)幀結(jié)構(gòu)打包傳輸來(lái)的數(shù)據(jù);
每接收到一幀數(shù)據(jù)的同時(shí),解析當(dāng)前幀數(shù)據(jù)的數(shù)據(jù)幀結(jié)構(gòu);
判斷接收到的每幀數(shù)據(jù)的開(kāi)頭字節(jié)是否為幀頭,若是,則根據(jù)預(yù)定義的數(shù)據(jù)幀結(jié)構(gòu)來(lái)判定當(dāng)前幀數(shù)據(jù)的完整性;否則,保存數(shù)據(jù)并標(biāo)記為斷包數(shù)據(jù)段;
若當(dāng)前幀數(shù)據(jù)的幀長(zhǎng)度等于預(yù)定義的數(shù)據(jù)幀結(jié)構(gòu)長(zhǎng)度,則當(dāng)前幀數(shù)據(jù)為一個(gè)完整幀數(shù)據(jù);
若當(dāng)前幀數(shù)據(jù)的幀長(zhǎng)度大于預(yù)定義的數(shù)據(jù)幀結(jié)構(gòu)長(zhǎng)度,則對(duì)當(dāng)前幀數(shù)據(jù)進(jìn)行拆解處理,并繼續(xù)判斷拆解處理后最后一段數(shù)據(jù)的完整性,若不完整,則保存數(shù)據(jù)并與斷包數(shù)據(jù)段做拼包處理形成一個(gè)完整幀的數(shù)據(jù)。
所述tcp粘包處理服務(wù)器與網(wǎng)絡(luò)通信接收方服務(wù)器相連,網(wǎng)絡(luò)通信接收方服務(wù)器將接收到的數(shù)據(jù)發(fā)送至tcp粘包處理器進(jìn)行處理。
其中,預(yù)定義的tcp傳輸?shù)臄?shù)據(jù)幀結(jié)構(gòu)包括幀頭、幀長(zhǎng)度和幀校驗(yàn)。所謂數(shù)據(jù)幀(dataframe),指應(yīng)用層的數(shù)據(jù)包,它包括三部分:幀頭,數(shù)據(jù)部分,幀尾。其中,幀頭和幀尾包含一些必要的控制信息,比如同步信息、地址信息、差錯(cuò)控制信息等;數(shù)據(jù)部分則包含網(wǎng)絡(luò)層傳下來(lái)的數(shù)據(jù),比如ip數(shù)據(jù)包。
本發(fā)明的tcp粘包處理服務(wù)器還被配置為:
按預(yù)定義的數(shù)據(jù)幀結(jié)構(gòu)長(zhǎng)將當(dāng)前幀數(shù)據(jù)拆分成若干段數(shù)據(jù);
解析分成的最后一段數(shù)據(jù)的幀長(zhǎng)度,并與預(yù)定義的數(shù)據(jù)幀結(jié)構(gòu)長(zhǎng)度比較,若前者等于后者,則當(dāng)前幀數(shù)據(jù)進(jìn)行拆解處理后均拆解成若干個(gè)完整幀數(shù)據(jù);若前者小于后者,則最后一段數(shù)據(jù)不完整,則為保存該段數(shù)據(jù)。
本發(fā)明將接收到的網(wǎng)絡(luò)通信發(fā)送方按照預(yù)定義的tcp傳輸?shù)臄?shù)據(jù)幀結(jié)構(gòu)打包傳輸來(lái)的數(shù)據(jù)進(jìn)行解析,得到當(dāng)前幀數(shù)據(jù)的數(shù)據(jù)幀結(jié)構(gòu);再判斷接收到的每幀數(shù)據(jù)的開(kāi)頭字節(jié)是否為幀頭,并根據(jù)預(yù)定義的數(shù)據(jù)幀結(jié)構(gòu)來(lái)判定當(dāng)前幀數(shù)據(jù)的完整性,若當(dāng)前幀數(shù)據(jù)的幀長(zhǎng)度大于預(yù)定義的數(shù)據(jù)幀結(jié)構(gòu)長(zhǎng)度,則對(duì)當(dāng)前幀數(shù)據(jù)進(jìn)行拆解處理,并繼續(xù)判斷拆解處理后最后一段數(shù)據(jù)的完整性,若不完整,則保存數(shù)據(jù)并與斷包數(shù)據(jù)段做拼包處理形成一個(gè)完整幀的數(shù)據(jù)。該方法按定義協(xié)議采用遞歸算法逐層拆、拼處理可以解決tcp傳輸過(guò)程中存在的任意數(shù)量、形式的粘包問(wèn)題,確保傳輸過(guò)程中能及時(shí)準(zhǔn)確地處理接收到的數(shù)據(jù)。
本領(lǐng)域內(nèi)的技術(shù)人員應(yīng)明白,本發(fā)明的實(shí)施例可提供為方法、系統(tǒng)、或計(jì)算機(jī)程序產(chǎn)品。因此,本發(fā)明可采用硬件實(shí)施例、軟件實(shí)施例、或結(jié)合軟件和硬件方面的實(shí)施例的形式。而且,本發(fā)明可采用在一個(gè)或多個(gè)其中包含有計(jì)算機(jī)可用程序代碼的計(jì)算機(jī)可用存儲(chǔ)介質(zhì)(包括但不限于磁盤(pán)存儲(chǔ)器和光學(xué)存儲(chǔ)器等)上實(shí)施的計(jì)算機(jī)程序產(chǎn)品的形式。
本發(fā)明是參照根據(jù)本發(fā)明實(shí)施例的方法、設(shè)備(系統(tǒng))、和計(jì)算機(jī)程序產(chǎn)品的流程圖和/或方框圖來(lái)描述的。應(yīng)理解可由計(jì)算機(jī)程序指令實(shí)現(xiàn)流程圖和/或方框圖中的每一流程和/或方框、以及流程圖和/或方框圖中的流程和/或方框的結(jié)合??商峁┻@些計(jì)算機(jī)程序指令到通用計(jì)算機(jī)、專用計(jì)算機(jī)、嵌入式處理機(jī)或其他可編程數(shù)據(jù)處理設(shè)備的處理器以產(chǎn)生一個(gè)機(jī)器,使得通過(guò)計(jì)算機(jī)或其他可編程數(shù)據(jù)處理設(shè)備的處理器執(zhí)行的指令產(chǎn)生用于實(shí)現(xiàn)在流程圖一個(gè)流程或多個(gè)流程和/或方框圖一個(gè)方框或多個(gè)方框中指定的功能的裝置。
這些計(jì)算機(jī)程序指令也可存儲(chǔ)在能引導(dǎo)計(jì)算機(jī)或其他可編程數(shù)據(jù)處理設(shè)備以特定方式工作的計(jì)算機(jī)可讀存儲(chǔ)器中,使得存儲(chǔ)在該計(jì)算機(jī)可讀存儲(chǔ)器中的指令產(chǎn)生包括指令裝置的制造品,該指令裝置實(shí)現(xiàn)在流程圖一個(gè)流程或多個(gè)流程和/或方框圖一個(gè)方框或多個(gè)方框中指定的功能。
這些計(jì)算機(jī)程序指令也可裝載到計(jì)算機(jī)或其他可編程數(shù)據(jù)處理設(shè)備上,使得在計(jì)算機(jī)或其他可編程設(shè)備上執(zhí)行一系列操作步驟以產(chǎn)生計(jì)算機(jī)實(shí)現(xiàn)的處理,從而在計(jì)算機(jī)或其他可編程設(shè)備上執(zhí)行的指令提供用于實(shí)現(xiàn)在流程圖一個(gè)流程或多個(gè)流程和/或方框圖一個(gè)方框或多個(gè)方框中指定的功能的步驟。
本領(lǐng)域普通技術(shù)人員可以理解實(shí)現(xiàn)上述實(shí)施例方法中的全部或部分流程,是可以通過(guò)計(jì)算機(jī)程序來(lái)指令相關(guān)的硬件來(lái)完成,所述的程序可存儲(chǔ)于一計(jì)算機(jī)可讀取存儲(chǔ)介質(zhì)中,該程序在執(zhí)行時(shí),可包括如上述各方法的實(shí)施例的流程。其中,所述的存儲(chǔ)介質(zhì)可為磁碟、光盤(pán)、只讀存儲(chǔ)記憶體(read-onlymemory,rom)或隨機(jī)存儲(chǔ)記憶體(randomaccessmemory,ram)等。
上述雖然結(jié)合附圖對(duì)本發(fā)明的具體實(shí)施方式進(jìn)行了描述,但并非對(duì)本發(fā)明保護(hù)范圍的限制,所屬領(lǐng)域技術(shù)人員應(yīng)該明白,在本發(fā)明的技術(shù)方案的基礎(chǔ)上,本領(lǐng)域技術(shù)人員不需要付出創(chuàng)造性勞動(dòng)即可做出的各種修改或變形仍在本發(fā)明的保護(hù)范圍以內(nèi)。