ip數據報首部校驗和的計算
網絡層間的數據傳送特點是:
不可靠: 分組可能丟失,亂序等,不做確認;
無連接: 每個分組都獨立對待;
盡力投遞: 不隨意放棄分組;
點到點。
因爲在傳輸過程中會受到很多的干擾,ip數據包會發生改變,這時接受着收到這個ip數據包毫無意義。在這種情況下應把這樣的數據包丟掉。那麼怎樣確定數據包發生了變化,這就用到了首部校驗和。就是發送者把Ip首部的校驗和外的數據全部相加再取反再放到校驗和位置(如果高位有溢出的就把溢出數據加到低位)。接收者只要把整個ip數據報首部數據相加,判斷是否爲0,如果是0就收下,如果不是的話就扔提。
具體實現的代碼是:
/*求校驗和函數*/
USHORT CheckSum(USHORT *buffer, int size)
{
unsigned long cksum=0;
while (size > 1)
{
cksum += *buffer++;
size -= sizeof(USHORT);
}
if (size)
{
cksum += *(UCHAR*)buffer;
}
/*對每個16bit進行二進制反碼求和*/
cksum = (cksum >> 16) + (cksum & 0xffff);
cksum += (cksum >>16);
return (USHORT)(~cksum);
}
不可靠: 分組可能丟失,亂序等,不做確認;
無連接: 每個分組都獨立對待;
盡力投遞: 不隨意放棄分組;
點到點。