(循環冗餘碼)

差錯控制

導讀

大家好,很高興又和大家見面啦!!!   在上一篇內容中,我們一同探討了數據鏈路層差錯控制的第一道防線——檢錯編碼。我們重點了解了奇偶校驗碼,它通過簡單的奇偶位設置,為我們提供了一種基礎而高效的錯誤檢測手段。   然而,正如我們所討論的,奇偶校驗碼在檢測能力上存在一定的侷限:

  • 無法定位錯誤位
  • 對偶數個比特的錯誤無能為力

為了解決這些侷限,並滿足現代通信與存儲系統對數據完整性更高標準的要求,一種更強大、更可靠的檢錯技術被廣泛採用,這就是我們本篇將要深入學習的循環冗餘校驗碼Cyclic Redundancy Check, CRC)。   CRC 以其強大的檢錯能力和高效的實現,已成為以太網、USB、Wi-Fi等眾多核心通信協議和存儲系統中不可或缺的差錯控制機制。   它背後的核心思想,是將數據視為多項式,通過特定的模2除法運算來生成校驗碼,從而極大地提升了錯誤檢測的可靠性。   下面,就讓我們正式進入 循環冗餘碼 的世界,深入瞭解其工作原理和卓越特性

一、定義

循環冗餘校驗碼Cyclic Redundancy Code, CRC)是一種基於 多項式代數模2運算 的差錯檢測編碼方法。它將數據比特序列視為多項式的係數,通過特定的多項式除法來生成校驗碼。

1.1 多項式代數

任何二進制數據串都可以表示為一個多項式。例如,數據 1101 可以解釋為多項式 $1∗x^3+1∗x^2+0∗x^1 +1∗x^0$ ,即 $x^3+x^2 +1$。生成多項式$G(x)$ 也是一個二進制序列,例如 1011 表示 $x^3 +x+1$

1.2 模2運算

模2運算 (Modulo-2 Arithmetic) 是CRC計算的基礎規則,包括:

  • 模2加法:$0+0=0, 0+1=1, 1+0=1, 1+1=0$(等同於 邏輯異或XOR)。

  • 模2減法:規則與加法完全相同。

正因為加減法規則一致,模2除法中的每一步相減操作都簡化為異或運算。

二、基本思想

循環冗餘碼CRC)檢錯的基本思想:

  • 收發雙方約定一個生成多項式 $G(x)$ (要求最低位必須為 $1$)。$k$ 位位串可視為階數為 $k - 1$ 的多項式的係數序列。
  • 發送方基於待發送的數據和 $G(x)$ ,計算出冗餘碼,將冗餘碼附加到數據後面一起發送。
  • 接收方收到數據和冗餘碼後,通過 $G(x)$ 來計算收到的數據和冗餘碼是否產生差錯。

假設一個待傳送 $m$ 位的數據,CRC 運算產生一個 $r$ 位的冗餘碼,稱為 幀檢驗序列Frame Check Sequence, FCS)。這樣形成的幀將由 $m + r$ 位組成。

flowchart LR
	subgraph 幀
		direction TB
		subgraph A[數據信息]
			direction TB
			a[1]
			b[0]
			c[...]
			d[1]
		end
		subgraph B[幀檢驗序列]
			direction TB
			e[1]
			f[0]
			g[...]
			h[1]
		end
	end

在所要發送的數據後面增加 $r$ 位冗餘碼,雖然增大了傳輸開銷,但是可以進行差錯檢測,這種代價往往是值得的。這個帶檢驗碼的幀剛好能被預先確定的多項式 $G(x)$ 整除。接收方用相同的多項式去除收到的幀,若餘數為 $0$ ,則認為無差錯。

2.1 十進制除法

為了更好的理解 CRC 的基本思想,這裏我們以 十進制除法 來進行類比;   假設通信雙方規定了一個除數 5 ,那麼對於數據 827 便可通過 十進制除法 獲取一個餘數:

