談談網絡通信中的 FEC 基礎

上一篇文章《談談網絡通信中的 ACK、NACK 和 REX》簡單介紹了網絡通信中的丟包重傳的相關理論和方法,本文則準備介紹下對抗網絡丟包的另一種常見的手段 FEC 所涉及到的核心基礎知識。

名詞解釋

FEC:Forward Error Correction,前向糾錯

FEC 是一種通過在網絡傳輸中增加數據包的冗餘信息,使得接收端能夠在網絡發生丟包後利用這些冗餘信息直接恢復出丟失的數據包的一種方法。

FEC 的基礎理論:異或

異或的規則


兩個值不相等則爲 1,相等則爲 0;

0 ^ 0 = 0
1 ^ 1 = 0
0 ^ 1 = 1
1 ^ 0 = 1

注:按位異或 ^,則是把兩個數轉換爲二進制,按位進行異或運算。


異或的特性

恆等律:X ^ 0 = X
歸零律:X ^ X = 0
交換律:A ^ B = B ^ A
結合律:A ^ (B ^ C) = (A ^ B) ^ C

注:可以通過數學方法推導證明,我們這裏只需要記住這些規則即可,後面有大量的應用。

XOR 的應用案例

有了這些 XOR 的基礎理論,我們看看它是怎麼應用到實際中的 “校驗” 和 “糾錯” 的。


奇偶校驗(Parity Check)


判斷一個二進制數中 1 的數量是奇數還是偶數(應用了異或的 恆等律 和  歸零律):

// 例如:求 10100001 中 1 的數量是奇數還是偶數
// 結果爲 1 就是奇數個 1,結果爲 0 就是偶數個 1
1 ^ 0 ^ 1 ^ 0 ^ 0 ^ 0 ^ 0 ^ 1 = 1

這條性質可用於奇偶校驗(Parity Check),每個字節的數據都計算一個校驗位,數據和校驗位一起發送出去,這樣接收方可以根據校驗位粗略地判斷接收到的數據是否有誤。


磁盤陣列-RAID5


使用 3 塊磁盤(A、B、C)組成RAID5 陣列來存儲用戶的數據,把每份數據切分爲 A、B 兩部分,然後把 A xor B 的結果作爲 C ,分別寫入 A、B、C 三塊磁盤。最終,任意一塊磁盤出錯,都是可以通過另外兩塊磁盤的數據進行恢復的。


實現原理:應用了異或的 恆等律 和  結合律

c = a ^ b
a = a ^ (b ^ b) = (a ^ b) ^ b = c ^ b
b = (a ^ a) ^ b = a ^ c


基於 XOR 的 FEC


假設網絡通信有 N 個 packet 需要發送,那麼,可以類似上述 RAID5 的策略,每 2 個 packet 生成一個 FEC packet,這樣,連續的 3 個 packet 的任意一個 packet 丟失,都能通過另外 2 個恢復出來的。

但考慮到每 2 個 packet 就產生 1 個 fec packet,冗餘度可能有點高(比較浪費帶寬),我們能否每 3 個或者每 N 個 packet 再產生一個 fec packet 呢?當然可以,我們以每 3 個 packet(A、B、C) 產生 1 個 fec packet(D)爲例來推導一下:

d = a ^ b ^ c
a = a ^ (b ^ b) ^ (c ^ c) = (b ^ c) ^ (a ^ b ^ c) = b ^ c ^ d
b = (a ^ a) ^ b ^ (c ^ c) = (a ^ c) ^ (a ^ b ^ c) = a ^ c ^ d
c = (a ^ a) ^ (b ^ b) ^ c = (a ^ b) ^ (a ^ b ^ c) = a ^ b ^ d

由上述公式推導即可知道,這 4 個 packet,任意丟失 1 個 packet,均可以由其他 3 個 packet 恢復出來。


對象存儲-EC糾刪碼


一些互聯網雲計算公司提供的對象存儲服務,都會宣稱自己具有極高的數據可靠性,使用瞭如三副本技術、EC 糾刪碼技術等等,後者大致方案如圖所示:


v2-1cb891af0965b539aa833e2a5185d551_hd.png

圖中採用的是 8+4 的糾刪碼策略(即:原始數據切割爲 8 份,計算出 4 份冗餘信息),將這 12 份分別存儲在 不同機櫃的 12 臺不同節點上,即使同一時刻出現多臺節點(至多 4 臺)損壞或不可訪問,只要有不少於 8 個節點可用,數據即可恢復。

不知道大家看出來點什麼沒有?相比於上面基於 N 個 packet 產生 1 個 FEC packet 的方案,這種 K + M 的糾刪碼策略具有更好的扛丟失能力,總結下來就是:

通過 K個有效數據,產生 M 個 FEC 冗餘包,這 K + M 個數據,任意丟失 M 個數據,都能把 K 個有效數據恢復出來。

其實這種方案,最早也是應用於網絡傳輸領域的,只不過被借用到存儲領域來提高磁盤的利用率。要實現這種 K + M 的 FEC 策略,使用簡單的 XOR 異或來推導比較難,需要藉助矩陣相關的計算,實現方案有很多種,下面簡單介紹下最著名和常用的 Reed-solomon codes。

Reed-Solomon Codes

裏德-所羅門碼(Reed-solomon codes,簡稱 RS codes),利用該原理實現的 FEC 策略,通常也叫做 RS-FEC。網上關於它的介紹特別多,本文就不詳細展開了,僅簡單以示意圖的形式給出大致的原理:


RS codes 編碼過程


v2-42e83b2bd600e5355cc9e645bea4d527_hd.png

大致原理如下:假設有效數據有 K 個,期望生成 M 個 FEC 數據

    1.  把 K 個有效數據組成一個單位向量 D

   2.  生成一個變換矩陣 B:由一個 K 階的單位矩陣 和一個 K * M 的範德蒙特 矩陣(Vandemode)組成

   3.  兩個矩陣相乘得到的矩陣 G,即包含了 M 個冗餘的 FEC 數據


RS codes 解碼過程


假設數據 D1,D4,C2 丟失了,則取對應行的範德蒙矩陣的逆 * 沒有丟失的數據矩陣,則可以恢復出原始的數據矩陣。

v2-42c59b620def26baa5aa975bea970d7e_hd.png

大致原理如下:假設數據 D1,D4,C2 丟失了

   1.  對矩陣 B 和 D,分別取沒有丟失的行構成 B‘ 和 G’

   2.  根據如下公式,即可計算恢復出有效數據向量 D

B' x D = G'  ->>>  D = B' 的逆 x G'

參考文章

感受異或的神奇

糾刪碼 Erasure Code

小結

關於網絡通信中 FEC 的基礎知識點就分享到這裏了,如有疑問的小夥伴歡迎來信 [email protected] 交流。另外,也歡迎大家關注我的新浪微博 @盧_俊 或者 微信公衆號 @Jhuster 獲取最新的文章和資訊。



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章