亚洲狠狠干,亚洲国产福利精品一区二区,国产八区,激情文学亚洲色图

一種快速處理數據粘包的方法

文檔序號:9865418閱讀:1057來源:國知局
一種快速處理數據粘包的方法
【技術領域】
[0001 ]本發(fā)明涉及通信領域,具體說是一種快速處理數據粘包的方法。
【背景技術】
[0002]TCP協(xié)議(Transmiss1n Control ProtocoI)作為Internet最基本的協(xié)議、Internet國際互聯(lián)網絡通信的基礎,由網絡層的IP協(xié)議(Internet Protocol)和傳輸層的TCP協(xié)議組成。它定義了各種電子設備如何接入互聯(lián)網,以及設備之間數據如何進行傳輸。
[0003]TCP協(xié)議提供了一種可靠的基于流數據的無邊界傳輸方式,并且配合滑動窗口的擁塞控制算法進行發(fā)送速率調整。因此在實際網絡環(huán)境下TCP協(xié)議的數據流在接收端將產生頭尾無法區(qū)分以及完整數據包斷裂的粘包情況發(fā)生,并且在例如視頻流這種數據長,數據量龐大,并且實時性要求高的情況下發(fā)生接收不及時,從而導致?lián)砣刂扑惴ǚe性減少滑動窗口大小,嚴重降低發(fā)送速率。
[0004]現(xiàn)有的對于粘包拆分的方法局限于在單進程默認堆棧內存區(qū)開辟空間進行數據報頭解析和緩存達到拆分目的,無法充分的利用如今越來越龐大的內存尋址空間并且使用更為優(yōu)秀的數據結構。而且現(xiàn)有的拆分粘包過程中對于數據緩存保護機制更是消耗大量時間在于進行程序內核態(tài)和用戶態(tài)掛起和喚醒的CPU時間片轉換,從而導致大量可用內存的閑置和接收速率的限制。

【發(fā)明內容】

