首页 > 编程语言 >反码求和 校验和算法

反码求和 校验和算法

时间:2024-07-05 23:02:41浏览次数:16  
标签:UDP 反码 字节 求和 校验 二进制 溢出

参考链接

问题引出

  • 最近在学习ICMP时,看到里面有关于校验和的算法一知半解。校验和是16bit字的二进制反码和,也觉得很奇怪,为什么会用反码和,而不是直接求和呢?或者是补码和呢?
  • 如果计算机中存储数据使用原码,则会导致两个问题,1.有负数参与的运算结果不正确。2.0的表示方法有两种。所以在计算机里面数据是以补码的形式存在,下面总结一下。
  • IP、ICMP、UDP和TCP报文头都有检验和字段,大小都是16bit,算法基本上也是一样的。

发送数据时

计算数据包的检验和步骤:

  1. 把校验和字段设置为0;
  2. 把需要校验的数据看成以16位为单位的数字组成,依次进行二进制反码求和;
  3. 把得到的结果存入校验和字段中

在接收数据时

计算数据包的检验和步骤:

  1. 把首部看成以16位为单位的数字组成,依次进行二进制反码求和,包括校验和字段;

  2. 检查计算出的校验和的结果是否为0;

  3. 如果等于0,说明被整除,校验和正确。否则,校验和就是错误的,协议栈要抛弃这个数据包。

检验的范围不一样

  1. 虽然说上面四种报文的校验和算法一样,但是在作用范围存在不同:IP校验和只校验20字节的IP报头;而ICMP校验和覆盖整个报文(ICMP报头+ICMP数据);UDP和TCP校验和不仅覆盖整个报文,而且还有12个字节的IP伪首部,包括源IP地址(4字节)、目的IP地址(4字节)、协议(2字节)、TCP/UDP包长(2字节)。另外UDP、TCP数据报的长度可以为奇数字节,所以在计算校验和时需要在最后增加填充字节0(填充字节只是为了计算校验和,可以不被传送)。
  2. 在UDP传输协议中,校验和是可选的,当校验和字段为0时,表明该UDP报文未使用校验和,接收方就不需要校验和检查了!那如果UDP校验和的计算结果是0时怎么办?书上有一句话:“如果校验和的计算结果为0,则存入的值为全1(65535),这在二进制反码计算中是等效的

校验和计算方法

  1. 什么是二进制反码求和

    1. 对一个无符号的数,先求其反码,然后从低位到高位,按位相加,有溢出则向高位进1(和一般的二进制法则一样),若最高位有进位,则向最低位进1.(循环进位)
    2. 首先这里的反反码好像和以前学的有符号反码不一样,这里不分正负数,直接每个为都取反。
      说明:有符号数在计算机中以二进制补码的形式存放;无符号数以二进制直接存储,不用变形
    3. 反码加法法则最高位有进位,向最低位进1。确实有些疑惑,为什么要这样呢?仔细分析一下,上面的这种操作,使得在发送加法进位溢出时,溢出值并不是10000,而是1111.也即是当相加结果满1111时溢出,这样也可以说明为什么0000和1111都表示0了。
  2. 下面是两种二进制反码求和的运算:

原码加法运算:3(0011)+5(0101)=8(1000)

              8(1000)+9(1001)=1(0001)

反码加法运算:3(1100)+5(1010)=8(0111)

              8(0111)+9(0110)=2(1101)

从上面的例子中,当加法未发生溢出时,原码与反码加法运算结果一样;当有溢出时,结果就不一样了,原码是满10000溢出,而反码是满1111溢出,所以相差正好是1.

标签:UDP,反码,字节,求和,校验,二进制,溢出
From: https://blog.csdn.net/qq_45956475/article/details/140182248

相关文章

  • 算法:递归数组求和
    递归数组求和给定一个数组,求所有元素的和算法思想:传入数组和下标,如果下标越界就返回0,否则返回当前值和下一个值的和,递归操作。Java实现:publicclassMain{ publicstaticintfunc(int[]array,intindex){ if(index>array.length-1){ return0; }el......
  • L1-009 N个数求和 python
    python实现:需要考虑很多情况:如果只输入一个数:分子/分母是否有商,是否需要约分,如:8/3,-8/3,0/3。如果输入多个数:通分后分子>0,<0还是=0,分子/分母是否有商,是否需要约分。num=int(input())s=input()ifnum==1:fenzi=int(s.split("/")[0])fenmu=int(s.split("/")[1])......
  • 数据特征采样在 MySQL 同步一致性校验中的实践
    作者:vivo互联网存储研发团队-ShangYongxing本文介绍了当前DTS应用中,MySQL数据同步使用到的数据一致性校验工具,并对它的实现思路进行分享。一、背景在MySQL的使用过程中,经常会因为如集群拆分、数据传输、数据聚合等原因产生流动和数据复制。而在通常的数据复制过程中,因......
  • csrf跨站请求,钓鱼网站实现示例,CSRF校验,CSRF相关装饰器,Auth模块,扩展Auth表
    ⅠDjango框架之csrf跨站请求【一】跨站请求伪造介绍【1】引入CSRF(Cross-SiteRequestForgery)跨站请求伪造是一种常见的网络攻击方式。攻击者通过诱导受害者访问恶意网站或点击恶意链接将恶意请求发送到目标网站上利用受害者在目标网站中已登录的身份来执行某些操作从而......
  • 鸿蒙手机号&&验证码登录, 包含倒计时&&号码格式验证码格式校验, 还有 使用 Hyperlink
    1,先看看整体效果                          2,看格式校验效果                            3,代码直接CV  importpromptActionfrom'@ohos.promptA......
  • 校验IP地址格式:IPv4、IPv6、IP/掩码和IP段
    校验IP地址格式:IPv4、IPv6、IP/掩码和IP段https://www.jianshu.com/p/95d51e51cc2eIPv4格式验证IPv4是32位地址,由四个十进制数(0-255)组成,以点分隔。以下是一个IPv4地址的示例:192.168.0.1。要验证输入是否符合IPv4格式,我们可以使用正则表达式进行匹配。下面是一个JavaScript......
  • 区间更新、求和问题
    树状数组、线段树的实现与应用、模运算的使用。一、题目  定义在数组上的操作,给定大小为N的数组以及N个数。之后给出M个操作,则要输入M行。每一行操作第一个数代表操作类型,要么是U要么是C。对于U类型的操作,紧跟3个数a、b、k,也就是把数组下标a到b的每个数替换为该数的k次方(......
  • kettle从入门到精通 第七十四课 ETL之kettle kettle调用https接口教程,忽略SSL校验
    场景:kettle调用https接口,跳过校验SSL。(有些公司内部系统之间的https的接口是没有SSL校验这一说,无需使用用证书的) 解决方案:自定义插件或者自定义jar包通过javascript调用https接口。1、httppost步骤调用https接口,无法通过ssl安全校验,如下图所示:查看了kettle源码之后该步骤......
  • 【信息学奥赛】CSP-J/S初赛05 计算机原码、补码和反码
    本专栏......
  • springboot项目登陆校验————基于Jwt令牌和Fliter / Interceptor
    springboot项目登陆校验————基于Jwt令牌和Fliter/Interceptor文章目录springboot项目登陆校验————基于Jwt令牌和Fliter/Interceptor1.概述2.Jwt令牌2.1Jwt令牌的组成2.2Jwt登录认证流程2.3代码实现3.方法1:Fliter过滤器3.1简介3.1代码实现4.方法2:Interce......