$$ \begin{array}{rl} 165 \ 5 \overline{\smash{\big)} 827} \ \underline{5\phantom{00}} \ 32\phantom{7} \ \underline{30\phantom{0}} \ 27 \ \underline{\phantom{0}25} \ \bm{\textcolor{red}{2}} \end{array} $$

可以看到,若通信雙方的數據傳輸沒有發生問題,那麼通信雙方通過 除法 所得餘數一定相等;當通信雙方所獲取的餘數不相等時,那就説明傳輸的數據出現了問題。   CRC 採用的就是該思路:

  • 通信雙方通過約定一個 “除數
  • 信息位冗餘位 作為被除數
    • 信息位 通過添加了 冗餘位 後,確保通過 除法 所得的餘數位 $0$
  • 接收方在收到 被除數 後,通過 除法 檢查其餘數是否為 $0$
    • 若餘數為 $0$ ,則信息傳輸正確
    • 若餘數不為 $0$ ,則信息傳輸錯誤

2.2 二進制除法

在計算機網絡中,其傳輸的數據均為 二進制數據 ,因此所採用的 “除法” 也是 二進制除法。   二進制除法是二進制數的一種基本算術運算,其核心規則與十進制除法相似,都涉及從被除數中不斷減去除數的過程。   二進制除法分為兩種,一種是用於數值計算的普通二進制除法,另一種是用於差錯控制的模2除法(其核心是異或運算):

  • 普通二進制除法 主要分為三步:
    • 比較:判斷當前部分被除數是否“大於等於”除數。
    • 試商:根據比較結果決定商1(夠減)或商0(不夠減)。
    • 減法:執行帶借位的二進制減法。

簡單的説,普通二進制除法十進制除法 完全一致,這裏我們以 1011 除以 11 為例進行説明:

$$ \begin{array}{lrl} & \phantom{000000}011 & (商) \ & 11 \enspace\overline{\smash{\big)}\enspace 1\textcolor{red}{0}11} & (被除數: 1011, 除數: 11) \ & \phantom{00000}\underline{\textcolor{blue}{00}\phantom{00}} & (第1步: 10 < 11, 不夠除, 商0) \ & 1\textcolor{red}{0}1\phantom{0} & (下移一位, 當前部分被除數為 \textcolor{red}{101}) \ & \underline{\phantom{0}\textcolor{blue}{11}\phantom{0}} & (第2步: 101 > 11, 商1, 計算 101 - 11 = 10) \ & 1\textcolor{red}{0}1 & (餘數10, 下移最後一位1, 得101) \ & \underline{\phantom{00}\textcolor{blue}{11}} & (第3步: 101 > 11, 商1, 計算 101 - 11 = 10) \ & \textcolor{red}{10} & (最終餘數: \textcolor{red}{10}) \end{array} $$

二進制算術除法10 表示的是十進制中的 211 表示的是十進制中的 3 ,因此我們在理解其具體步驟時,不能將其視為十進制中的1011。  

  • 模2除法 主要分為兩步:
    • 判斷首位:只看當前部分被除數的最高位。
      • 若為1,則商1;
      • 若為0,則商0
    • 模2減:商1後,執行的操作是異或XOR),即模2減法

這裏我們以 1100100 除以 1011 為例來説明 模2除法 具體的運算過程:

$$ \begin{array}{lrl} & \phantom{00000000}1111 & (商) \ & 1011 \overline{\smash{\big)} \bm{\textcolor{blue}{1}}\textcolor{red}{100}100} & (除數:1100100,被除數:1011) \ & \phantom{00000}\underline{1\textcolor{red}{011}\phantom{000}} & (第1步:1100 / 1011,首位為1,商取1) \ & \phantom{000000}\bm{\textcolor{blue}{1}}11\textcolor{red}{1}\phantom{00} & (下移一位,當前被除數:1111) \ & \phantom{00000}\underline{\phantom{0}1011\phantom{00}} & (第2步:1111/1011,首位為1,商取1) \ & \phantom{0000000} \bm{\textcolor{blue}{1}}000\phantom{0} & (下移一位,當前被除數:1000) \ & \phantom{00000}\underline{\phantom{00}1011\phantom{0}} & (第3步:1000 / 1011,首尾為1,商取1) \ & \phantom{00000000}\bm{\textcolor{blue}{1}}110 & (下移一位,當前被除數:1110) \ & \phantom{00000}\underline{\phantom{000}1011} & (第4步:1110 / 1011,首位為1,商取1) \ & \phantom{000000000}\bm{\textcolor{red}{101}} &(最終餘數:\bm{\textcolor{red}{101}}) \end{array} $$

