(循環冗餘碼)
導讀
大家好,很高興又和大家見面啦!!! 在上一篇內容中,我們一同探討了數據鏈路層差錯控制的第一道防線——檢錯編碼。我們重點了解了奇偶校驗碼,它通過簡單的奇偶位設置,為我們提供了一種基礎而高效的錯誤檢測手段。 然而,正如我們所討論的,奇偶校驗碼在檢測能力上存在一定的侷限:
- 無法定位錯誤位
- 對偶數個比特的錯誤無能為力
為了解決這些侷限,並滿足現代通信與存儲系統對數據完整性更高標準的要求,一種更強大、更可靠的檢錯技術被廣泛採用,這就是我們本篇將要深入學習的循環冗餘校驗碼(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 表示的是十進制中的 2 ,11 表示的是十進制中的 3 ,因此我們在理解其具體步驟時,不能將其視為十進制中的10 與 11。
- 模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機制),這種“檢錯重傳”策略在實踐中通常比嘗試自行糾錯更為高效和可靠。 總而言之,循環冗餘校驗碼以其優雅的數學原理、強大的錯誤檢測能力和高效的實現方式,成為了確保數據在不可靠信道上準確傳輸的基石技術。 希望本篇內容能幫助您不僅理解其計算步驟,更能領會其設計思想與應用場景。 互動與分享
-
點贊👍 - 您的認可是我持續創作的最大動力
-
收藏⭐ - 方便隨時回顧這些重要的基礎概念
-
轉發↗️ - 分享給更多可能需要的朋友
-
評論💬 - 歡迎留下您的寶貴意見或想討論的話題
感謝您的耐心閲讀! 關注博主,不錯過更多技術乾貨。我們下一篇再見!