最近對於數據傳輸的噪音損耗問題的解決方案查了些資料算法
就此作一個總結:網絡
數據損壞函數
由於網線被老鼠啃了或者硬盤摔地上了致使數據錯了spa
關於數據損壞的問題其實不限於網絡傳輸方面,能夠涉及到全部和數據相關的方面,好比文件解壓,網絡通信,保密數據的校驗(數據簽名)等等.net
錯誤校驗code
即檢驗某一段數據是否有誤。blog
由於是否是有誤光憑數據自己不可能知道,因此必須加上附加的認證方法get
固然最簡單的認證方法就是再傳一次數據,拿着數據一個個對着本來的數據對照一下。。。不過這樣不說太麻煩,若是要實現這個方法,第二次傳輸這個數據的時候,難以保證這個數據是否是也出現了錯誤hash
另外一方面,顯然數據越短,這段數據出現錯誤的機率越小,由於比特出錯機率(BER)是不變的。因此若是能夠把這個認證的數據(校驗碼)壓縮成一段很短的數據就能夠減小校驗碼出錯的狀況了it
好比奇偶校驗(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貼連接,這位大神已經講得很清楚了
缺點是隻能承受一個錯誤的狀況
優勢……除此以外都是優勢,目前見到的惟一作到錯誤校驗和錯誤糾偏的算法了