現在我們已經區分了兩種 二進制除法,在 CRC 中使用的 二進制除法 是通過 模2除法 實現的差錯控制。接下來,我們就來具體瞭解一下通過 模2除法 獲取 CRC碼 的具體過程;

2.3 CRC 碼

CRC碼信息位校驗位 兩部分組成,而校驗位的具體內容則通過 CRC運算 獲得;   這裏我們以傳輸數據信息:1100100 為例,來説明獲取 CRC碼 的具體過程;   假設通信雙方定義的生成多項式為 $G(x) = x^3 + x ^2 + 1$ ,那麼具體的過程可以分為三步:

  • 確定 $K、R$ 以及生成多項式對應的二進制碼

$$ \begin{align*} K &= 信息位的長度 &&= 7 \ R &= 生成多項式的最高次冪 &&= 3 \ G(x) &= \bm{\textcolor{red}{1}} * x^3 + \bm{\textcolor{red}{1}} * x^2 + \bm{\textcolor{red}{0}} * x^1 + \bm{\textcolor{red}{1}} * x^0 &&= 1101 \end{align*} $$

  • 移位,將信息碼左移 $R$ 位,並在低位 補零

$$ 1100100\textcolor{red}{000} $$

  • 相除,將通過移位獲取的信息碼與多項式對應的二進制碼進行 模2除法

$$ \begin{array}{lr} \phantom{000000000}1001001\ 1101 \overline{\smash{\big)}\enspace 1100100000} \ \phantom{000000}\underline{1101\phantom{000000}} \ \phantom{0000000}0011 \ \phantom{000000}\underline{\phantom{00}0000\phantom{0000}} \ \phantom{00000000}0110 \ \phantom{000000}\underline{\phantom{00}0000\phantom{0000}} \ \phantom{000000000}1100 \ \phantom{000000}\underline{\phantom{000}1101\phantom{000}} \ \phantom{0000000000}0010 \ \phantom{000000}\underline{\phantom{0000}0000\phantom{00}} \ \phantom{00000000000}0100 \ \phantom{000000}\underline{\phantom{00000}0000\phantom{0}} \ \phantom{000000000000}1000 \ \phantom{000000}\underline{\phantom{000000}1101} \ \phantom{0000000000000}\textcolor{red}{101} \ \end{array} $$

通過 模2除法 得到的餘數為 $\textcolor{red}{101}$ ,因此數據 1100100 所對應的 CRC碼 為 $1100100\textcolor{red}{101}$;

三、檢錯與糾錯

CRC碼 是一個功能強大的 檢錯編碼 ,它不僅能夠準確定位錯誤,還能夠對錯誤進行糾正;   這裏我們還是以上述的 CRC碼 為例,説明其具體的 檢錯糾錯 功能;

3.1 檢錯

3.1.1 檢錯過程

當通信雙方在傳輸數據時,對於 CRC碼

$$ 1100100\textcolor{red}{101} $$

這裏我們將其記為:$C_{10}C_9C_8C_7C_6C_5C_4C_3C_2C_1$   接收方在收到該 CRC碼 之後,會通過約定的 生成多項式 $G(x)$ 對應的二進制碼進行 模2除法 運算,來驗算其餘數是否為 0

