当前位置: 技术问答>linux和unix
IP检验和问题请教。。。
来源: 互联网 发布时间:2015-05-22
本文导语: 我按照TCPIP详解中的描述,计算IP的检验和老是不对,请问何解? 一以太网报文: 0: 0800 20ed 10ed 0006 5b6d 9e70 0800 4500 .. .....[m.p..E. 16: 0029 e431 4000 8006 e958 0a46 0c9a 0a46 .).1@....X.F...F...
我按照TCPIP详解中的描述,计算IP的检验和老是不对,请问何解?
一以太网报文:
0: 0800 20ed 10ed 0006 5b6d 9e70 0800 4500 .. .....[m.p..E.
16: 0029 e431 4000 8006 e958 0a46 0c9a 0a46 .).1@....X.F...F
32: 0c1f 0419 0017 0153 bcc2 30f4 9455 5018 .......S..0ô.UP.
48: 21f2 6005 0000 7900 0000 0000 !.`...y.....
其中从14地址开始到33地址结束的20个字节为IP报文。全报文如下:
4500 0029 e431 4000 8006 e958 0a46 0c9a 0a46 0c1f
按照解说,IP检验和计算方法:
首先把检验和字段设置为0,然后对每个16bit进行二进制反码求和,结果字段保存在检验和字段中。
附IP报文格式:
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|Version| IHL |Type of Service| Total Length |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Identification |Flags| Fragment Offset |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Time to Live | Protocol | Header Checksum |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Source Address |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Destination Address |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Options | Padding |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
我计算的结果却和实际结果(0xe958)有出入。
计算方法为:
Source:
4500 0029 e431 4000 8006 0000 0a46 0c9a 0a46 0c1f
BAFF FFD6 1BCE BFFF 7FF9 FFFF F5B9 F365 F5B9 F3E0
BAFF+FFD6
=BAD5+1BCE
=D6A3+BFFF
=96A2+7FF9
=169B+FFFF
=169A+F5B9
=0C53+F365
=FFB8+F5B9
=F571+F3E0
=E951
我得到的结果为:0xE951!
请问这是为什么?
一以太网报文:
0: 0800 20ed 10ed 0006 5b6d 9e70 0800 4500 .. .....[m.p..E.
16: 0029 e431 4000 8006 e958 0a46 0c9a 0a46 .).1@....X.F...F
32: 0c1f 0419 0017 0153 bcc2 30f4 9455 5018 .......S..0ô.UP.
48: 21f2 6005 0000 7900 0000 0000 !.`...y.....
其中从14地址开始到33地址结束的20个字节为IP报文。全报文如下:
4500 0029 e431 4000 8006 e958 0a46 0c9a 0a46 0c1f
按照解说,IP检验和计算方法:
首先把检验和字段设置为0,然后对每个16bit进行二进制反码求和,结果字段保存在检验和字段中。
附IP报文格式:
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|Version| IHL |Type of Service| Total Length |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Identification |Flags| Fragment Offset |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Time to Live | Protocol | Header Checksum |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Source Address |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Destination Address |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Options | Padding |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
我计算的结果却和实际结果(0xe958)有出入。
计算方法为:
Source:
4500 0029 e431 4000 8006 0000 0a46 0c9a 0a46 0c1f
BAFF FFD6 1BCE BFFF 7FF9 FFFF F5B9 F365 F5B9 F3E0
BAFF+FFD6
=BAD5+1BCE
=D6A3+BFFF
=96A2+7FF9
=169B+FFFF
=169A+F5B9
=0C53+F365
=FFB8+F5B9
=F571+F3E0
=E951
我得到的结果为:0xE951!
请问这是为什么?
|
算法理解错了,1's complement arithmetic的相加不是取反再加,是相加后把进位加到后边,即:
sum += *buf++;
if (sum & 0xFFFF0000) //有进位
{
sum &= 0xFFFF;
++sum;
}
这样循环完成后,取反即可:sum = ~(sum & 0xFFFF);
sum += *buf++;
if (sum & 0xFFFF0000) //有进位
{
sum &= 0xFFFF;
++sum;
}
这样循环完成后,取反即可:sum = ~(sum & 0xFFFF);
您可能感兴趣的文章:
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。