阅读:1363回复:6
关于IP数据报的校验在中间层驱动的计算问题
我写了一个中间层NDIS驱动,来修改IP头,因此需要重新计算校验,我按这样计算,将IP头的所有字节(包括选项)
具体方法如下: //pbSrc IP报头信息 //pbDest 保存计算后的头信息 //nLen IP报头信息长 void CheckSum(unsigned char *pbSrc , int nLen , unsigned char *pbDest) { int i ; PWORD pwData ; WORD wCheckSum = 0; for(i=0;i<nLen;) { pbDest = pbSrc[i+1] ; pbDest[i+1] = pbSrc ; i = i+2 ; } pwData = (PWORD)pbDest ; pwData[5] = 0 ; nLen = nLen>>1 ; for(i=0;i<nLen;i++) { wCheckSum = wCheckSum+ (~pwData) ; } pwData[5] = ~wCheckSum ; } 但是这样计算的结果不等于原来IP报头信息中的CheckSum. 请问各位,我错在什么地方了 |
|
|
沙发#
发布于:2002-08-01 17:26
呵呵,你改了ip头,当然checksum就不一样了!
但重新计算前要把原来的checksum清0! |
|
板凳#
发布于:2002-08-01 23:24
你算的不对。
建议你下个标准的算法吧。 嗬嗬! |
|
|
地板#
发布于:2002-08-02 10:12
呵呵,你改了ip头,当然checksum就不一样了! 我上面的函数只是计算CheckSum是否等于IP 头中的CheckSum, 我首先将数据备份到pbDest中,并且在 pwData[5] = 0 ; 中将CheckSum清0, 可是计算后的CheckSum不等于我得到的包中的CheckSum,我是通过2000的网络监视软件来得到的数据,然后在计算的。 |
|
|
地下室#
发布于:2002-08-02 10:25
你算的不对。 我是按照RFC标准计算的, 按以下几步: 对于发送端 1、将数分为k部分,每部分n比特。 2、将校验和清0。 3、用反码运算将所有这些部分相加。 4、将结果取反。 5、结果写到校验和中。 我是那步错了,请兄弟告知 |
|
|
5楼#
发布于:2002-08-02 11:36
反码?
hehe USHORT iphdr_cksum(USHORT *iph) { USHORT i; ULONG sum; i = 0; sum = 0; while(i++ < (sizeof(IP_HEADER)/2)) sum += *iph++; sum = (sum >> 16) + (sum & 0xffff); sum += (sum >> 16); sum = ~sum; return (USHORT)sum; } 估计能,看明白了吧。那就用它吧。 嗬嗬! |
|
|
6楼#
发布于:2002-08-02 12:01
反码? 多谢大狭指点 |
|
|