1. 校验和

ICMP,IP,UDP,TCP报头部分都有checksum(检验和)字段。IP 首部里的校验和只校验首部;ICMP、IGMP、TCP和UDP首部中的校验和校验首部和数据。

UDP和TCP的校验和不仅要对整个IP协议负载(包括UDP/TCP协议头和UDP/TCP协议负载)进行计算,还要先对一个伪协议头进行计算:先要填充伪首部各个字段,然后再将UDP/TCP报头及之后的数据附加到伪首部的后面,再对伪首部使用校验和计算,所得到的值才是UDP/TCP报头部分的校验和。

伪首部结构如下:

0        7 8      15 16     23 24     31
+--------+--------+--------+--------+
|           source address               |
+--------+--------+--------+--------+
|        destination address            |
+--------+--------+--------+--------+
| zero    | proto  |   udp/tcp len    |
+--------+--------+--------+--------+

2. 校验和的计算方法

以IP首部中的校验和为例。

1)首先把校验和字段清零;

2)然后对每 16 位(2 字节)进行二进制反码求和;

反码求和时,最高位的进位要进到最低位,也就是循环进位。先取反后相加与先相加后取反,得到的结果是一样的!

所以校验的代码如下:

 1 unsigned short checksum(unsigned short* head, int bytes) {
 2     unsigned long sum = 0;
 3     while (bytes >= 0) {
 4         sum += *head++;
 5         bytes -= sizeof(unsigned short);
 6     }
 7     if (bytes) {
 8         sum += *head;
 9     }
10     while (sum >> 16) { // 高16位不为0,最多循环两次
11         sum = (sum >> 16) + (sum & 0xffff); //高16位是进位,进位是加到最低位的。
12     }
13     return ~((unsigned short)sum);
14 }

【一个负二进制数的反码形式为在原数基础上按位取反,即对应正数的补。对两个反码表示形式的数字做加法,首先需要进行常规的二进制加法,但还需要在和的基础上加上进位。Internet协议IPv4,ICMP,UDP以及TCP都使用同样的16位反码检验和算法。虽然大多数计算机缺少“循环进位”硬件,但是这种额外的复杂性是可以接受的,因为“对于所有位(bit)位置上的错误都是同样敏感的”。 在UDP中,全0表示省略了可选的检验和特性。另外一种表示:FFFF,指示了0的检验和。(在IPv4中,TCP和ICMP都强制性地规定了检验和,而在IPv6中可以省略)。 注意负数的反码只需按位求数值的补就可以得到,符号不需要变动。】

3. 校验原理
同样以IP首部中的校验和为例。接收方进行校验时,也是对每16位(2字节)进行二进制反码求和。接收方计算校验和时的首部与发送方计算校验和时的首部相比,多了一个发送方计算出来的校验和的反码。因此,如果首部在传输过程中没有发生差错,那么接收方计算的结果应该为全0。

实例:

IP头:

1 45 00 00 31
2 89 F5 00 00
3 6E 06 00 00(校验字段)
4 DE B7 45 5D -> 222.183.69.93
5 C0 A8 00 DC -> 192.168.0.220

计算:

1 4500 + 0031 +89F5 + 0000 + 6e06+ 0000 + DEB7 + 455D + C0A8 + 00DC =3 22C4
2 0003 + 22C4 = 22C7
3 ~22C7 = DD38 ->即为应填充的校验和

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

计算:

1 4500 + 0031 +89F5 + 0000 + 6E06+ DD38 + DEB7 + 455D + C0A8 + 00DC =3 FFFC
2 0003 + FFFC = FFFF
3 ~FFFF = 00000 ->正确

说明:
由于IP报文在网络中传输时TTL是在变化的(每经过一个路由器减一),因此在路由器中要对 IP 首部重新校验。这也解释了为什么IP首部里的校验和只校验首部而不校验数据,因为如果数据也校验,那将给路由器增加巨大的负担。因此对数据校验的任务交给上层协议(TCP或UDP)。

转载于:https://www.cnblogs.com/linyx/p/3609043.html

