检查tcp校验和

检查tcp校验和,tcp,checksum,Tcp,Checksum,我有以下数据包(十六进制): 其中我已识别出IP头: 45 00 00 2C 14 3C 40 00 80 06 63 39 C0 A8 01 02 C0 A8 01 04 TCP标头: 11 EF 00 7C 4F BF BB FE 18 DF 7A 77 50 18 00 40 02 41 00 00 数据呢 78 70 00 01 我正在验证校验和。为此,我对TCP头中的所有字段进行了汇总,除了校验和字段,它给出了201D6 然后,我将数据字节相加,这将添加到7871 然后,我将计算

我有以下数据包(十六进制):

其中我已识别出IP头:

45 00 00 2C
14 3C 40 00
80 06 63 39
C0 A8 01 02
C0 A8 01 04
TCP标头:

11 EF 00 7C
4F BF BB FE
18 DF 7A 77
50 18 00 40
02 41 00 00
数据呢

78 70 00 01
我正在验证校验和。为此,我对TCP头中的所有字段进行了汇总,除了校验和字段,它给出了
201D6

然后,我将数据字节相加,这将添加到
7871

然后,我将计算出的TCP长度(24)添加到协议中,并添加IP源地址和目标地址;总计:
18380

将最后三个标记的量与其
3FDC7
相加,并将最有价值的数字与数字的其余部分相加,即
FDCA
,计算其一个补码时,该数字变为
0235
。然而,这与原始数据包的校验和不同


我在哪里把事情搞砸了?

计算中有两个错误:

第一个是简单的,TCP长度加起来是24,但是长度必须是十六进制的,所以它是
0x0018

第二个更为棘手,报告说:

校验和字段是one的16位one的补码 标题和文本中所有16位字的补码和

因此,它不仅是一个16位单词的简单和,而且是一个一个人的补码和,这解释了它是如何工作的:

  • 将16位值相加。每次产生进位(第17位)时,将该位来回摆动,并将其添加回LSb(自己的位置) 数字)。这有点被错误地称为“补语” 添加。”

  • 以这种方式添加所有值后,反转结果中的所有位。一种二进制值,具有另一个二进制的所有位 倒转的值被称为它的“补码”,或者简单地说是它的 “补充。”

  • 这样做你会发现:

    • 0x01D8
      用于不带校验和的TCP标头

    • 数据的
      0x7871

    • 0x8375
      用于伪标头

      • 0x0018
        用于TCP长度

      • IP src的
        0xC0A0102

      • C0A80104
        用于IP dst

      • 协议的
        0x0006

    16位1的补码和以及所有这些的补码给出了正确的结果

    78 70 00 01