溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

ip首部校驗和計算

發(fā)布時間:2020-07-07 12:06:02 來源:網絡 閱讀:450 作者:淺夢oo 欄目:網絡安全

 IP首部校驗和的計算方法:

  1.把校驗和字段清零。

  2.然后對每16位(2字節(jié))進行二進制反碼求和,反碼求和的意思是先對每16位求和,再將得到的和轉為反碼。

  接下來詳細描述反碼求和的步驟:看下面的代碼

  算法:

SHORT checksum(USHORT* buffer, int size)
{
    unsigned long cksum = 0;
    while(size>1)
    {
        cksum += *buffer++;
        size -= sizeof(USHORT);
    }
    if(size)
    {
        cksum += *(UCHAR*)buffer;
    }
    cksum = (cksum>>16) + (cksum&0xffff); 
    cksum += (cksum>>16); 
    return (USHORT)(~cksum);
}

  參數buffer是指向16位整數的指針,剛開始指向的是IP首部的起始地址,參數size是IP首部的大小。while循環(huán)是將IP首部的內容以16位為單元加在一起,如果沒有整除(即size還有余下的不足16位的部分),則加上余下的部分,此時的cksum就是相加后的結果,這個結果往往超出了16位,因為校驗和是16位的,所以要將高16位和計算得到的cksum再加工。

  再加工第一步:cksum = (cksum>>16) + (cksum&0xffff); sum>>16是將高16位移位到低16位,sum&0xffff是取出低16位,相加得到新的cksum。

  再加工第二步:cksum += (cksum>>16); 第一步相加時很可能會產生進位,因此要再次把進位移到低16位進行相加?! ?/p>

  這樣就加工好了,接下來就是取反,并強制轉換為16位,這樣就得到了最終的校驗和。

  校驗和計算出來了,接下來就是該如何校驗:

  接收方進行校驗時,也是對每16位進行二進制反碼求和。接收方計算校驗和時的首部與發(fā)送方計算校驗和時的首部相比,多了一個發(fā)送方計算出來的校驗和。因此,如果首部在傳輸過程中沒有發(fā)生差錯,那么接收方計算的結果應該為全一,因為接收方計算除校驗和以外的部分得到值是校驗和的反碼,再加多出來的校驗和當然是全一了。



附加:

IP頭:

4500 0046

17d9 0000

4011 ec1d(校驗字段)

ac1c 0f3b 

ac1c 0f3d

計算:4500 + 0046 +17d9 + 0000 + 4011+ ec1d +ac1c + 0f3b + ac1c + 0f3d 

  取出的和相加再取反->即為應填充的校驗和

  當接受到IP數據包時,要檢查IP頭是否正確,則對IP頭進行檢驗,方法同上:

計算:

  4500 + 0046 +17d9 + 0000 + 4011+ ec1d +ac1c + 0f3b + ac1c + 0f3d  它們的和相加得出的一個數再次相加為FFFF,得到的結果是全一,正確。

  得到的結果是全一,正確。




向AI問一下細節(jié)

免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI