IP数据包的校验和算法C#版(原)

本文介绍了一种使用C#实现的IP包校验和算法,该算法遵循IP协议规定的校验和计算方法,通过对数据每16位进行异或运算并取反得到校验和,用于确保IP数据包的完整性和准确性。
为做伪IP,特地做了一个IP包,用C#改写IP头的校验和算法。
资料一:
IP头格式:
 版本号 (4位)
 IP头长度 (4位)
 服务类型 (8位)
 数据包长度 (16位)
 标识段 (16位)
 标志段 (16位)
 生存时间 (8位)
 传输协议 (8位)
 头校验和 (16位)
 发送地址 (16位)
 目标地址 (16位)
 选项
 填充

资料二:
IP 协议采用统一的校验算法,其计算比较简单:设校验和初值为0,然后对数据每16位求异或,结果取反,便得校验和。校验时将数据(含校验和)按同样的算法求和,结果为0则数据正确,不为0表示通讯出错,需要丢弃该数据包。

算法源代码:

   public static UInt16 checksum(UInt16[] buffer,int size)
  {
   Int32 cksum=0;
   int counter;
   counter=0;
   while(size>0)
   {
        UInt16 val=buffer[counter];
        cksum+=Convert.ToInt32(buffer[counter]);
        counter+=1;
        size=-1;
   }
   cksum=(cksum>>16)+(cksum&0xffff);
   cksum+=(cksum>>16);
   return (UInt16)(~cksum);
  }

注意:buffer数组为整个ip包数组,需要转换成UInt16[];size为buffer数组的长度。
关于byte[]转换成UInt16[]的方法比较简单,在此不介绍了。

转载于:https://www.cnblogs.com/tuyile006/archive/2006/12/06/583949.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值