博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
IP首部检验和
阅读量:4203 次
发布时间:2019-05-26

本文共 1261 字,大约阅读时间需要 4 分钟。

参考网址:

  首部检验和字段是根据IP首部计算的检验和码。它不对首部后面的数据进行计算。ICMP、IGMP、UDP和TCP在它们各自的首部中均含有同时覆盖首部和数据检验和码。

  为了计算一份数据报的IP检验和,首先把检验和字段置为0。然后,对首部中每个16 bit进行二进制反码求和(整个首部看成是由一串16 bit的字组成),结果存在检验和字段中。当收到一份IP数据报后,同样对首部中每个16 bit进行二进制反码的求和。由于接收方在计算过程中包含了发送方存在首部中的检验和,因此,如果首部在传输过程中没有发生任何差错,那么接收方计算的结果应该为全1。如果结果不是全1(即检验和错误),那么IP就丢弃收到的数据报。但是不生成差错报文,由上层去发现丢失的数据报并进行重传。
  普通的IP首部长为20个字节,不带IP选项。位于数据包的第0x000E~0x0021字节(0x0000~0x000D为以太网首部)。普通IP首部的标志是第0x000E字节的值为0x45。计算之前应将第0x0018、0x0019两个字节置零。
  反码求和时,最高位的进位要进到最低位,也就是循环进位。因为IP包头和TCP整个报文段比较短(没达到2^17数量级),所以不可能导致4字节的sum溢出。32位数据的高位比特移位16比特,再加上原来的低16比特,实现高位溢出加到低位。

  定理1:原码+反码= value1,则value1的二进制全为1

  定理2:相加后取反=取反后相加

  接收数据时按如下步骤:

  1.把首部看成以16位为单位的数字组成,依次进行二进制反码求和,包括校验和字段。
  2.检查计算出的校验和的结果是否等于零(反码应为16个1)。
  3.如果等于零,说明校验和正确。否则,校验和错误,协议栈将抛弃这个数据包。
unsigned short checksum(unsigned short *buf, int size)
{
  unsigned long sum = 0;
  while(size > 1) {
    sum += *buf++;
    size -= sizeof(unsigned short);
  }
  if(size)  
    sum += *(unsigned char*)buf;
  sum = (sum >> 16) + (sum & 0xffff);
  sum += (sum >> 16);
  return (unsigned short)~sum; // 接收时sum值应为16个1,取反后为0。
}

测试数据:4500 0040 0E80 4000 8006 74FB AC14 9E0A AC14 8109

4500 0040 0E80 4000 8006 0000 AC14 9E0A AC14 8109 38B01 8B04

BAFF FFBF F17F BFFF 7FF9 FFFF 53EB 61F5 53EB 7EF6 674F5 74FB

转载地址:http://fssli.baihongyu.com/

你可能感兴趣的文章
SQL注入法攻击一日通
查看>>
菜鸟入门级:SQL注入攻击
查看>>
用vbs来写sql注入等80端口的攻击脚本
查看>>
C# 检查字符串,防SQL注入攻击
查看>>
关于对SQL注入80004005 及其它错误消息分析
查看>>
即时通软件性能测试(与宴宾的对话)
查看>>
应用软件性能测试的艺术(翻译)——序
查看>>
高级性能测试(翻译)
查看>>
Web安全测试解决方案
查看>>
今天开始上班
查看>>
开源测试研究方案泡汤了
查看>>
晒一下我培训的课程——应用系统性能测试规划、实施与分析
查看>>
自动化测试框架之控制界面的关键
查看>>
自动化测试框架指南
查看>>
利用 STAF 实现程序更新包的自动部署测试
查看>>
软件安全性测试转载自小龙虾博客
查看>>
周末参加“北京干部管理职业技术学院”关于高职课程改革的专家讨论会
查看>>
软件测试框架介绍
查看>>
软件自动化测试框架的发展
查看>>
实现haproxy+LNMT负载均衡架构
查看>>