$$ \begin{array}{lr} & 1001001\ & 1101\enspace \overline{\smash{\big)}\enspace 1100100101} \ & \underline{1101\phantom{000000}} \ & 0011 \phantom{00000} \ & \underline{\phantom{0}0000\phantom{00000}} \ & 0110 \phantom{0000} \ & \underline{\phantom{00}0000\phantom{0000}} \ & 1100 \phantom{000} \ & \underline{\phantom{000}1101\phantom{000}} \ & 0011 \phantom{00} \ & \underline{\phantom{0000}0000\phantom{00}} \ & 0110 \phantom{0} \ & \underline{\phantom{00000}0000\phantom{0}} \ & 1101 \ & \underline{\phantom{000000}1101} \ & \bm{\textcolor{red}{000}} \end{array} $$

可以看到,若數據傳輸未發生錯誤,則其經過 模2除法 所得的最終餘數為 $\bm{\textcolor{red}{000}}$;   當數據在傳輸的過程中,$C_8$ 發生了比特差錯,即原本的 0 變成了 1 ,那麼接收方接收到的 CRC碼 則變成了 $11\textcolor{red}{1}0100101$ ,此時當我們通過 模2除法 獲取餘數:

$$ \begin{array}{lr} & 1010100\ & 1101\enspace \overline{\smash{\big)}\enspace 11\bm{\textcolor{red}{1}}0100101} \ & \underline{1101\phantom{000000}} \ & 0\bm{\textcolor{red}{1}}11 \phantom{00000} \ & \underline{\phantom{0}0000\phantom{00000}} \ & \bm{\textcolor{red}{1}}110 \phantom{0000} \ & \underline{\phantom{00}1101\phantom{0000}} \ & 0110 \phantom{000} \ & \underline{\phantom{000}0000\phantom{000}} \ & 1101 \phantom{00} \ & \underline{\phantom{0000}1101\phantom{00}} \ & 0000 \phantom{0} \ & \underline{\phantom{00000}0000\phantom{0}} \ & 0001 \ & \underline{\phantom{000000}0000} \ & \bm{\textcolor{red}{001}} \end{array} $$

此時得到的餘數不再是 $\bm{\textcolor{red}{000}}$ 而變成了 $\bm{\textcolor{red}{001}}$ 。   在 CRC碼 中,發生比特差錯的位置與其通過 模2除法 獲取的餘數之間可以通過下表展示:

CRC碼 餘數 出錯位
$110010010\bm{\textcolor{red}{0}}$ $\bm{\textcolor{red}{001}}$ $C_1$
$11001001\bm{\textcolor{red}{1}}1$ $\bm{\textcolor{red}{010}}$ $C_2$
$1100100\bm{\textcolor{red}{0}}01$ $\bm{\textcolor{red}{100}}$ $C_3$
$110010\bm{\textcolor{red}{1}}101$ $\bm{\textcolor{red}{101}}$ $C_4$
$11001\bm{\textcolor{red}{1}}0101$ $\bm{\textcolor{red}{111}}$ $C_5$
$1100\bm{\textcolor{red}{0}}00101$ $\bm{\textcolor{red}{011}}$ $C_6$
$110\bm{\textcolor{red}{1}}100101$ $\bm{\textcolor{red}{110}}$ $C_7$
$11\bm{\textcolor{red}{1}}0100101$ $\bm{\textcolor{red}{001}}$ $C_8$
$1\bm{\textcolor{red}{0}}00100101$ $\bm{\textcolor{red}{010}}$ $C_9$
$\bm{\textcolor{red}{0}}100100101$ $\bm{\textcolor{red}{100}}$ $C_{10}$

從上表中大家有發現什麼嗎?   不同出錯位的餘數中,我們不難發現,其餘數總共有 $\bm{7}$ 種,若算上正確的 $\bm{\textcolor{red}{000}}$ 那麼在這個例子中的餘數總共有 $\bm{8}$ 種。   這裏我也不賣關子了,在 CRC碼 中,其校驗位的長度 $\bm{R}$ 與其生成多項式 $G(x)$ 的最高次冪相等。

  • 即,在生成多項式 $G(x) = 1 * x^3 + 1 * x ^2 + 0 * x ^ 1 + 1 * x ^ 0$ 中,其最高次冪為 $\bm{3}$ ,則表示 $R = 3$ 。

