字節緩存技術

1.字節緩存的基本原理

     數據壓縮也被稱做基本壓縮,或無損壓縮,通常採用 LZ 系列壓縮算法。數據壓縮具備自包
含性:即對端解壓縮方只根據數據包自己:便可進行解壓還原,不須要其它任何信息。壓縮比因數
據類型而異:文本數據壓縮比最大,各類網頁、Windows office 文件(Excel、word 等等)、PDF 其
次,對多媒體和已壓縮數據基本無效。字節緩存技術又叫「字典緩存」或「超級壓縮」等名稱。
它經過緩存的方式在內存和硬盤中記錄下流經的數據流,並以必定的大小(例如 32 字節、64 字
節或 128 字節等)爲最小單位創建易於查詢的索引。當之後流向廣域網鏈路的數據流出現了大於
最小單位的相同數據時,能夠將該數據替換成某個更短的符號。遠端的設備可以將相應符號還原
成原始數據。
     字節緩存與數據壓縮的不一樣之處是,字節緩存不具備自包含性。要解開壓縮數據,對端設備
必須引用之前記錄的歷史緩存信息。爲達到這一目的,字節緩存技術須要鏈接兩端的緩存徹底同
步,因而須要在每條廣域網鏈路兩端的加速設備之間創建緩存數據同步機制。對比於數據壓縮,
字節緩存的另外一優點是即便對自己不具可壓性的數據類型,如多媒體或已壓縮數據,只要曾經傳
輸過相同或相似數據,字節緩存便可以提取出所有或部分相同數據,從而大幅縮減須要傳輸的數
據量。字節緩存技術經過使用大量的緩存信息(包括該數據流自己之前的數據歷史和其餘數據流
的數據歷史)來壓縮當前數據,有時可以達到很是高的壓縮比。 算法

      
2.MODP
     MODP這種技術首先應用於在一個大的文件系統中查找類似的文件。這種技術之因此叫MODP是因爲使用了
取模運算和全部樣本中的1/p樣本被取樣。使用MODP的系統以下圖所示:
  
   假設數據從左側服務器發送到右側服務器。當數據包經過MODP(圖中 左側的LotWan),數據包中的重複部分將被替換爲
Label,而在對端的MODP(圖中右側的LotWan)將Label替換成真正的數據。所以咱們面對的問題就是如何提升查找重複數據
的命中率!
 
2.1 指紋計算
咱們能夠用Rabin指紋來標識數據包。其定義以下:
Rabin指紋定義了一系列長度爲 的字節序列。當以 爲窗口值和單個字節遞增的方式就能夠計算整個數據包的指紋。這種
指紋計算方法的一個優點就是下一個指紋能夠經過上一個指紋計算出來,以下所示:
所以當咱們有上一個指紋時,咱們就能夠經過一個減法,一個乘法,一個加法和一個取模計算出下一個指紋值。經過
提早計算 能夠優化此步驟。
 
 
2.2 指紋選擇 
     因爲指紋是按字節遞增計算,指紋的總數接近於字節總數,所以實現上不可能將全部的指紋取樣。重複數據
對位置很是敏感,咱們也不能夠按固定位置來選擇指紋,只要調整一個字節就會影響後面指紋的計算。所以咱們
就須要選擇部分指紋用於表示數據包。由於指紋都是隨機和均勻分佈,在實現上能夠選擇指紋值的後p位爲0的用於取樣。
 
2.3 算法
     MODP中須要一個字典來存放最近緩存的數據包,字典經過標識數據包的指紋進行索引。對於一個須要緩存的數據包的
