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