您好,登錄后才能下訂單哦!
今天上課提到IP頭部校驗和怎么算的,還真不是很清楚,于是去網上查了些資料,整理記錄一下。
IP首部校驗和的計算主要是兩步:按位異或和取反,具體來說
1. IP頭部以16位為一個單位,逐個模2加(相當于異或);
2. 得到的結果取反,作為校驗和放入校驗和字段;
3. 初始計算校驗和字段時該字段全部用0填充;
以上是對于發送者來說如何計算校驗和的,而對于接收者來說,驗證也很簡單:
1. 對于接收的IP報文頭部以16位為單位逐個求和;
2. 若結果為1,則校驗正確,否則出錯丟棄;
原理很簡單,接收方的計算對象是A和A的反的異或,結果當然是1了!
具體的程序實現例子如下:
SHORT checksum(USHORT* buffer, int size)
{
unsigned long cksum = 0;
//每16位相加
while(size>1)
{
cksum += *buffer++;
size -= sizeof(USHORT);
}
//最后的奇數字節
if(size)
{
cksum += *(UCHAR*)buffer;
}
cksum = (cksum>>16) + (cksum&0xffff); //將高16bit與低16bit相加
cksum += (cksum>>16); //將進位到高位的16bit與低16bit 再相加,確保高16位為0
return (USHORT)(~cksum); //最后將結果取反,得到checksum
}
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。