Network | UDP checksum相关推荐

  1. UDP校验和(checksum)原理

    目录 1.校验和原理 1.1 校验和计算 1.2 校验和验证 2.UDP校验和原理 2.1 UDP校验数据范围 2.2 发送方UDP校验和计算 2.3 接收方UDP校验和验证 3.UDP伪首部 4.U ...

  2. linux 系统 UDP 丢包问题分析思路

    转自:http://cizixs.com/2018/01/13/linux-udp-packet-drop-debug?hmsr=toutiao.io&utm_medium=toutiao.i ...

  3. Tcp/Udp端口对照表

    Tcp/Udp端口對照 reserved 0/tcp Reserved [JBP] reserved 0/udp Reserved [JBP] tcpmux 1/tcp TCP Port Servic ...

  4. 常用的协议端口号(TCP and UDP)

    这是在网上搜集到的一些资料,共享出来! 端口号 协议 解释 0      TCP  Reserved   0      UDP  Reserved   1      TCP tcpmux TCP Po ...

  5. 《lwip学习9》-- UDP协议

    UDP报文 UDP 报文也被称为用户数据报,与 ICMP协议一样,由报文首部与数据区域组成.在UDP 协议中, 它只是简单将应用层的数据进行封装(添加一个 UDP 报文首部), 然后传递到 IP 层, ...

  6. 无盘服务器网卡参数怎么设置,无盘 网卡属性设置(详细)(Diskless network card property settings (details)).doc...

    无盘 网卡属性设置(详细)(Diskless network card property settings (details)) 无盘 网卡属性设置(详细)(Diskless network card ...

  7. CAN201-Computer Network(2)

    文章目录 5. Control Plane 5.1 Routing protocols: Dijkstra 5.2 Routing protocols: Distance vector algorit ...

  8. CAN201-Computer Network(1)

    文章目录 1. Introduction 1.1 Different ways to access internet 1.2 How to link with others 1.3 Network P ...

  9. Linux内核网络数据包发送(二)——UDP协议层分析

    Linux内核网络数据包发送(二)--UDP协议层分析 1. 前言 2. `udp_sendmsg` 2.1 UDP corking 2.2 获取目的 IP 地址和端口 2.3 Socket 发送:b ...

最新文章

  1. Java B2B2C o2o多用户商城 springcloud架-企业云架构common-service代码结构分析
  2. python编码规范手册-PEP8 Python 编码规范整理
  3. 初探 React Router 4.0
  4. 安全使用计算机事例,计算机安全案例分析.ppt
  5. vue中align_Vue的简单Treeview组件,没有额外的依赖——VueTeatree
  6. 开花(在b数组中二分查找a数组元素)
  7. 35岁是青春的后期你最好把下面十件事做好
  8. mysql 随机函数 效率_MySQL 随机函数获取数据速度和效率分析
  9. 你的第一个自动化测试:Selenium 自动化测试
  10. 六种实现元素水平居中
  11. 你不知道流量宝的神操作就能免费增加20万网站PV浏览量
  12. sketchup草图家具拆单软件 有屋 衣柜橱柜 全屋定制 设计渲染生产一体化SU
  13. Oracle Database Link基础
  14. Pandas:分组级的运算和转换--transform和apply
  15. python群发邮件 不进垃圾箱_邮件群发如何不进垃圾箱
  16. WIN10 注册表添加启动项
  17. 项目经理会议记录内容
  18. magento 赠品_免费赠品:10个高质量的夏季刻字
  19. day08学习 Python文件函数、CSV文件读写
  20. 小白的渗透之旅1-DVWA环境搭建

热门文章

  1. 娃哈哈信息部李钒助阵FBS2017 共探食品饮料信息化之路
  2. Python 输入和输出
  3. mac 使用svn记录
  4. Spring Bean 中的线程安全
  5. wordpress 重新生成附件文件名
  6. PostgreSQL的prepare 和 execute 动作背后
  7. 基于组件的.NET软件开发(3)
  8. The Road to learn React书籍学习笔记(第三章)
  9. 六周第四次课(5月2日)
  10. Elasticsearch设置最大返回条数