最近對於數據傳輸的噪音損耗問題的解決方案查了些資料
就此做一個總結:
數據損壞
因為網線被老鼠啃了或者硬盤摔地上了導致數據錯了
關於數據損壞的問題其實不限於網絡傳輸方面,可以涉及到所有和數據相關的方面,比如文件解壓,網絡通訊,保密數據的校驗(數據簽名)等等
錯誤校驗
即檢驗某一段數據是否有誤。
因為是不是有誤光憑數據本身不可能知道,所以必須加上附加的認證方法
當然最簡單的認證方法就是再傳一次數據,拿着數據一個個對着原本的數據對照一下。。。不過這樣不說太麻煩,如果要實現這個方法,第二次傳輸這個數據的時候,難以保證這個數據是不是也出現了錯誤
另一方面,顯然數據越短,這段數據出現錯誤的概率越小,因為比特出錯概率(BER)是不變的。所以如果可以把這個認證的數據(校驗碼)壓縮成一段很短的數據就可以減少校驗碼出錯的情況了
比如奇偶校驗(Parity Check) 或者說,數1校驗
奇偶校驗制定了一個協議,規定數據中1的個數只能是偶數
如果原始數據1是奇數,則加一個1在最前面;反之則加一個0在前面。
如 0110101 和 11010010 都是符合規定的。 很顯然這個第一位就是校驗碼。
那么如果數據出了錯誤,某個0變成1或者1變成0,那么接收者數一遍1發現不是偶數個,那么就證明數據錯了
當然奇偶校驗的缺陷十分明顯,如果同時錯了2個或者偶數個位,那么錯誤將無法被檢測出來。。。
所以我們需要更強的校驗算法,使校驗碼盡可能簡單的同時,讓失誤率盡可能小。
具體實現方法就是加上hash算法,一個數據對應一個hash值,再用hash值代表原有數據的特征,作為校驗碼,從而達到一一對應的目的。
例如把一段數據乘以10086再對23333取模,將這個hash結果作為校驗碼加在數據后面,然后接收者再做一遍hash得到他的hash值。
如果兩者相同,可以看做兩組數據特征符合,於是數據得到驗證。
(本質上奇偶校驗也是一種hash)
當然另一方面,既然是hash那么就不可避免地會出現錯誤,比如數據出錯了,然而接收者得到的hash值正好和校驗碼一樣,或者說數據和校驗碼都錯了然而也正好吻合。所以這要求hash函數足夠強大。
不過要指出的是,如果不幸校驗碼出錯的話,只能重發一個數據包過來。。
現今使用的MD5算法就是一種通過hash實現的校驗算法,目前廣泛運用於機密文件校驗以及銀行系統交易數據等等。
類似的還有廣泛使用的CRC循環冗余校驗算法,被使用於TCP/IP協議中。
另外LRC、BCC、SHA等等算法也可用於錯誤校驗,只是hash函數大同小異,本質上差不多(吧)。還有個Nand ECC算法,沒太看懂。。。
錯誤糾偏
即糾正某一段數據的錯誤。
目前看到可以糾正錯誤的有以下幾種算法:
后向糾錯:通過錯誤校驗(數據不吻合校驗碼)知道數據錯了以后,要求重新發一遍數據。包括數據錯了和校驗碼錯了兩種情況(這也能叫算法??)(硬就是能了)
前向糾錯(FEC算法):發送端在發送數據之前,加了一些預處理之后的數據(冗余數據),以在出現錯誤之后可以反推回去糾正錯誤。
零階冗余:沒有冗余,就是發原來的數據
一階冗余:在N包數據后面加一個冗余數據,這個數據按照某個方程生成(具體方程懶得打了有需要可以自行百度),插在數據塊的最末尾。
(注:一包數據里面帶一個校驗碼,也就是一個整體)
如果有一個數據壞了,找到這個數據的編號以后,通過其他好的數據將方程反推回去,可以反推回去這個數據。
二階冗余:在N包數據后面加兩個冗余數據………………
可以承受一個數據塊中有兩個數據壞了的情況(類比一下解方程組,兩個未知數兩個方程)
三階冗余:…………
一般到了三階冗余就已經可以保證很強的魯棒性了
漢明碼(hamming code):https://blog.csdn.net/Yonggie/article/details/83186280不多bb貼鏈接,這位大神已經講得很清楚了
缺點是只能承受一個錯誤的情況
優點……除此之外都是優點,目前見到的唯一做到錯誤校驗和錯誤糾偏的算法了