1. 程式人生 > >首部檢驗和計算

首部檢驗和計算

IP/ICMP/IGMP/TCP/UDP等協議的校驗和演算法都是相同的,演算法如下:
在傳送資料時,為了計算IP資料包的校驗和。應該按如下步驟:
(1)把IP資料包的校驗和欄位置為0;
(2)把首部看成以16位為單位的數字組成,依次進行二進位制反碼求和;
(3)把得到的結果存入校驗和欄位中。
在接收資料時,計算資料包的校驗和相對簡單,按如下步驟:
(1)把首部看成以16位為單位的數字組成,依次進行二進位制反碼求和,包括校驗和欄位;
(2)檢查計算出的校驗和的結果是否等於零(反碼應為16個0);
(3)如果等於零,說明被整除,校驗和正確。否則,校驗和就是錯誤的,協議棧要拋棄這個資料包。
所謂的二進位制反碼求和,即為先進行二進位制數取反,然後求和,如果最高位進一,則儲存到最低位即可。
計算對IP首部檢驗和的演算法如下:
(1)把IP資料包的校驗和欄位置為0;
(2)把首部看成以16位為單位的數字組成,依次進行二進位制求和(注意:求和時應將最高位的進位儲存,所以加法應採用32位加法);
(3)將上述加法過程中產生的進位(最高位的進位)加到低16位(採用32位加法時,即為將高16位與低16位相加,之後還要把該次加法最高位產生的進位加到低16位)
(4)將上述的和取反,即得到校驗和。
二進位制反碼求和的計算方法:編輯
首先,我們計算如圖B-1所示的部分和。我們把每一列相加,如果有進位,就加到下一列。注意以下幾點:
1-->16
1 1-->15
* 1-->14
* 1-->13
* * 1 1-->12
* * * 1-->11
* * * * 1-->10
* * * * * 1 1-->9
* * * * * * * 1 1-->7
* * * * * * * * * 1-->6
* * * * * * * * * 1-->5
* * * * * * * * * 1-->4
* * * * * * * * * * 1-->3
* * * * * * * * * * * * 1 1-->2
* * * * * * * * * * * * 1-->第1的進位,以上同義(右起為第一列)
1 0 0 1 1 0 0 1 0 0 0 1 0 0 1 0
0 0 0 0 1 0 0 0 0 1 1 0 1 0 0 1
1 0 1 0 1 0 1 1 0 0 0 0 0 0 1 0
0 0 0 0 1 1 1 0 0 0 0 0 1 0 1 0
0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1
0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1
0 0 0 0 0 1 0 0 0 0 1 1 1 1 1 1
0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1
0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 1 0 1 0 1 0 0 0 1 0 0 0 1 0 1
0 1 0 1 0 0 1 1 0 1 0 1 0 1 0 0
0 1 0 0 1 0 0 1 0 1 0 0 1 1 1 1
0 1 0 0 0 1 1 1 0 0 0 0 0 0 0 0
1 0 0 1 0 1 1 0 1 1 1 0 1 0 1 0 部分和
1 -->第15列的進位
1 -->第16列的進位
1 0 0 1 0 1 1 0 1 1 1 0 1 1 0 0 和
0 1 1 0 1 0 0 1 0 0 0 1 0 0 1 1 校驗和
圖B-1 二進位制記法的部分和
1,當我們加第1列(最右邊一列)的時候,我們得到8。在二進位制中,數8是1000。我們保留最右邊的0,把其餘的位進到第2列,第3列和第4列。
2,當我們加第2列時,我們計入從第1列來的進位。結果是7,它是二進位制的0111。我們保留第一個位(最右邊的),把其餘011進位給第3列、第4列和第5列。
3,對每一列重複以上過程。
4,當我們加完最後一列時,我們有兩個1沒有列可以進行進位。這兩個1在下一個步驟中應與部分和(Partial sum)相加。
B.1.2和
如果最後一列沒有進位,那麼部分和就是和。但是,如果還有額外的列(在本例中,有一個具有兩行的列),那麼就要把它加到部分和中,以便得出和。下圖給出了這樣的計算,我們得出了和。
1 0 0 1 0 1 1 0 1 1 1 0 1 0 1 0 部分和
1 0 -->第15,16列的進位
1 0 0 1 0 1 1 0 1 1 1 0 1 1 0 0 和
0 1 1 0 1 0 0 1 0 0 0 1 0 0 1 1 校驗和
圖B-2 二進位制記法的和與校驗和
B.1.2校驗和
在計算出和以後,我們把每一個位求反碼,得出檢驗和。圖B-2也給出了檢驗和。二進位制計算方法其實可以轉換為十進位制計算,原理相同。