关闭

IP数据包的校验和算法

标签: 算法IP校验和数据
344人阅读 评论(0) 收藏 举报
分类:

一.CheckSum算法思路:

1.     把校验和字段清零;

2.     按两个字节的十六进制数进行反码求和

接收方的和发送方的过程基本一致,发送方求出校验和后存入校验和字段,而接收方求出校验和判断是否为0,如果为0则正确,抛弃该包。

 

 

二.代码实现:

相应的代码细节详见代码;

 

给出两组测试数据:

//by zc 5/29/2016
#include <iostream>
#include<bits/stdc++.h>
using namespace std;

unsigned short buffer[2][20]
{
    {
        0x4500,
        0x0031,
        0x89f5,
        0x0000,
        0x6e06,
        0x0000,		// checksum
        0xdeb7,
        0x455d,
        0xc0a8,
        0x00dc
    },
    {
        0x4500,
        0x003c,
        0x0000,
        0x0000,
        0x4001,
        0x0000,		// checksum
        0xc0a8,
        0x0125,
        0xda3c,
        0x0682
    }
};

unsigned short CheckSum(unsigned short *buffer,int _size)
{
    unsigned long cksum=0;//用unsigned long的4字节保证不会溢出

    while (_size>1)//求和
    {
        cksum+=*buffer++;
        _size-=2;
    }

    if(_size)//处理输入的数据为奇数字节的情况
        cksum+=*(unsigned char*)buffer;//由于只有一字节,转换成unsigned char处理

    while(cksum>>16)//如果存在高位溢出的情况,则将高位加到低位
        cksum=(cksum>>16)+(cksum&0xffff);

    return (unsigned short)(~cksum);//返回反码
}


int main()
{
    for(int i=0;i<2;i++)
    {
        cout<<hex<<CheckSum(buffer[i],sizeof(buffer[i]))<<endl;//传输前计算校验和
        buffer[i][5]=CheckSum(buffer[i],sizeof(buffer[i]));//填入校验和
        cout<<hex<<CheckSum(buffer[i],sizeof(buffer[i]))<<endl;//接收时计算校验和
    }
}


三.测试结果:

对以上两组测试数据,得到测试结果:

分别得到两组数据发送和接收时计算的校验和。

四.参考文章:

http://www.cnblogs.com/fhefh/archive/2011/10/18/2216885.html

http://blog.csdn.net/chenlong12580/article/details/7354037

http://blog.csdn.net/immember/article/details/41244507

http://blog.chinaunix.net/uid-26527046-id-3695653.html


1
0
查看评论

IP数据包的校验和算法

作者:david zhou邮件:leaf_zhou_8@hotmail.com时间:2006/01/19    IP数据包的头信息格式:    +-------------------------------------------------+  ...
  • max2008
  • max2008
  • 2007-08-01 10:58
  • 3686

IP包的校验和

IP头结构 IPv4首部一般是20字节长。在以太网帧中,IPv4包首部紧跟着以太网帧首部,同时以太网帧首部中的协议类型值设置为080016。 IPv4提供不同,大部分是很少用的选项,使得IPv4包首部最长可扩展到60字节(总是4个字节4个字节的扩展) 0481216192431版本首部长度...
  • woods2001
  • woods2001
  • 2009-11-14 10:35
  • 5452

JAVA校验和算法的实现

检验和(Check Sum),在数据处理和数据通信领域中,用于校验目的地一组数据项的和。它通常是以十六进制为数制表示的形式。如果校验和的数值超过十六进制的0xFF,就要求其补码作为校验和,通常用来在通信中,尤其是远距离通信中保证数据的完整性和准确性。例如如下数组: public static fin...
  • luyi325xyz
  • luyi325xyz
  • 2014-12-26 17:36
  • 5903

IP和TCP头校验和计算算法详解

当发送IP包时,需要计算IP报头的校验和: 1、  把校验和字段置为0; 2、  对IP头部中的每16bit进行二进制求和; 3、  如果和的高16bit不为0,则将和的高16bit和低16bit反复相加,直到和的高16bit为0,从而获得一个16bi...
  • jiangqin115
  • jiangqin115
  • 2014-09-16 10:15
  • 3121

IP首部校验和算法

一、校验和概念 报头校验和(Header Checksum)是针对IP报头的纠错字段。校验和不计算被封装的数据,UDP、TCP和ICMP都有各自的校验和。报头校验和字段包含一个16位二进制补码和,这是由数据包发送者计算得到的。接受者将连同原始校验和重新进行16位二进制补码和的计算。如果数据包传输...
  • CeeLo_Atom
  • CeeLo_Atom
  • 2015-07-13 10:03
  • 2327

网络技术之数据包校验码的计算方法

详细讲解如何计算ICMP数据包中的校验码,此方法也适用于其他数据包中!
  • i_dovelemon
  • i_dovelemon
  • 2016-04-05 22:34
  • 1968

ip首部校验和的计算方法(c语言实现)

IP首部校验和的计算方法(C语言实现)关联博客:关于ip报文校验和一些思考http://blog.csdn.net/qq_15437667/article/details/50701051校验和计算方法 把校验和字段清零。 然后对每16位(2字节)进行二进制反码求和,反码求和的意思是先对每16位求和...
  • qq_15437667
  • qq_15437667
  • 2016-05-13 00:10
  • 1614

TCP/IP校验和计算算法

ICMP,IP,UDP,TCP报头部分都有checksum(检验和)字段。ICMP和IP报头校验和的计算都很简单,过程如下: 1.把校验和字段置为0; 2.对IP头部中的每16bit进行二进制求和; 3.如果和的高16bit不为0,则将和的高16bit和低16bit反复相加,直到和的高16bi...
  • woswod
  • woswod
  • 2017-03-18 14:02
  • 697

ip头校验和

在巨著《TCP/IP详解1》中有这样一句话:“ICMP,IGMP,UDP and TCP all use the same checksum algorithm”。的确,检验和算法在TCP/IP协议族中大同小异。其过程大致都是:接收方通过判断检验和是否一致,进一步判断该数据包头部传输过程中是否丢失或...
  • MAOTIANWANG
  • MAOTIANWANG
  • 2013-06-28 16:26
  • 3617

IP数据包的校验和算法(载)

IP数据包的头信息格式:+-------------------------------------------------+| 版本 (4位) |+-------------------------------------------------+| 首部长度(4位) |+------------...
  • inject2006
  • inject2006
  • 2008-10-05 18:25
  • 756
    个人资料
    • 访问:128677次
    • 积分:4534
    • 等级:
    • 排名:第7801名
    • 原创:323篇
    • 转载:28篇
    • 译文:0篇
    • 评论:36条
    最新评论