而對於長度為 $\bm{R}$ 的二進制序列,它能表示的二進制序列總數為 $\bm{2 ^{R}}$ ,該總數由 $\bm{2^{R} - 1}$ 個錯誤序列 $+$ 一個正確序列 $\bm{\textcolor{red}{00\cdots0}}$ 組成。

  • 當 $R = 3$ 時,則説明總共有 $2^3 = 8$ 種校驗碼,那對應的就有 $\bm{2 ^3 - 1 = 7}$ 種錯誤序列 $+$ 一個正確序列 $\bm{\textcolor{red}{000}}$ 。

當信息位的長度 $\bm{K} +$ 校驗碼的長度 $\bm{R}$ 所得到的 CRC碼 的總長度 $\bm{K + R} \leq \bm{2 ^{R} - 1}$ 時,其錯誤序列會與 CRC碼 中的錯誤位置一一對應;

  • 當 $R = 3$ 時,若 CRC碼 的總長度 $K + 3 \leq 7$ ,即 $K \leq 4$ 時,其錯誤序列會與 CRC碼 中的錯誤位置 一一對應

  • 當 $K > 4$ 時,其錯誤序列可能會對應多個錯誤位置;

    • 如上述例子中的錯誤序列 $\bm{\textcolor{red}{001}}$ 就對應 $C_1, C_8$ 兩個錯誤位置;

這裏需要注意,我所説的 錯誤序列 指的是,當在傳輸的過程中發生 比特差錯 時,通過 模2除法 獲得的 餘數

3.1.2 特點

理論上可以證明 CRC 的檢錯能力有以下特點:

  • 可檢測出所有奇數個錯誤
  • 可檢測除所有雙比特的錯誤
  • 可以檢測出所有小於等於校驗位長度的連續錯誤

3.2 糾錯

在前面的內容中,我們介紹了 CRC碼 的檢錯能力,並且當 $K + R \leq 2^R - 1$ 時, CRC碼 可以準確的檢測出發生 比特差錯 的具體位置,當出錯的位置確定後,我們是可以直接對其進行糾錯;

3.2.1 糾錯過程

CRC碼 的糾錯過程可以總結為4步:

  • 錯誤檢測​:

    • 發現錯誤:接收方用生成多項式 $G(x)$ 對收到的數據進行模2除法,若餘數不為 $0$,則斷定傳輸有誤
  • 循環左移與計算​

    • 定位錯誤:將接收到的數據循環左移1位,同時將當前的餘數補0後,繼續與 $G(x)$ 進行模2除法,得到新餘數
  • 錯誤位判定​

    • 識別並糾正:重複步驟2,直到餘數與“最高位出錯”的特定餘數相同。此時,錯誤位已移至數據最高位,將其取反(糾正)
  • 循環右移恢復​

    • 還原數據:將已糾正一位錯誤的數據循環右移之前左移的總次數,所有比特恢復原始順序,得到正確的原始數據

3.2.2 糾錯核心

CRC 校驗中糾錯能力的核心是,通過對生成多項式 $G(x)$ 構建一個表示錯誤位置與餘數對應關係的字典,從而通過 模2除法 獲取的餘數來準確判斷髮生錯誤的具體位置;   整個映射關係可以通過 模2除法 獲取,其具體步驟如下:

  • 構建錯誤圖樣

假設數據幀中只有 一個比特 在傳輸過程中出錯。這個錯誤可以用一個 錯誤圖樣多項式 $\bm{E(x)}$ 來表示,其中只有出錯的那一位係數為 $1$ ,其餘都是 $0$ ;   如對於 生成多項式 $\bm{G(x) = x ^3 + x + 1}$ 而言,其 錯誤圖樣多項式 $\bm{E(x)}$ 為:

$$ \begin{align*} E(x_0) &= x ^0 = 000000\bm{\textcolor{red}{1}} \ E(x_1) &= x ^1 = 00000\bm{\textcolor{red}{1}}0 \ E(x_2) &= x ^2 = 0000\bm{\textcolor{red}{1}}00 \ E(x_3) &= x ^3 = 000\bm{\textcolor{red}{1}}000 \ E(x_4) &= x ^4 = 00\bm{\textcolor{red}{1}}0000 \ E(x_5) &= x ^5 = 0\bm{\textcolor{red}{1}}00000 \ E(x_6) &= x ^6 = \bm{\textcolor{red}{1}}000000 \end{align*} $$

  • 計算餘數

錯誤圖樣多項式 $\bm{E(x)}$ 除以 生成多項式 $\bm{G(x)}$ ,所得到的 餘數多項式 $\bm{S(x)}$ 就是該錯誤位置的 **唯一“指紋”**:

$$ \begin{align*} S(x_0) &= E(x_0) \div G(x) = 0000001 \div 1011 = 001 = 1 \ S(x_1) &= E(x_1) \div G(x) = 0000010 \div 1011 = 010 = x \ S(x_2) &= E(x_2) \div G(x) = 0000100 \div 1011 = 100 = x^2 \ S(x_3) &= E(x_3) \div G(x) = 0001000 \div 1011 = 011 = x + 1\ S(x_4) &= E(x_4) \div G(x) = 0010000 \div 1011 = 110 = x ^ 2 + x\ S(x_5) &= E(x_5) \div G(x) = 0100000 \div 1011 = 111 = x ^ 2 + x + 1\ S(x_6) &= E(x_6) \div G(x) = 1000000 \div 1011 = 101 = x ^ 2 + 1 \end{align*} $$

3.2.3 實例説明

接下來我們以傳輸信息 1101 為例來説明 CRC 的糾錯過程;   假設通信雙方所規定的 生成多項式 $G(x) = x ^3 + x + 1$ ,其對應的二進制碼為 $1011$ ;   當前的 $K = 4, R = 3$ 滿足 $K + R \leq 2^R - 1$ ,因此當前數據在傳輸過程中發生錯誤時,所獲取的錯誤序列與其比特位 一一對應 ;   根據 模2除法 我們獲取的 CRC碼 為:$1101\bm{\textcolor{red}{001}}$   我們將此 CRC碼 記為:$C_7C_6C_5C_4C_3C_2C_1$。當在傳輸的過程中發生錯誤時,接收方收到的 CRC碼 為:$110\textcolor{red}{0}001$;

  • 檢測錯誤:

    • 根據 模2除法 ,獲取到的餘數為 $\bm{\textcolor{red}{011}}$
    • 該餘數不為 $0$ 説明數據傳輸發生了 比特差錯,接下來需要從該餘數開始進行糾錯
  • 循環左移與計算

    • 將原數據向左移動一位,得到新數據:$10\textcolor{red}{0}0011$
    • 將獲取的餘數 $\bm{\textcolor{red}{011}}$,補 $0$ 後得到新數 $011\textcolor{red}{0}$
    • 再將該新數與 $G(x)$ 進行 模2除法,得到新餘數:$\bm{\textcolor{red}{110}}$
  • 錯誤位判定:

    • 將步驟2獲得的餘數:$110$ 與 $G(x)$ 對應的最高位出錯的特定餘數: $101$ 進行比較:$110 \neq 101$ ,此時需要繼續重複步驟2;
  • 循環左移與計算

    • 將原數據向左移動一位,得到新數據:$0\textcolor{red}{0}00111$
    • 將獲取的餘數 $\bm{\textcolor{red}{110}}$,補 $0$ 後得到新數 $110\textcolor{red}{0}$
    • 再將該新數與 $G(x)$ 進行 模2除法,得到新餘數:$\bm{\textcolor{red}{111}}$
  • 錯誤位判定:

    • 將步驟2獲得的餘數:$111$ 與 $G(x)$ 對應的最高位出錯的特定餘數: $101$ 進行比較:$111 \neq 101$ ,此時需要繼續重複步驟2;
  • 循環左移與計算

    • 將原數據向左移動一位,得到新數據:$\textcolor{red}{0}001110$
    • 將獲取的餘數 $\bm{\textcolor{red}{111}}$,補 $0$ 後得到新數 $111\textcolor{red}{0}$
    • 再將該新數與 $G(x)$ 進行 模2除法,得到新餘數:$\bm{\textcolor{red}{101}}$
  • 錯誤位判定:

    • 將步驟2獲得的餘數:$101$ 與 $G(x)$ 對應的最高位出錯的特定餘數: $101$ 進行比較:$101 = 101$ ,説明當前的最高位就是發生錯誤的數據;
    • 此時需要將最高位的比特進行按位取反,得到新的數據:$\textcolor{red}{1}001110$,完成錯誤糾正
  • 循環右移恢復:

    • 完成數據糾正後,需要將以糾正一位錯誤的數據循環右移之前左移的總次數 $\bm{3}$ 次,得到正確的原始數據:$110\textcolor{red}{1}001$

