当前位置:  技术问答>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!
请问这是为什么?


|
算法理解错了,1's complement arithmetic的相加不是取反再加,是相加后把进位加到后边,即:
sum += *buf++;
if (sum & 0xFFFF0000) //有进位
{
   sum &= 0xFFFF;
   ++sum;
}

这样循环完成后,取反即可:sum = ~(sum & 0xFFFF);

    
 
 

您可能感兴趣的文章:

 
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 初学者这样检验自己的学习效果呢?
  • Java邮件检验库 JEmval
  • JB中是否有现成的文本检验组件?
  • MD5检验码的作用?
  • 基于bootstrap的检验组件 bt-validate
  • jquery检验实例-改变错误提示信息的位置
  • 如何检验Java虚拟机是否存在??? 谢谢 在线求答!!!
  • Oracle释出Linux资料完整检验开放源码
  • 中文用户名的js检验正则
  • 检验SQL Server备份的脚本
  • 检验表单的checkbox是否选择,怎么不行?错在哪里?看里面的代码
  • .net/c#/asp.net iis7站长之家
  • 有没有根据schema文件检验xml文档的java包或方法??
  • sql server全角字符与半角字符的检验
  • jquery检验用户是否已注册的实例代码
  • 检验你的SCJP能力!!!来自SUN的SCJP题库中的一道经典线程题目,你能做出正确的答案吗???


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3