Cyclic Redundancy Check (CRC)
CRC 是一種利用多項式除法偵測傳輸錯誤的機制。Sender 在資料後附上一段餘數,使得整個 bit string 能被雙方共知的 generator polynomial 整除;receiver 只要驗證整除性,就能判斷傳輸是否出錯。
Generator Polynomial
CRC 的數學基礎是選定一個 generator polynomial (sender 和 receiver 共享)。給定資料 和 的 degree ,可以寫出:
移項後得 ,表示 可以被 整除。Sender 送出的不是 ,而是末尾附上餘數的 。
Modulo-2 arithmetic 中,加法和減法都是 XOR,因此 和 是同一件事。
Sender
給定 generator polynomial(bit string 長度為 )和資料:
- 在資料末端補 個 0
- 用 modulo-2 binary division 除以 ,得到餘數 (modulo-2 division 與十進位長除法相同,只是把減法換成 XOR)
- 將 附在原始資料後面送出
以 、(,)為例:
- 補 個 0,資料變為
- ,餘數為
- 送出
Receiver
Receiver 同樣持有 ,對收到的 bit string 做 modulo-2 division:
- 餘數為 :傳輸正確
- 餘數不為 :有 bit 被翻轉,傳輸出錯
承上例,receiver 收到 ,除以 後餘數為 ,判定正確。若資料在傳輸中第 4 bit 遭翻轉變成 ,餘數變為 ,偵測到錯誤。