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...