校驗和計算方法

2021-09-26 19:49:21 字數 928 閱讀 4503

1.說明:

[1]校驗和覆蓋的內容:

ip校驗和:ip首部。

icmp校驗和:icmp首部+icmp資料;

2.計算校驗和的步驟:

[1]把校驗和字段設定為0。

[2]把需要校驗的資料看成以16位為單位的數字組成,依次進行二進位制反碼求和。

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

另外udp、tcp資料報的長度可以為奇數位元組,因為計算時是16位為單位,所以此時計算校驗和時需要在最後增加乙個填充位元組0(只是計算校驗和用,不傳送出去)。

3.接收端校驗校驗和步驟:

[1]把需要校驗的內容(包括校驗和字段)看成以16位為單位的數字,依次進行二進位制反碼求和,如果結果是0表示正確,否則表示錯誤。

4.二進位制反碼求和步驟:

[1]二進位制反碼求和,就是先把這兩個數取反,然後求和,如果最高位有進製,則向低位進1。

[2]另外,先取反後相加與先相加後取反,得到的結果是一樣的。因此實現**都是先相加,最後再取反。

5.實現**:

static inline uint16_t check_sum(const uint16_t *buffer, int size)

//長度奇數情況

if(size)

cksum += *((unsigned char *)buffer);

//高位有進製,進製到低位,下面兩行**保證了高16位為0。

cksum = (cksum>>16) + (cksum&0xffff);

cksum += (cksum>>16);

//最後取反

return (uint16_t)(~cksum);

}

校驗和的計算方法

校驗和演算法 unsigned short check sum unsigned short addr,int len if nleft 1 sum sum 16 sum 0xffff sum sum 16 answer sum return answer 首先,ip icmp udp和tcp報文頭...

IP首部校驗和字段計算方法

ip首部有16bit的校驗和,因此,ip首部以16bit為單位計算校驗和,ip首部的長度一定是16bit的整倍數,這是由於首部長欄位是以32bit為單位計算的,不足的補0。傳送方計算方法 1.首先把校驗和的16bit置0。2.將首部以16bit為單位異或 或模2加,結果相同 3.將異或結果取反,並填...

IP和TCP包頭校驗和計算方法

出處 校驗和的演算法 將資料以字為單位累加到乙個雙字中,如果資料長度為奇數,最後乙個位元組要先變成字,然後在加到原來的雙字中,最後得到的結果是乙個雙字,最後將這個雙字的高16位和低16位反覆相加,直到高16位為0,從而就獲得乙個16位的值,再將這個16位的值取反就得到校驗和的值了。在接收端接收到ip...