技术开发 频道

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


【IT168技术文档】

  为做伪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[]的方法比较简单,在此不介绍了。
0
相关文章