一:原理

当发送IP包时,需要计算IP报头的校验和:

1、把校验和字段置为0;

2、对IP头部中的每16bit进行二进制求和;

3、如果和的高16bit不为0,则将和的高16bit和低16bit反复相加,直到和的高16bit为0,从而获得一个16bit的值;

4、 将该16bit的值取反,存入校验和字段。

当接收IP包时,需要对报头进行确认,检查IP头是否有误,算法同上2、3步,然后判断取反的结果是否为0,是则正确,否则有错。

二:实现

SHORT checksum(USHORT* buffer, int size)

{

unsigned long cksum = 0;

while(size>1)

{

cksum += *buffer++;

size -= sizeof(USHORT);

}

if(size)

{

cksum += *(UCHAR*)buffer;

}

cksum = (cksum>>16) + (cksum&0xffff);  //将高16bit与低16bit相加

cksum += (cksum>>16);             //将进位到高位的16bit与低16bit 再相加

return (USHORT)(~cksum);

}

三、实例

IP头:

45 00    00 31

89 F5    00 00

6E 06    00 00(校验字段)

DE B7   45 5D       ->    222.183.69.93

C0 A8   00 DC     ->    192.168.0.220

计算:

4500 + 0031 +89F5 + 0000 + 6e06+ 0000 + DEB7 + 455D + C0A8 + 00DC =3 22C4

0003 + 22C4 = 22C7

~22C7 = DD38      ->即为应填充的校验和

当接受到IP数据包时,要检查IP头是否正确,则对IP头进行检验,方法同上:

计算:

4500 + 0031 +89F5 + 0000 + 6E06+ DD38 + DEB7 + 455D + C0A8 + 00DC =3 FFFC

0003 + FFFC = FFFF

~FFFF = 00000     ->正确

TCP首部检验和与IP首部校验和的计算方法相同。

原文链接:http://blog.csdn.net/mi_mang/article/details/4467250

IP头部校验(转)的更多相关文章

  1. tcp/ip详解-ip头部选项字段

    IP头部的选项字段 作用:用于网络调试和测试 IP首部的可变部分就是一个可选字段.选项字段用来支持排错.测量以及安全等措施,内容很丰富.此字段的长度可变,从1个字节到40个字节不等,取决于所选择的项目 ...

  2. QLineEdit IP地址校验

    QLineEdit IP地址校验 原文出处:[上善若静水] 1.通过自定义类方式实现IP4地址范围限制输入: //--------------------TLineEditIP.h---------- ...

  3. TCP/IP头部详解

    在网上找了很多有关tcp/ip头部解析的资料,都是类似于下面的结构 抽象出图文是这种结构,但是在底层中数据到底是怎么传输的呢?没有答案,在深入学习之后,总结出数据传输的方式 IP数据包头部格式: 上面 ...

  4. tcp/ip通信中ip头部结构iph->check校验计算

    通过raw socket修改通信数据后,可通过该函数重新校验计算iph->check值 在http://www.cnblogs.com/dpf-10/p/7899237.html查看实际调用 s ...

  5. 005.TCP--拼接TCP头部IP头部,实现TCP三次握手的第一步(Linux,原始套接字)

    一.目的: 自己拼接IP头,TCP头,计算效验和,将生成的报文用原始套接字发送出去. 若使用tcpdump能监听有对方服务器的包回应,则证明TCP报文是正确的! 二.数据结构: TCP首部结构图: s ...

  6. 关于绕过域名(ip)校验的一些小知识

    这篇文章最开始只是想写一个关于绕过referer的方法,写着写着发现和ssrf以及url跳转的一些手法类似,于是把这两种也加上了 对referer做校验一般是对csrf进行防范的手段之一,但是很多时候 ...

  7. IP地址校验

    function validIp(fieldname,fielddesc){ var value = $.trim($("#key_"+fieldname).val()); var ...

  8. TCP/IP协议族——IP工作原理及实例具体解释(上)

     IP协议具体解释 本文主要介绍了IP服务特点,头部结构,IP分片知识,并用tcpdump抓取数据包.来观察IP数据报传送过程中IP的格式,以及分片的过程. IP头部信息:IP头部信息出如今每一个 ...

  9. 使用netfilter_queue改包笔记

    系统:centos 7 准备:安装libnetfilter_queue模块,可以yum安装,也可以网上下载rpm包安装 简介:使用iptables在NAT表上创建DNAT与SNAT规则,对数据包进行转 ...

随机推荐

  1. tomcat 7 下添加 shared/lib 文件夹

    你打开tomcat7\conf\catalina.properties文件再打开tomcat5的,看完后, 你就知道了 tomcat 5.5.35 # # List of comma-separate ...

  2. CentOS挂载新硬盘

    1.查看当前硬盘使用状况: df -h root@VM_160_34_centos:~> df -h Filesystem Size Used Avail Use% Mounted on /de ...

  3. html  特殊字符(转)

    有些字符在HTML里有特别的含义,比如小于号<就表示HTML Tag的开始,这个小于号是不显示在我们最终看到的网页里的.那如果我们希望在网页中显示一个小于号,该怎么办呢? 这就要说到HTML字符 ...

  4. sjtu1285 时晴时雨

    Description Taring 喜欢晴天,也喜欢雨天. Taring说:我想体验连续的\(K\)天的晴朗,去远足,去放歌:我还想再这\(K\)个晴天之后,再去体验连续的K天的云雨,去感受落雨时的 ...

  5. Codeforces Round #209 (Div. 2)

    A: 要么是两次要么4次,判断是否在边界: #include<cstdio> using namespace std; int main() { int n,m,x; ; scanf(&q ...

  6. poj 1811 Prim test

    基本上一个裸的Miller_Rabin大素数判定和一个裸的Pollard_rho素数分解算法,当模板用吧! #include<cstdio> #include<algorithm&g ...

  7. 利用ZABBIX的RPC-JSON作API扩展应用示例

    计划将ZABBIX的一些状态可以在另一个应用的显示GRAPH及链接. 故而在网上找了几个文档,作了一个测试. https://www.zabbix.com/documentation/2.4/manu ...

  8. 查看java的.class文件的方法

    在不通过eclipse等IDE安装反编译插件的情况下查看java的.class文件的方法:可以通过下载jd-gui class文件查看工具进行查看.如附件的“jd-gui.exe”程序. 1. 从网上 ...

  9. UVA 10765 Doves and bombs

    给定一个无向的连通图,要求每个点去掉后连通分量的数目,然后输出连通分量最多的m个点. 分析: 先求出双连通分量,然后统计所有双连通分量中割顶出现的次数,最后求出的就是割顶去掉后剩下的双连通的数目,对于 ...

  10. SQL按日期Datatime来比较大小

    数据库操作中,通常需要选择某日期以后的记录,比如选择10年1月到11年2月之间的记录,此时用SQL语句编写时,不能直接用">.<.="来选择,因为datetime型数据 ...