四、小結

CRC 雖然具有 糾錯功能 但是其糾錯的條件十分苛刻,只有滿足:$K + R \leq 2^R - 1$ 且只發生了 單比特差錯 時,才能對其進行糾錯;   因此在實際的使用過程中,CRC主要被用作一種高效的錯誤檢測機制而非糾錯機制

  • 當檢測到錯誤時,通過 丟棄錯誤幀並要求發送方重傳幀 來實現 差錯控制

這種“檢錯+重傳”的策略,在實踐中遠比嘗試讓接收端自行糾錯更加可靠和高效。

結語

通過今天的學習,我們共同深入探討了數據鏈路層中至關重要的差錯控制技術——循環冗餘校驗碼CRC)。現在,讓我們一同回顧本次旅程的核心要點,為您梳理和鞏固知識體系。   首先,我們明確了CRC的核心定義:

  • 它是一種基於多項式代數模2運算(本質是異或運算)的差錯控制編碼
  • 發送方和接收方預先約定一個生成多項式 $\bm{G(x)}$,將待發送的數據視為一個多項式,通過特定的 模2除法 運算來 生成校驗碼

其核心工作流程可以概括為三步:

  • 移位:發送方在數據位後補 $R$ 個 $0$($R$ 為生成多項式的最高次冪)
  • 相除:用 生成多項式 對其進行 模2除法,得到的餘數(即幀檢驗序列FCS
  • 拼接:將 FCS 附加在原始數據後一同發送。

接收方進行相同的計算:

  • 若餘數為 $0$,則認為傳輸無誤
  • 若非 $0$,則斷定傳輸出錯。

CRC最顯著的優勢在於其強大的檢錯能力。理論上,一個設計良好的CRC能夠:

  • 檢測出所有奇數個比特錯誤
  • 檢測出所有雙比特錯誤
  • 檢測出所有長度小於或等於校驗位長度的突發性錯誤

正因如此,其錯誤漏檢率極低,使其在以太網、Wi-Fi、USB、磁盤存儲等眾多領域成為不可或缺的可靠性保障。   雖然 CRC 在滿足 $\bm{K+R \leq 2^R −1}$ 條件下能夠糾正單比特錯誤,但需要注意的是,在實際的網絡通信協議中,CRC 主要扮演的是“檢錯”而非“糾錯”的角色。一旦檢測到錯誤,標準做法是丟棄錯誤數據並請求發送方重傳ARQ機制),這種“檢錯重傳”策略在實踐中通常比嘗試自行糾錯更為高效和可靠。   總而言之,循環冗餘校驗碼以其優雅的數學原理、強大的錯誤檢測能力和高效的實現方式,成為了確保數據在不可靠信道上準確傳輸的基石技術。   希望本篇內容能幫助您不僅理解其計算步驟,更能領會其設計思想與應用場景。   互動與分享

  • 點贊👍 - 您的認可是我持續創作的最大動力

  • 收藏⭐ - 方便隨時回顧這些重要的基礎概念

  • 轉發↗️ - 分享給更多可能需要的朋友

  • 評論💬 - 歡迎留下您的寶貴意見或想討論的話題

感謝您的耐心閲讀! 關注博主,不錯過更多技術乾貨。我們下一篇再見!