[0005]本發(fā)明的目的在于提供一種快速處理數據粘包的方法。
[0006]本發(fā)明的技術方案在于:一種快速處理數據粘包的方法,其特征在于,包括以下步驟:將block數據塊通過數組形式組合成一單循環(huán)的讀寫鏈表,并且數據處理服務線程通過內存文件映射技術命名該讀寫鏈表到進程地址空間,寫線程通過名字查找到進程地址空間中該讀寫鏈表內存,程序開始等待數據;其中,該block數據塊包括當前節(jié)點的前一個節(jié)點序數、后一個節(jié)點序數、節(jié)點讀完標識、節(jié)點寫完標識、節(jié)點數據長度、預接收的tcp完整數據包長度、不足一個完整tcp數據包時剩下還沒接收的長度、當前已經接收的完整tcp數據包長度、預留標識位和一個緩存空間。
[0007]優(yōu)選的,該讀寫鏈表包含讀開始標識符、讀結束標識符、寫開始標識符、寫結束標識符以及結構數組。
[0008]優(yōu)選的,接收線程從網絡套接字讀取數據,并且讀取該讀寫鏈表中當前可讀數據塊,將數據寫入到當前數據塊,如果當前鏈表數據塊都無法讀取則等待可讀事件的觸發(fā)。
[0009]優(yōu)選的,對該讀寫鏈表的數據保護以及同步,使用用戶態(tài)原子鎖方式,防止讀寫鏈表頻繁的陷入用戶態(tài)和內核態(tài)轉換,耗費大量的CHJ時間片。
[0010]優(yōu)選的,當數據處理服務線程接收到數據塊,如果是第一次接收到數據則需要判斷第一次數據塊長度是否滿足最小報文頭,否則原子鎖將不會交換數據塊進行鏈表的推進,而是保留當前鏈表節(jié)點準備接收下一次數據。
[0011]優(yōu)選的,如果當前數據塊數據長度大于或者等于最小報文頭,程序將開始拆包過程。
[0012]優(yōu)選的,通過TCP數據包頭的自定義標識,獲取數據包長度,然后減去當前數據塊長度以及最小報文頭長度求出數據包剩余長度;
如果數據包剩余長度結果小于O,則說明當前數據塊包含一包完整的TCP數據包,接下來,保存當前數據包長度,當前數據塊長度減去完整數據包長度,保存數據塊剩余長度,重置鏈表當前節(jié)點,將剩余數據完整拷貝進去,重新回到鏈表讀寫循環(huán),并且當前塊不進行推進;
如果數據包剩余長度結果大于O,則說明當前數據塊中的數據不足于一個完整的數據包,接下來,將當前數據拷貝進臨時區(qū),推進一步鏈表移動到下一塊數據,將兩次數據合并再拷貝回當前鏈表節(jié)點數據塊,重新回到鏈表讀寫循環(huán)。
[0013]本發(fā)明能夠保證在準確的拆分數據粘包的前提下,通過文件映射內存創(chuàng)建數據結構讀寫單鏈表的方式以及原子層面的讀寫保護,極大的提高內存利用率以及讀寫速率,解決了現(xiàn)有粘包處理算法上在大數據流實時性方面無法很好的利用計算機硬件資源以及速率提升瓶頸上的問題。
【附圖說明】
[0014]圖1為本發(fā)明單循環(huán)的讀寫鏈表數據結構示意圖。
[0015]圖2為本發(fā)明block數據塊示意圖。
[0016]圖3為本發(fā)明成功處理一數據塊獲得完整tcp數據包。
[0017]圖4為本發(fā)明數據處理流程圖。
【具體實施方式】
[0018]為讓本發(fā)明的上述特征和優(yōu)點能更明顯易懂,下文特舉實施例,并配合附圖,作詳細說明如下,但本發(fā)明并不限于此。
[0019]如圖1所示,本發(fā)明提供一種快速處理數據粘包的方法,包括以下步驟:將block數據塊通過數組形式組合成一單循環(huán)的讀寫鏈表數據結構,并且數據處理服務線程通過內存文件映射技術命名該讀寫鏈表到進程地址空間,寫線程通過名字查找到進程地址空間中該讀寫鏈表內存,程序開始等待數據;其中,如圖2所示,該block數據塊包括當前節(jié)點的前一個節(jié)點序數、后一個節(jié)點序數、節(jié)點讀完標識、節(jié)點寫完標識、節(jié)點數據長度、預接收的tcp完整數據包長度、不足一個完整tcp數據包時剩下還沒接收的長度、當前已經接收的完整tcp數據包長度、預留標識位和一個所需類型的緩存空間。Tcp數據包,其中報文頭包含標識當前數據包完整數據長度的信息以及報文頭其他信息;定義最小報文頭長度用于檢測防止接收數據不足于一個最小報文頭從而無法提取報文數據長度;鏈表中的每個節(jié)點將用于接收原始數據以及對數據進行解析拼接。
[0020]該讀寫鏈表數據結構包含讀開始標識符、讀結束標識符、寫開始標識符、寫結束標識符以及一定長度的結構數組,此鏈表總體即為緩存結構,鏈表中的每個節(jié)點將用于接收原始數據以及對數據進行解析拼接。
[0021]接收線程從網絡套接字讀取數據,并且讀取該讀寫鏈表數據結構中當前可讀數據塊,將數據寫入到當前數據塊,如果當前鏈表數據塊都無法讀取則等待可讀事件的觸發(fā)。
[0022]對該讀寫鏈表數據結構的數據保護以及同步,使用用戶態(tài)原子鎖方式,防止讀寫鏈表頻繁的陷入用戶態(tài)和內核態(tài)轉換,耗費大量的CHJ時間片。
[0023]當數據處理服務線程接收到數據塊,如果是第一次接收到數據則需要判斷第一次數據塊長度是否滿足之前定義的最小報文頭,否則原子鎖將不會交換數據塊進行鏈表的推進,而是保留當前鏈表節(jié)點準備接收下一次數據。
[0024]如果當前數據塊數據長度大
當前第1頁1 2 
網友詢問留言 已有0條留言
  • 還沒有人留言評論。精彩留言會獲得點贊!
1