有一次,知乎上的同窗問我:「爲何使用迅雷下載東西的時候,最後的百分之一老是那麼慢呢?還有,爲何傳輸文件的時候,到最後的那一塊也是那麼慢呢?」 一看這位同窗就是個善於發現之人,能成大事。 其實緣由很是簡單,對於迅雷來講,通常使用的是P2P(點對點)的傳輸方式,最後的百分之一時(也有多是下載中的每一個時刻),迅雷就把你做爲了點對點中的一個點,讓其餘人從你這裏下載資源,若是你下載完成了,那不就是不能明目張膽的這麼幹了嗎,這個時候你只須要將任務暫停,而後從新開始,立刻就下載完了;還有一個緣由是迅雷正在進行文件的校驗,這部分實際上是涉及到計算機網絡的內容了,從此咱們會詳細的講這塊的東西。 而對於文件傳輸的時候,最後的部分也會感受到慢(不多見),是由於計算機傳輸比特流的過程當中也會去校驗文件,看看傳過來的比特流是否發生錯誤。 因此,咱們今天的主題是「數據校驗方法」。咱們講兩種校驗方法,一種叫作「海明碼(漢明碼)校驗法」,另一種是CRC(循環冗餘)校驗。這兩種有着不一樣的應用場景,下面就來開始正式的內容。bash
上面講了,在數據傳輸的過程當中是須要進行信息的校驗的——由於數據在傳輸過程當中有各類緣由(磁場、電流等)會致使數據出錯,比特位從0變成1,或者由1變成0。這樣就形成了數據出錯,因此即時發並予以糾正,就顯得尤其重要了,畢竟誰也不想獲得錯誤的信息不是。微信
海明碼由來已久,是理查德·海明於1950年提出的。 首先來講下海明碼的數字位:海明碼的數字位分紅校驗位和數據位。那麼,什麼是數據位什麼又是校驗位呢?網絡
1 0 1 1 0 1 0 0 1
複製代碼
所謂的校驗位,就是用於校驗數據位是否正確的輔助數字;而數據位就是真實傳輸的二進制數。看上面的數字,共有9位,那麼哪些是校驗位,哪些又是數字位呢? 海明碼規定,2^n-1(n=1,2,3,……)位就是校驗位。因此上面的數字中:一、二、四、8……就是校驗位。除了校驗位剩下的就是數據位。 那麼,如何肯定校驗位的個數呢?其實有這樣一個公式2^k >= n+k+1。n是須要校驗的數據共有多少位,天然能夠求出k的值,k就是校驗位的個數。編碼
不一樣的校驗位,負責校驗的數據位各不相同。下面是校驗規則: spa
圖中沒有給出的第C8則是負責校驗八、九、十、十一、十二、1三、1四、1五、24……位。其實這也是有規律的,可是上面的這幾位通常就夠用了,因此感興趣的同窗能夠本身看一看究竟有啥規律。 此外,海明碼採用的是奇偶校驗的方式進行校驗,所謂奇偶校驗是啥呢?好比說C8負責校驗的這幾位,奇校驗就是這幾位再加上C8自己這些數中的1加起來的數量是奇數。同理偶校驗就是1的個數加起來是偶數。這個就很好理解了。 接下來,咱們來實際作一個例子。計算機網絡
乍看好像沒啥思路,可是咱們能夠憑着感受,從1的個數是奇數做爲出發點。首先來肯定校驗位的個數,由公式2^k >= n+k+1能夠計算出校驗位的個數爲3,即一、二、4位,其他爲則爲真正的數據位1001,以下圖所示: code
再由C1校驗的是一、三、五、7位,則共有兩個1,爲了知足奇校驗的條件,則C1=1。 C2的校驗位爲二、三、五、7位,則共有兩個1,爲了知足奇校驗的條件,則C2=1。 C4的校驗位爲四、五、六、7位,則共有1個1,則C4=0. 因此,奇校驗的海明碼就是1110001。cdn
海明碼存在的意義就是爲了糾錯,因此,他的重要意義在於糾錯的過程。blog
這個題目複雜在若是有一位出錯,那麼頗有可能會形成C一、C二、C4校驗位的1的個數均不是偶數,因此肯定起來比較麻煩,咱們來看看這到底是如何解決的。 咱們按照以前的校驗位原則再列出一張表格: 資源
能夠看到,在表格中,C一、C2校驗位中的1的個數均爲奇數,而C4中的1爲偶數個,因此出錯確定是在c一、c2的公共部分。因此肯定是第3位出錯,則將第三位糾正爲0,即原來傳輸的數據是0101。 以上就是海明碼的所有內容,接下來介紹CRC循環冗餘校驗方法。
CRC通常用於磁盤上的數據校驗。同時,CRC還應用在計算機網絡數據傳輸過程當中的數據校驗。 CRC是基於模2運算的校驗碼。 CRC碼是由兩部分組成,前部分是信息碼,就是須要校驗的信息,後部分是校驗碼,若是CRC碼共長n個bit,信息碼長k個bit,就稱爲(n,k)碼。編碼規則以下:
實際上,生成多項式是國際上制定的標準,有不少,下面舉幾個例子: x^16+ x^12+ x^5+一、x^16+ x^15+ x^2+一、 x^4+ x^3 +x^2+1。 上面的g(x)則還能夠堪稱二進制數,好比說x^4+ x^3 +x^2+1 (從左向右,取出係數)就是11101(由於x^1沒有,則爲0)。
先將110向左移動4位,則爲1100000。用11101|1100000(模2運算),最終的結果就是1001,則傳輸碼爲110,1100000。
本文詳細的介紹了海明碼,另一種CRC校驗實際上只是一筆帶過,在計算機網絡系列文章中咱們會詳細介紹, 敬請期待。= 若是你喜歡個人文章,請幫忙點贊;若是你對本文內容存在疑問,請留言告訴我。您的點贊和留言是對原創做者的最大支持,感謝您的閱讀。 此外,本人一直在尋找志同道合的小夥伴,一樣如此的能夠郵件聯繫我:roobtyan@outlook.com. 微信公衆號:最高權限比特流。