1. 程式人生 > >迴圈冗餘校驗(CRC)的簡單應用實踐

迴圈冗餘校驗(CRC)的簡單應用實踐

前言


一般來說,資料資訊在傳輸過程中有時會受到外界有意或無意的干擾行為,出現數據的篡改和破壞現象,造成資料接收端的不一致行為。於是乎,在資訊領域有了資料校驗的概念,今天本文主要來簡單聊聊其中的經典使用演算法CRC(迴圈冗餘校驗)以及其在Ozone中的應用實踐。

CRC和Checksum的關係


往往我們在談論CRC的時候,馬上會聯想到Checksum這個詞,二者是等同的意思嗎?實則還是有區別的。

首先我們要區分一個概念上的差別,CRC是一種演算法,而Checksum我們指的是一組資訊,官方的稱呼叫做“總和校驗碼”。而CRC是其中一種計算校驗和資訊的演算法。換句話說,還有其它演算法也可以計算出Checksum資訊的(比如MD5演算法),只是說CRC太經典以至於讓我們誤以為CRC和Checksum是等號的關係了。

但是不管說用什麼方法,我們用生成的Checksum資訊的目的是相同的:用於錯誤檢測,以此保證資料在傳輸過程中的一致性

CRC演算法被廣泛地使用在通訊和儲存資訊領域,得益於以下三點:

  • 較為簡單地實現於二進位制的硬體環境下
  • 比較容易去數學分析
  • 錯誤檢測的實用性高

CRC的演算法原理是使用多項式的除法來做校驗和結果的生成,具體涉及的數學理論這裡不進行詳細介紹了。

CRC的實踐應用


在CRC的實際應用場景中,它的應用原理如下:

  1. 讀取一段待傳輸資料D1,用CRC演算法進行此段資料的計算,將此值作為此段資料的Checksum結果。
  2. 將1)步驟得到的Checksum資訊追加在資料D1段的尾部,然後繼續重複1)步驟。

基於這種情況下,在接收端獲取資料時採用的檢測辦法如下:

  1. 接收一段資料包R1,解析得到其資料資訊R1和校驗和資訊CK1。
  2. 將R1資料進行CRC演算法計算校驗和資訊CK1’
  3. 比較CK1’和CK1是否一致,如果一致說明資料是完整的,繼續下一段的接收處理,否則說明資料已被破壞。

CRC在Ozone中的應用


這裡筆者要提一提CRC在Ozone(物件儲存)中的另外一種用法,和往常的做法略有不同。

也許是為了保證原始資料格式的相容性,社群在實現的時候,將Checksum資訊儲存到了檔案的元資料資訊裡。也就是說,一個檔案的metadata裡會存在一個或多個Checksum資訊組,如下圖(圖右)所示:

上圖左邊是傳統的使用模式,右圖為Ozone的CRC使用模式。因為Ozone是一套儲存系統,所以它的驗證方式如下:

  • 寫入檔案資料時,按照每個片段資料大小計算其Checksum,並儲存到檔案metadata資訊裡。
  • 當客戶端讀檔案資訊時,重新計算Checksum與原始的做比較即可。

總體來說,和傳統的比較方式類似,有關CRC演算法更多的資料介紹可閱讀文章末尾的wiki連結。

引用


[1].https://en.wikipedia.org/wiki/Cyclic_redundancy_check