僞代碼以下:
1 def handle_packet(payload):
2      for i in paylod:
3           rf = hash(i)                                         //計算指紋
4           if check(rf):                                        //確認指紋是否符合取樣標準
5                if cache.find(rf):                              //是否在字典中查找到相同的指紋
6                     expand(rf)                                 //向左和向右擴充匹配的字符串
7                     cache.rset(rf)                             //更新此指紋對於的數據包,若是原數據包沒有在其餘地方引用,能夠釋放。
8                else:
9                     cache.set(rf):                             //用此指紋更新字典
2.4 應用舉例: 
     華夏的AppEx應該是使用相似技術。AppEx 首先使用所有緩存信息及字典索引對超過 64 字節的長數據模式進行快速智能匹配,再利用局部緩存信息匹配短數據串(超過 8 字節便可完成匹配),最後再對結果進行 LZ 壓縮。經過三級壓縮過程,數據的冗餘成分被徹底提取。
     一般數據壓縮和字節緩存功能因爲對數據進行了複雜處理,而且處理中可能涉及到硬盤讀寫,每每引入可觀的延遲。對某些實時性要求較高的應用,顯著增長的延遲可能會帶來用戶體驗的明顯降低。爲最大限度的下降這一反作用, AppEx 設計了獨特的內存硬盤二級緩存及字典結構,動態智能判斷最可能被使用的數據,並將其置於內存中。同時根據當前鏈接匹配狀況智能判斷接下來須要的歷史記錄,並提早調入內存中。除此以外,AppEx 還動態監控數據延遲,在必要時改變壓縮方式(如只採用 LZ 壓縮等方式)以控制延遲引入。這一獨特的延遲的控制爲用戶帶來總體應用體驗的提高。 
 
2.5 存在的問題:
  • 爲了讓hash衝撞的可能性儘量的小,選擇hash的槽數爲2的60次方,在實現上這樣明顯不能夠行,所以須要二級hash來實現,這樣的話就有可能數據沒有在二級hash表上均勻分佈,從而致使查找的時間過長。
  • 在選擇樣本的時候,咱們只選擇了指紋值後p位爲0的值,這樣致使會致使重複數據沒有被選取。
  • 須要考慮發送端和接收端之間的數據一致性。
3.PACK
     PACK是一種低延遲、低CPU開銷的TRE(traffic redundancy elimination)技術。PACK設計須要TCP擴展項的支持,
所以PACK能夠支持全部應用TCP的應用程序。PACK是一種基於接收端TRE技術,而發送端不須要緩存數據並進行過多的計算。
 
3.1 PACK的處理流程以下:
   如上圖,PACK對TCP的三次握手和數據發送都進行了必定的修改。
 
3.2 數據的緩存
     PACK的數據緩存相似於LBFS(A Low-bandwidth Network File System)。PACK和MODP同樣,
須要考慮如何標識已經接收的歷史數據。對於接收數據的處理以下:
 
1 def handle_data(payload):
2      for i in payload:
3           rbhash = hash(i)     //第一步:計算數據包的Rabin指紋
4           if check(rbhash):    //第二步:根據標準選取數據包的分割點,經過分割點將數據包分割的長度近似500字節。
5                setbound(i)
第一步中咱們按48bits來計算Rabin指紋,使用這種方法是由於Rabin指紋是位置無關的。第二步
只有最小的12或13位的值等於預約值的Rabin指紋纔會被用來做爲分割點。以下圖:
假如a爲一個數據包初始的狀態,當數據包b中之是修改了c4的時候,那麼只會影響c4而不會影其他的數據塊。
數據包c的修改也只是影響了c5,數據包d的修改只是影響了c2和c3。
     對數據包進行分割後,將數據塊計算SHA後會存入字典,可是此字典有兩個特別之處:
  • 在字典中的數據塊會用用指針創建鏈表,其順序就是數據塊在數據包中的順序。
  • 此字典須要將以往全部接收的數據進行緩存。
       
3.3 接收端算法 
     接收端的主要功能:
  • 驗證發送端送來的數據是否已經緩存,若是緩存發送預測數據。
  • 若是發送端送的數據是新數據,添加到字典。
算法的僞代碼以下:
 
3.4 發送端算法
     發送端的主要功能就是當接收端發來預測信息後,驗證發送緩衝區的數據是否和預測信息匹配。
經過狀態機來描述發送端算法。
 
3.5 應用
 
3.6 待考慮的問題     
  •      PACK應該會影響TCP的其餘功能,如TCP Retransmission、Delayed ACKs、Round-Trip Time Measurements 等。
  •      PACK的字典中並無實際的數據,須要考慮實際數據的存放。
 
4.經常使用的字節緩存技術
 
 
參考資料
[1] A Protocol-Independent T echnique for Eliminating Redundant Network Traffic
[2] A Low-bandwidth Network File System
[3] PACK: Speculative TCP Traffic Redundancy Elimination
[4] On Protocol-Independent Data Redundancy Elimination
[5] HyperCompression 低延遲深度壓縮技術白皮書
[6] DiViNetworks Compression Technology
相關文章
相關標籤/搜索