IP TCP UDP ICMP校驗和的區別和計算

2021-10-13 02:02:19 字數 1454 閱讀 1047

ip資料報的校驗和只檢驗ip資料報的首部。

當傳送ip包時,需要計算ip報頭的校驗和:

把校驗和字段置為0;

對ip頭部中的每16bit進行二進位制求和;

如果和的高16bit不為0,則將和的高16bit和低16bit反覆相加,直到和的高16bit為0,從而獲得乙個16bit的值;

將該16bit的值取反,存入校驗和字段。

當接收ip包時,需要對報頭進行確認,檢查ip頭是否有誤,演算法同上2、3步,然後判斷取反 的結果是否為0,是則正確,否則有錯

**如下:

unsigned short in_cksum(unsigned short *addr, int len)

if (nleft == 1)

sum = (sum >> 16) + (sum & 0xffff);//將高16bit與低16bit相加

sum += (sum >> 16);//將進製到高位的16bit與低16bit 再相加

answer = (unsigned short)(~sum);

return (answer);

}

udp資料報計算校驗和的方法和ip資料報校驗和的方法相似,但是udp的校驗和是將首部和資料部分一起都校驗。

udp首部檢驗和與ip首部校驗和的計算方法相同,在程式中使用同乙個函式來計算。

需要注意的是,由於udp首部中不包含源位址與目標位址等資訊,為了保證udp校驗的有效性,在進行udp校驗和的計算時,需要增加乙個udp偽首部的校驗和。

偽首部共有12位元組,包含如下資訊:

1. 源ip位址

2. 目的ip位址

3. 保留位元組(置0,為了位元組對齊)]

4. 傳輸層協議號(tcp是6)

5. udp報文長度(報頭+資料)。

tcp 的校驗和計算方法同udp一樣,同樣要加上乙個偽頭部,區別是偽頭部的協議碼是0x06,長度是整個tcp報文的長度(包含tcp頭部)。

定義如下:

struct pseudo_hdr;
然後我們將這兩個字段複製到同乙個緩衝區sendbuf中並計算tcp校驗和:

memcpy(sendbuf,&pseudo_hdr,sizeof(pseudo_hdr));

memcpy(sendbuf+sizeof(pseudo_hdr),&tcp_header,sizeof(tcp_header));

tcp_hdr->check=checksum((ushort *)sendbuf,sizeof(pseudo_hdr)+sizeof(tcp_header));

icmp校驗和的計算方法一樣,只不過只是對icmp包整個進行校驗和,沒有偽頭部,也不包括ip包頭部。

校驗和計算

unsigned int cal crc unsigned char ptr,unsigned char len 余式crc乘以2再求crc else crc 2 if ptr i 0 crc 0x1021 再加上本位的crc ptr return crc 按位計算crc雖然 簡單,所占用的記憶體比...

校驗和簡介

hash,一般翻譯做 雜湊 也有直接音譯為 雜湊 的,就是把任意長度的輸入 又叫做預對映,pre image 通過雜湊演算法,變換成固定長度的輸出,該輸出就是雜湊值。這種轉換是一種壓縮對映,也就是,雜湊值的空間通常遠小於輸入的空間,不同的輸入可能會雜湊成相同的輸出,而不可能從雜湊值來唯一的確定輸入值...

校驗和總結

1 ip校驗和只校驗20位元組的ip報頭,並不會計算資料部分的校驗和。因為ip也是不可靠,盡最大努力投遞。2 icmp校驗和覆蓋整個報文 icmp報頭 icmp資料 3 udp和tcp校驗和不僅覆蓋整個報文 頭部 資料 而且還有12位元組的ip偽首部,其中 包括源ip位址 4位元組 目的ip位址 4...