IP 協(xié)議采用統(tǒng)一的校驗算法,其計算比較簡單:設(shè)校驗和初值為0,然后對數(shù)據(jù)每16位求異或,結(jié)果取反,便得校驗和。校驗時將數(shù)據(jù)(含校驗和)按同樣的算法求和,結(jié)果為0則數(shù)據(jù)正確,不為0表示通訊出錯,需要丟棄該數(shù)據(jù)包。這樣能簡化校驗程序設(shè)計,提高TCP/IP協(xié)議的效率。
應(yīng)廣大讀者的要求給出作者通用的IP校驗程序:
typedef unsigned int __u16;
typedef unsigned long __u32;
__u16 checksum(__u16 xdata *dp, __u16 length)
{
__u32 sum = 0;
__u16 len = length >> 1;
while(len-- > 0)
sum += *dp++;
if(length & 1)
sum += (*dp & 0xFF00);
sum = (sum >> 16) + (sum & 0xFFFF);
sum += (sum >> 16);
len = sum & 0xFFFF;
return(~len);
}
所有TCP/IP協(xié)議的校驗和計算和數(shù)據(jù)包的校驗均由上面的子程序完成。不過需要注意的是TCP和UDP的校驗需要加上偽頭標,不然得不到正確的結(jié)果,偽頭標違背了協(xié)議的分層原則,但這種違背是出于實際需要的,也正體現(xiàn)了TCP/IP協(xié)議設(shè)計的靈活性。