校驗演算法之二進位制反碼求和

2021-09-08 22:05:54 字數 2732 閱讀 1358

ip/icmp/igmp/tcp/udp等協議的校驗和演算法都是相同的,演算法如下:

在傳送資料時,為了計算數ip據報的校驗和。應該按如下步驟:

(1)把ip資料報的首部都置為0,包括校驗和字段。

(2)把首部看成以16位為單位的數字組成,依次進行二進位制反碼求和。

(3)把得到的結果存入校驗和字段中。

在接收資料時,計算資料報的校驗和相對簡單,按如下步驟:

(1)把首部看成以16位為單位的數字組成,依次進行二進位制反碼求和,包括校驗和字段。

(2)檢查計算出的校驗和的結果是否等於零。

(3)如果等於零,說明被整除,校驗是和正確。否則,校驗和就是錯誤的,協議棧要拋棄這個資料報。

其中,二進位制反碼求和的計算方法:

首先,我們計算如圖b-1所示的部分和。我們把每一列相加,如果有進製,就加到下一列。注意以下幾點:

1------------------------第16列的進製

1 1------------------------第15列的進製

| 1| 1 0

| | 1 1

| | | 1  0

| | | |  1 0

| | | |  | 1 1

| | | |  | | | 1  0

| | | |  | | | |  1 0

| | | |  | | | |  | 1 1

| | | |  | | | |  | | 1 1

| | | |  | | | |  | | 1 0  0-----------第3列的進製

| | | |  | | | |  | | | 1  0 0-----------第2列的進製

| | | |  | | | |  | | | |  | 1 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 0 1     部分和

圖b-1  二進位制記法的部分和

1,當我們加第1列(最右邊一列)的時候,我們得到7。在二進位制中,數7是111。我們保留最右邊的1,把其餘的位進到第2列和第3列。

2,當我們加第2列時,我們計入從第1列來的進製。結果是8,它是二進位制的1000。我們保留第乙個位(最右邊的),把其餘100進製給第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 0 1     部分和11

____________________________________

1 0 0 1  0 1 1 0  1 1 1 0  1 0 1 1      和

0 1 1 0  1 0 0 1  0 0 0 1  0 1 0 0      校驗和

圖b-2 二進位制記法的和與校驗和

b.1.2校驗和

在計算出和以後,我們把每乙個位求反碼,得出檢驗和。圖b-2也給出了檢驗和。二進位制計算方法其實可以轉換為十進位制計算,原理相同。

演算法的實現:

首先,檢視了linux 2.6核心中的校驗演算法,使用組合語言編寫的,顯然效率要高些。**如下:

unsigned short ip_fast_csum(unsigned char * iph,

unsigned int ihl)

在這個函式中,第乙個引數顯然就是ip資料報的首位址,所有演算法幾乎一樣。需要注意的是第二個引數,它是直接使用ip資料報頭資訊中的首部長度字段,不需要進行轉換,因此,速度又快了(高手就是考慮的周到)。使用方法會在下面的例子**中給出。

第二種演算法就非常普通了,是用c語言編寫的。我看了許多實現網路協議棧的**,這個演算法是最常用的了,即使變化,也無非是先取反後取和之類的。考慮其原因,估計還是c語言的移植性更好吧。下面是該函式的實現:

unsigned short checksum(unsigned short *buf,int nword)

校驗演算法之二進位制反碼求和

ip icmp igmp tcp udp等協議的校驗和演算法都是相同的,演算法如下 在傳送資料時,為了計算數ip據報的校驗和。應該按如下步驟 1 把ip資料報的首部都置為0,包括校驗和字段。2 把首部看成以16位為單位的數字組成,依次進行二進位制反碼求和。3 把得到的結果存入校驗和字段中。在接收資料...

二進位制反碼求和校驗碼演算法

校驗和演算法 經常看計算機網路相關的書時,每次看到關於ip或者是udp報頭校驗和時,都是一笑而過,以為相當簡單的東西,不就是16bit資料的相加嗎!最近在學習ping命令的源待時,看到裡面有關於校驗和的演算法。一頭霧水,後來查詢資料,看到校驗和是16bit字的二進位制反碼和。總是覺得很奇怪,為什麼會...

TCP IP 中的二進位制反碼求和演算法

對於這個演算法,很多書上只是說一下思路,沒有具體的實現。我在這裡舉個例子吧。以4bit 計算方便一點,和16bit是一樣的 做檢驗和來驗證。建設原始資料為 1100 1010 0000 校驗位 那麼把他們按照4bit一組進行按位取反相加。1100取反0011 1010取反是0101,0011加上01...