IP協(xié)議校驗(yàn)算法程序
掃描二維碼
隨時(shí)隨地手機(jī)看文章
IP 協(xié)議采用統(tǒng)一的校驗(yàn)算法,其計(jì)算比較簡(jiǎn)單:設(shè)校驗(yàn)和初值為0,然后對(duì)數(shù)據(jù)每16位求異或,結(jié)果取反,便得校驗(yàn)和。校驗(yàn)時(shí)將數(shù)據(jù)(含校驗(yàn)和)按同樣的算法求和,結(jié)果為0則數(shù)據(jù)正確,不為0表示通訊出錯(cuò),需要丟棄該數(shù)據(jù)包。這樣能簡(jiǎn)化校驗(yàn)程序設(shè)計(jì),提高TCP/IP協(xié)議的效率。
應(yīng)廣大讀者的要求給出作者通用的IP校驗(yàn)程序:
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é)議的校驗(yàn)和計(jì)算和數(shù)據(jù)包的校驗(yàn)均由上面的子程序完成。不過(guò)需要注意的是TCP和UDP的校驗(yàn)需要加上偽頭標(biāo),不然得不到正確的結(jié)果,偽頭標(biāo)違背了協(xié)議的分層原則,但這種違背是出于實(shí)際需要的,也正體現(xiàn)了TCP/IP協(xié)議設(shè)計(jì)的靈活性。