精华内容
下载资源
问答
  • IP数据报首部检验和原理

    千次阅读 2020-10-31 21:09:45
    在发送方,先把IP数据报首部划分为许多16位字的序列,并把检验和字段置为0,用反码算术运算把所有16位字相加,将得到的的反码写入检验和字段。 接收方收到数据后,将首部所有的16位字使用反码算术运算相加一次,将...

    首部检验和

    首部检验和,只检验数据报的首部,不包括数据部分。
    在发送方,先把IP数据报首部划分为许多16位字的序列,并把检验和字段置为0,用反码算术运算把所有16位字相加,将得到的和的反码写入检验和字段。
    接收方收到数据后,将首部所有的16位字使用反码算术运算相加一次,将得到的和取反码,即得出接收方检验和的计算结果。若首部未发生任何变化,该结果为0,于是就保留这个数据报。否则就认为出错,并将此数据报丢弃。
    在这里插入图片描述

    示例:

    Wireshark抓包,图中蓝色的为ip数据报首部信息。
    在这里插入图片描述
    45 00 00 3c
    4:版本,4
    5:首部长度为5个32位,即20字节
    00:区分服务
    00 3c:总长度为60个字节,其中首部长度20字节,数据部分40个字节
    eb 20 00 00
    eb 20:标识
    00 00:3位的标志和13位的片偏移
    40 01 b7 fb
    40:生存时间TTL为64
    01:协议,1代表ICMP协议
    b7 fb:首部检验和
    c0 a8 2b 53
    源地址:192.168.43.83
    c0 a8 2b 01
    目的地址:192.168.43.1

    1.发送方先把IP数据报首部划分为许多16位字的序列,并把检验和字段置为0
    4500 003c 3b20 0000 4001 0000 c0a8 2b53 c0a8 2b01
    2.然后进行反码算术运算把所有16位字相加求和取反码
    求和得 48 04,取反得 b7 fb,写入检验和字段
    3.接收方收到后将首部所有的16位字使用反码算术运算相加求和取反码
    4500 003c 3b20 0000 4001 b7fb c0a8 2b53 c0a8 2b01
    求和得 ff ff ,取反得 00 00,因此判断未出现差错。

    展开全文
  • ip数据报首部检验和

    2014-09-30 23:35:30
    ip数据报首部检验和,是保证在发送端接收端 首部数据没有改变,但是ttl字段每经过一个路由器就减1,这怎么办
  • IP数据报首部检验和字段分析

    千次阅读 2014-04-21 11:00:48
     在发送数据时,为了计算IP数据包的校验。应该按如下步骤:  (1)把IP数据包的校验字段置为0;  (2)把首部看成以16位为单位的数字组成,依次进行二进制反码求和;  (3)把得到的结果存入校验...

    说明:本文仅供学习交流,不得用于其它目的,转载请标明出处,欢迎转载!

          我们知道,IP是TCP/IP协议族中最为核心的协议。所有的TCP、UDP、ICMP、IGMP都是以IP数据报的格式传输,而IP数据报首部中包含16位首部检验和字段,那么该字段是如何工作的呢?就此,我们从以下几个问题来分析:

          1.发送方是如何填充该16位检验和字段的?

          2.接收方式如何通过该16为检验和字段来判断数据是否在传输过程中发生错误?

          下面,我们根据这两个问题,做详细的分析。

           问题一:发送方与检验和字段

            关于发送方如何填充检验和字段,我们应该分为以下两种情况分析:

           情况一:当采用的是IP时,首部检验和字段仅根据数据报的首部计算检验和码;

            情况二:当采用的是TCP、UDP、ICMP、IGMP时,首部检验和则同时根据数据报的首部和数据部分进行检验和码的计算。

            对于这两种情况,计算过程是一样的,只是计算的范围不一样而已,下面我们仅以IP为例:

            计算过程:

             1.将数据报首部中的16为检验和字段各位全部置0;

             2.将首部中的数据按16位分成若干块,每个数据块包含16位(每块包含16位的原因是检验和正好是16位,这样便于将计算结果填充到对应的16位字段);

             3.将上述各个含16位的块取反再求和,值得注意的是,在求和过程中,如果发生进位,则不管。相当于我们在C语言中的异或运算(相同为0,不同为1)

             4.将最终的结果取反后填入到检验和字段。

             问题二:接收方与检验和字段

             接收方同样根据协议的类型,在收到数据后来决定数据报的数据部分是否需要参与运算(只有IP的数据部分不需参与运算,TCP,UDP,ICMP,IGMP的数据部分均需要参与运算),此时检验和字段也需要参与计算,具体如下:

              1.将收到的数据报首部中的数据按照16位分成若干块;

              2.将上述各个含16位的块取反再求和,千万要记住此时检验和字段也参与计算(而在发送发,检验和字段是否参与运算对结果并不会产生影响,因为接收方该字段最终会被填充)

              3.根据最终的16位反码求和结果,判断数据是否出错。若最终结果为0,则说明数据无误,将数据接收;若最终计算结果不为0(实际上,根据二进制反码的定义,存入到字段的却是16个全1),则说明数据有误,将数据抛弃,注意不会向发送方发送一个相应的ICMP报文,这件事应该由上层根据丢失的报文来发送相应的ICMP报文

              注意:上面第3步中有些书上是根据结果是否为11111111 1111111,即0的反码来判断,但是都是一个意思。

           问题三:为什么可以通过这种方法来验证数据是否有误?

           这种方法其实很好理解,我先举个很简单的例子:

           还记得C/C++中的异或运算^吗?异或运算满足:

           交换律:a^b=b^a;

           结合律:  a^b^c=(a^b)^c=a^(b^c)

           且满足性质:0^a=a,   a^a=0

           则必有:a^b^b=a^(b^b)=a^0=a

           记得刚我们所说的反码求和的过程吗?我们提出不进位机制,这样整个求和过程就相当于是一个异或运算过程。现在假设首部中的反码求和结果(假设此时不包含检验和那16位)X,则发送方的检验和字段被X填充。若数据在传送过程不发生错误,则接收方在收到数据报的时候同样是采用反码求和,此时首部中的其他位反码之和(不包含检验和字段)仍然是X,而数据报的检验和字段取反之和则变为-XX+(-X)=0,所以可以根据结果是否为0来判断数据在传输过程是否发生错误。

            整个过程就相当于将一个数A,与其相反数-A相加是否为0。有人肯定会说,那还用说,3岁小孩都知道会为0。但是你必须得明白,数据报中可能某个16位组成的块在发送前是X1,但是若数据在传送过程中发生错误的话,接收端接到该数据的值就不一定是X1,可能变成X2了,这样X1‘+(-X1)=X2+(-X1),就不为0了。这个校验的过程就是这么一个原理!现在应该明白了吧!

    展开全文
  • IPV4数据首部长度为5,数据总长度为80字节,数据的标识为1,未分片, TTL值为4,封装的是TCP数据,源地址目的地址分别是192.168.20.86192.168.21.20, 请对IP数据报进行首部校验。
  • IP数据报首部校验算法说明

    千次阅读 2017-12-28 16:26:28
    IP数据报首部校验算法》 1. IP数据报首部校验主要用于保证IP数据报头的完整性。 2. 该算法为“反码求和校验”,”反码求和校验“是一个专用术语,区别于先求反码再求和。 3. 该算法过程如下文所示例。  => ...


    《IP数据报首部校验和算法说明》


    1.  IP数据报首部校验主要用于保证IP数据报头的完整性。

    2.  该算法为“反码求和校验”,”反码求和校验“是一个专用术语,区别于先求反码再求和。

    3.  该算法过程如下文所示例。

        => 发送方
        i.   将校验和字段初始化为0,然后将IP报头按照16bit分成多个单元,如果报头长度不是
            16bit整数倍,则填充0;
       
        ii.  对上述各个单元(16bit)采用“反码求和”运算,即将各个单元直接相加,高位溢出位
     加到最低位(不同于通常补码运算是直接丢掉溢出位),将得到的和取其反码,填入校验和字段即可;

        iii.  IP数据报头发送完毕后,接着发送数据报内容;


        => 接收方 

        i.   将校验和字段初始化为0,然后将IP报头按照16bit分成多个单元,如果报头长度不是

             16bit整数倍,则填充0;
       
        ii.  对上述各个单元(16bit)采用“反码加法”运算,包括发送方发送的校验和字段,
             然后检查得到的结果每个数据位是否全部为1;

        iii.  如果满足,则进行下步处理,否则表明该帧数据报在传输过程中发生错误,舍弃该帧数据;


    4.  “反码求和”运算示例


       例如,位宽为3bit的两个数值100b和101b进行反码求和运算。

        i.   100b + 101b = 1_001b,高位存在溢出;

        ii.  高位溢出的1,加到最低位。即 001b + 1b(溢出位) = 010b;

        iii. 上述两数反码求和结果为010b,然后取反,为101b即为校验和发送给接收端;

    说明:在接收端会接收到三个数值(包含校验和),100b, 101b, 101b。

       按照“反码求和”运算,结果为

       100b + 101b + 101b = 1_110b, 溢出位加到最低位后,结果为111b,每个数据位全部为1;

     (为什么全部为1,不难理解,原码010b与反码101b求和,其结果各数据位必然为1)


    备注:参考博客文章链接为http://www.360doc.com/content/15/0910/23/27653981_498345868.shtml

         








    展开全文
  • IP数据报首部校验算法

    千次阅读 2018-05-26 13:51:19
    IP数据报首部校验算法 详细 非代码当用google搜索IP数据报首部校验算法的时候,总是看到的是代码,没有看到其过程,于是就有了此文,如有错误请指正。文章省略一点,呵呵 IP/ICMP/IGMP/TCP/UDP等协议的校验...

    IP数据报首部校验和算法 详细 非代码

    当用google搜索IP数据报首部校验和算法的时候,总是看到的是代码,没有看到其过程,于是就有了此文,如有错误请指正。文章省略一点,呵呵
     
    IP/ICMP/IGMP/TCP/UDP等协议的校验和算法都是相同的,算法如下:
    在发送数据时,为了计算数IP据报的校验和。应该按如下步骤:
    (1)把IP数据报的首部都置为0,包括校验和字段。
    (2)把首部看成以16位为单位的数字组成,依次进行二进制反码求和。
    (3)把得到的结果存入校验和字段中。
    在接收数据时,计算数据报的校验和相对简单,按如下步骤:
     
    (1)当接收IP包时,需要对报头进行确认,检查IP头是否有误,算法同上2、3步,然后判断取反的结果是否为0,是则正确,否则有错。

      

    1、发送方
      i)将校验和字段置为0,然后将IP包头按16比特分成多个单元,如包头长度不是16比特的倍数,则用0比特填充到16比特的倍数;
     
      ii)对各个单元采用反码加法运算(即高位溢出位会加到低位,通常的补码运算是直接丢掉溢出的高位),将得到的和的反码填入校验和字段;
     
      iii)发送数据包。
     
    2、接收方
      i)将IP包头按16比特分成多个单元,如包头长度不是16比特的倍数,则用0比特填充到16比特的倍数;
     
      ii)对各个单元采用反码加法运算,检查得到的和是否符合是全1(有的实现可能对得到的和会取反码,然后判断最终值是不是全0);
     
    iii)如果是全1则进行下步处理,否则意味着包已变化从而丢弃之。需要强调的是反码和是采用高位溢出加到低位的,如3比特的反码和运算:100b+101b=010b(因为100b+101b=1001b,高位溢出1,其应该加到低位,即001b+1b(高位溢出位)=010b)。

     1.实例

    请看我用ominipeek的抓包

    I.将校验和字段置为0,然后将IP包头按16比特分成多个


    校验和Header Checksum:0x618D将其重置为0X0000

    将IP包头分段:

            1.  0x4500

            2.  0x0029

            3.  0x44F1

            4.  0x4000

            5.  0x8006

            6.  0x0000 ------->这个为Header Checksum的值,我们前面将其重置为0了

            7.  0xC0A8

            8.  0x01AE

            9.  0x4A7D

    +       10.  0x477D

    -------------------------------------------------------

    将1至10相加求出来的和为:0x29E70

    II.对各个单元采用反码加法运算(即高位溢出位会加到低位,通常的补码运算是直接丢掉溢出的高位),将得到的和的反码填入校验和字段

    0x0002+0x9E70=0x9E72

    0x9E72二进制为:1001 1110 0111 0010

    反码为:0110 0001 1000 1101

    0110 0001 1000 1101的16进制为:0x618D

    看看这个 是否与IP包头中的Checksum相同

    ==========================================================

    当接收到IP对其进行检测

    III.对各个单元采用反码加法运算,检查得到的和是否符合是全1(有的实现可能对得到的和会取反码,然后判断最终值是不是全0)

    当收到IP数据局包的时候,要验证IP头是否正确,则可以这样进行

            1.  0x4500

            2.  0x0029

            3.  0x44F1

            4.  0x4000

            5.  0x8006

            6.  0x618D ------->这个为Header Checksum的值

            7.  0xC0A8

            8.  0x01AE

            9.  0x4A7D

    +       10.  0x477D

    -------------------------------------------------------

    将1至10相加求出来的和为:0x2FFD

    对各个单元采用反码加法运算(即高位溢出位会加到低位,通常的补码运算是直接丢掉溢出的高位),将得到的和的反码填入校验和字段

    0x0002+0x0FFD=0xFFFF

    0xFFFF二进制为:1111 1111 1111 1111

    1111 1111 1111 1111反码为:0

    ====================================================

    关于这一部的补充说明,

    将IP包头分段:
     
            1.  0x4500
     
            2.  0x0029
     
            3.  0x44F1
     
            4.  0x4000
     
            5.  0x8006
     
            6.  0x0000 ------->这个为Header Checksum的值,我们前面将其重置为0了
     
            7.  0xC0A8
     
            8.  0x01AE
     
            9.  0x4A7D
     
    +       10.  0x477D
    ----------------------------------------------------------------------------------------------------------

    展开全文
  • IP数据报首部

    2021-05-22 22:02:45
    一般IP数据报首部为20byte,即160bit(“一般”指不带选项的首部) 依顺序各个位置含义如下: • 4bit:协议版本号,目前广泛使用的为IPv4 • 4bit:首部长度除以32(单位为bit),如160bit是32bit的5倍,则为5 • 8...
  • 一、TCP / IP 协议栈、 二、IP 数据报 格式、 三、IP 数据报 首部格式、
  • 文章主要介绍了IP数据首部检验和它的计算过程
  • IP数据报首部字段分析

    千次阅读 2020-01-29 11:22:48
    IP数据报首部字段分析 IP数据报传输使用的是网络字节序,网络字节序是大端字节序 IP数据报首部一般为20个字节(没有选项的情况),最大是60字节,60字节的计算在首部长度字段中 版本号 区分IPv4IPv6 IPv4是0100 ...
  • IP数据报首部格式

    千次阅读 2019-05-07 21:35:08
    1.IP数据报首部的固定部分中的各字段 (1)版本占4位,指IP协议的版本。通信双方使用的IP协议的版本必须一致。目前广泛使用的IP协议版本号为4(即IPv4)。关于以后要使用的IPv6(即版本6的IP协议),我们将在后面的4.6节...
  • IP数据报首部解析

    2016-10-24 13:35:00
    IP数据报首部的格式,普通20字节。 4位版本号:当前4--IPv4。 4首部长度:首部长度 8位服务类型TOS: 3bits(优先权)+ 4bits(类型--最小延迟+最大吞吐量+最高可靠性+最小费用)+ 1bits(未用,置0)。...
  • 当用google搜索IP数据报首部校验算法的时候,总是看到的是代码,没有看到其过程,于是就有了此文,如有错误请指正。文章省略一点,呵呵 IP/ICMP/IGMP/TCP/UDP等协议的校验算法都是相同的,算法如下: 在发送...
  • title: IP数据报中的首部检验和如何发挥作用? date: 2019-08-14 16:53:28 tags: - 计算机网络 - 科普 categories: - 计算机网络 在IP数据报的头部中的“首部检验和”字段,它的作用是为了校验数据 头部 在传输中...
  • IP数据报首部

    万次阅读 多人点赞 2016-02-17 21:42:50
    IP数据报首部 注:IP数据报的格式,能够说明IP协议都具有什么功能。 1. IP数据报首部——固定部分 1.1 版本 占4位,指IP协议的版本。 通信双方使用的IP协议的版本必须一致。 IP协议版本号为4(即IPv4),IP...
  • IP数据报首部checksum的计算

    千次阅读 2015-04-05 10:27:13
    一、首先区别下面两个概念: (1)one's complement:正数=...1.发送IP数据报计算checksum (1)将校验字段置为0; (2)对首部中(一般为20B)每个16位字进行二进制反码求和; (3)将(2)中得到的再取反码,即得checksum,写
  • 计算机网络的ip数据报首部各字段

    千次阅读 2016-05-08 21:35:19
    1.版本 2.首部长度 3.区分服务 4.总长度 5.标识 6.标志 7.片偏移 8.生存时间 9.协议 10.首部检验和 11.源地址 12.目的地址
  • Win32如何定义IP数据报首部

    千次阅读 2014-05-30 09:47:02
    [摘要]本文介绍Win32如何定义IP数据报首部,包括IP数据报首部的定义、TCP报文段首部的定义UDP报文段首部的定义相关内容。 在进行网络编程时,可能需要直接操作原始的IP数据报,例如编写网络嗅探器。此时要...
  • 一个ip数据报首部和数据两部分组成 首部 前一部分是固定长度,共20个字节,所有ip数据报必须有的 固定部分的后面是一些可选字段,长度可变,可有可无,很少用到 首部固定部分各字段的意义 1、版本:4bit,4 ...
  • IP数据报---首部校验的计算方法

    千次阅读 多人点赞 2019-01-01 10:37:58
    为了方便大家,这里再... IP头:  45 00 00 31  89 F5 00 00  6E 06 00 00(校验字段)  DE B7 45 5D -> 222.183.69.93 (源IP地址)  C0 A8 00 DC -> 192.168.0.220 (目的IP地址...
  • IP首部数据报格式大解析

    千次阅读 2016-11-23 16:18:33
    IP首部数据报格式大解析
  • 此时要定义一个表示IP数据报首部的结构体来获取首部中的各个信息,问题也随之而来:平时我们使用的数据都是BYTE、WORD或者DWORD,但IP数据报首部的有些字段并不按照字节、字或双字对齐,字段的长度也不是一字节、两...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 26,011
精华内容 10,404
关键字:

ip数据报首部检验和