網際校驗和算法
反碼算數運算:
兩個數進行二進制反碼求和的運算很簡單。它的規則是從低位到高位逐列進行計算。0和0相加是0,0和1相加是1,1和1相加是0但要產生一個進位1,加到下一列。如果最高位相加後產生進位,則最後得到的結果要加1。
網際校驗和算法概述:
-
在發送方,先把被校驗的數據劃分爲許多16位字的序列。如果數據的字節長度爲奇數,則在數據尾部補一個字節的0以湊成偶數。用反碼算數運算把所有16位字相加後,然後再對和取反碼,便得到校驗和。
-
在接收方,將收到的數據報(包括校驗和字段),將所有16位字再使用反碼算數運算相加一次,將得到的和取反,即得出校驗和的計算結果。如果數據報在傳輸過程中沒有任何變化,則此結果必爲0,於是就保留這個數據報。否則即認爲出差錯,並將此數據報丟棄。
舉例
“A,B,C,…,Y,Z”分別表示一系列8位組,用[A,B]這樣形式的字節組來表示A*256+B的整數,那麼該字節序列的反碼和就可以通過以下兩種表達式之一給出:
[A,B] +’ [C,D] +’ … +’ [Y,Z]
[A,B] +’ [C,D] +’ … +’ [Z,0]
其中,+’ 表示反碼算數運算相加,第一個公式適用於偶數個字節的校驗和,第二個公式適用於計算奇數個字節的校驗和。
原理:
1、校驗和的計算:將緩衝區的數據中挨個數累加(X),然後取反輸出(~X)。
2、校驗:將緩衝區的數據和校驗和(X)一起求校驗和,累加和(Y(及取反輸出(Y)。Y =緩衝區的數據累加(X(+校驗和(X)=0XFFFF。Y=0。所以當結果爲0,說明數據傳輸沒問題。
如果校驗和計算時高16位(XH)不等於零,(XH)+(XL)= Z,新校驗和爲~Z。 校驗時,再次求校驗和 :先求和(XH)*2^16 +(XL)+ ~Z= (XH)*2^16 +(XL)+ 0XFFFF - Z =(XH)*2^16+(0XFFFF -(XH))=Y.YH=XH,YL=(0XFFFF -(XH),YH+YL=0XFFFF.