【IP层的校验和与UDP的校验和】+【FPGA实现】

IP头校验和

IP头校验和是一种错误检测机制,用于在互联网协议(IP)中保证IP头的数据完整性。

当一个IP数据包从源主机发送到目的主机时,它经过许多路由器和交换机,校验和可以帮助这些中间设备检查数据包在传输过程中是否出现错误。

IP头校验和的计算方式如下:

  1. 分割:将IP头部分为16位(2字节)的段。
  2. 求和:将所有16位的段相加(以二进制求和,也就是每个段直接按位相加)。
  3. 进位处理:如果求和的结果产生了溢出,则将溢出的部分(即进位)加到求和的结果的最低位上。这可能需要重复进行,直到不再有溢出发生。
  4. 取反:将求和结果取反(按位取反,1变0,0变1)得到校验和。

这个校验和随后被填充在IP头中专门为校验和预留的字段内。在接收端,同样的计算会被执行在收到的IP头上,包括校验和字段本身。如果数据包在传输过程中没有错误,所有段的总和加上接收到的校验和的结果应该是一个全1的二进制数(因为原始计算中结果取反了)。如果计算结果不是全1,那么就说明数据在传输过程中可能出现了错误。

重要的是,IP头校验和只检查头部的完整性,并不保护整个IP数据包的内容。传输层(如TCP或UDP)有自己的校验和,负责整个数据段(包括数据)的完整性检查。

在实际的网络设备中,这个计算通常是由硬件来执行,以提高数据包处理的效率。当数据包通过每个路由器传输时,因为TTL字段会改变,所以需要重新计算校验和。

module emcode_checksum_ip #(parameter   Length_HeartBeat_all = 8'd114
)(input   wire            sys_clk            ,input   wire            sys_rst_n          ,input   wire            i_vaild            ,input   wire  [7:0]     i_data             ,output  wire            o_vaild            ,output  wire  [7:0]     o_data                   
);reg   [15:0]    r_i_vaild          ;reg   [07:0]    r1_i_data  [15:0]  ;reg   [07:0]    checksum_cnt       ;reg   [01:0]    concat_cnt         ;wire  [15:0]    concat_data        ;reg   [31:0]    r1_sum             ;wire  [31:0]    r1_checksum_value  ;wire  [15:0]    r2_checksum_value  ;reg   [15:0]    r3_checksum_value  ;reg   [07:0]    vaild_cnt          ;reg   [07:0]    r_o_data           ;always @(posedge sys_clk) beginr_i_vaild <= {r_i_vaild[14:0],i_vaild};endreg [7:0] reg_i1;reg [7:0] reg_i2;always @(posedge sys_clk) beginif(sys_rst_n == 1'b0) beginfor (reg_i1 = 0; reg_i1 < 'd15;  reg_i1 = reg_i1 + 1) beginr1_i_data[reg_i1] <= 'd0;endend else beginfor (reg_i2 = 0; reg_i2 < 'd15;  reg_i2 = reg_i2 + 1) beginr1_i_data[reg_i2+1] <= r1_i_data[reg_i2];endr1_i_data[0] <= i_data;endendalways @(posedge sys_clk) beginif(sys_rst_n == 1'b0) beginchecksum_cnt <= 8'h0;end else if(i_vaild == 1'b0 && r_i_vaild[0] == 1'b1) beginchecksum_cnt <= 8'h0;end else if(i_vaild == 1'b1)beginchecksum_cnt <= checksum_cnt + 1'b1;endendalways @(posedge sys_clk) beginif(sys_rst_n == 1'b0) beginvaild_cnt <= 8'h0;end else if(r_i_vaild[10] == 1'b0 && r_i_vaild[11] == 1'b1) beginvaild_cnt <= 8'h0;end else if(r_i_vaild[10] == 1'b1)beginvaild_cnt <= vaild_cnt + 1'b1;endendalways @(posedge sys_clk) beginif(sys_rst_n == 1'b0) beginconcat_cnt <= 2'd0;end else if(i_vaild == 1'b0 && r_i_vaild[0] == 1'b1) beginconcat_cnt <= 2'd0;end else if(i_vaild == 1'b1 && checksum_cnt >= 'd22 && checksum_cnt <= 41) beginif(concat_cnt == 1'b1) beginconcat_cnt <= 2'd0;end else beginconcat_cnt <= concat_cnt + 1'b1;endend else beginconcat_cnt <= concat_cnt;endendassign  concat_data = {r1_i_data[0],i_data};always @(posedge sys_clk) beginif(sys_rst_n == 1'b0) beginr1_sum <= 32'd0;end else if(i_vaild == 1'b0 && r_i_vaild[0] == 1'b1) beginr1_sum <= 32'd0;end else if(i_vaild == 1'b1 && checksum_cnt >= 'd22 && checksum_cnt <= 'd41 && concat_cnt == 1'b1) beginr1_sum <= r1_sum + concat_data;end else beginr1_sum <= r1_sum;endend    assign  r1_checksum_value =  r1_sum[15:0] + r1_sum[31:16];assign  r2_checksum_value = ~(r1_checksum_value[15:0]);always @(posedge sys_clk) beginif(sys_rst_n == 1'b0) beginr3_checksum_value <= 'd0;end else if(r_i_vaild[10] == 1'b0 && r_i_vaild[11] == 1'b1) beginr3_checksum_value <= 'd0;end else if(i_vaild == 1'b1 && checksum_cnt == 'd42) beginr3_checksum_value <= r2_checksum_value;endendassign  o_vaild = r_i_vaild[11];assign  o_data  = r_o_data     ;always @(posedge sys_clk) beginif(sys_rst_n == 1'b0) beginr_o_data <= 8'd0;end else if(r_i_vaild[10] == 1'b1 && vaild_cnt == 'd32) beginr_o_data <= r3_checksum_value[15:08];end else if(r_i_vaild[10] == 1'b1 && vaild_cnt == 'd33) beginr_o_data <= r3_checksum_value[07:00];end else beginr_o_data <= r1_i_data[10];endend
endmodule

UDP校验和

UDP校验和是一种错误检测机制,与IP校验和类似,但它覆盖了更多的数据:UDP校验和不仅检查UDP头部,还检查数据部分。这为UDP数据包提供了一个简单的形式的数据完整性验证。

计算UDP校验和的步骤如下:

  1. 伪头部:首先,创建一个所谓的“伪头部”,它包括源IP地址、目的IP地址、一个8位全零字段、协议字段(对于UDP,这个值是17,8‘h11)和UDP长度字段。这个伪头部不是UDP数据包的一部分,而是仅用于校验和计算过程。

  2. 合并:将伪头部、UDP头部和数据部分合并起来。如果数据的总字节长度不是偶数,会在最后添加一个零字节来填充。

  3. 分割:将合并后的数据分割成16位的段。

  4. 求和:以二进制求和这些16位的段,包括溢出。

  5. 进位处理:与IP校验和相同,如果求和的结果产生溢出,将溢出的部分加回到求和结果的最低位。

  6. 取反:将最终的求和结果取反。

得到的校验和随后放入UDP头部中的校验和字段。在接收端,同样的计算会被执行在整个数据包上(包括伪头部)。如果数据包传输正确,所有的16位段相加(包括校验和字段)应该结果为全1的二进制数(0xFFFF)。如果不是,那么就说明数据包在传输过程中出现了错误。

值得注意的是,UDP校验和是可选的,在IPv4中可以设置为零表示不计算校验和,但在IPv6中,UDP校验和是必需的。这是因为IPv6不包括一个独立的校验和,因此依赖于UDP校验和提供错误检测。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/801503.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

为说阿拉伯语的国家进行游戏本地化

阿拉伯语是由超过4亿人使用的语言&#xff0c;并且是二十多个国家的官方语言。进入这些国家的市场并非易事——虽然他们共享一种通用语言&#xff0c;但每个国家都有自己独特的文化&#xff0c;有自己的禁忌和对审查的处理方式。这就是为什么视频游戏公司长期以来都远离阿拉伯语…

Qt QML的插件(Qt Quick 2 Extension Plugin)方法

Qt Quick的插件方法 序言环境前置注意概念——Qt Quick插件的相关知识插件里的qml文件模块名的相关知识模块名本身注意事项模块名版本注意事项 以示例来说明创建插件qmltypes的生成qmltypes的可能性失效 插件的编码注意1、插件模块版本控制2、pro里的注意 调用插件插件信息输入…

华为手机 鸿蒙系统 或者安卓系统的百度网盘下载的文件保存在手机什么位置如何查看

华为手机 鸿蒙系统 或者安卓系统的百度网盘下载的文件保存在手机什么位置如何查看 连接电脑后一般在这里位置 计算机\Mate 20 Pro (UD)\内部存储\Download\BaiduNetdisk 也就是用usb&#xff08;数据线&#xff0c;不是充电线&#xff0c;要四心的 )连接手机后&#xff0c;打…

计算机网络——40各个层次的安全性

各个层次的安全性 安全电子邮件 Alice需要发送机密的报文m给Bob Alice 产生随机的对称秘钥&#xff0c; K s K_s Ks​使用 K s K_s Ks​对报文进行加密&#xff08;为了效率&#xff09;对 K s K_s Ks​使用Bob的公钥进行加密发送 K s ( m ) K_s(m) Ks​(m)和 K B ( K S ) K…

设计模式:生活中的责任链模式

责任链模式可以用一个日常生活中的接力赛来类比。在接力赛中&#xff0c;每个跑步者负责赛道的一段距离&#xff0c;然后将接力棒传递给下一个跑步者&#xff0c;直到最后一个跑步者完成比赛。每个跑步者都有机会跑自己的那一段&#xff0c;但如果他跑不了&#xff0c;他需要将…

uniapp如何配置后使用uni.chooseLocation等地图位置api

在uniapp中想要使用uni.getLocation、uni.chooseLocation ……api的时候我们需要在小程序就开启配置&#xff0c;不然无法使用。 第一步&#xff1a;首先找到manifest.json 第二步&#xff1a;点击源码视图 第三步&#xff1a;在 mp-weixin 加入下面代码 "permission&…

Paper Digest | GPT-RE:基于大语言模型针对关系抽取的上下文学习

持续分享 SPG 及 SPG LLM 双驱架构应用相关进展 1、动机 在很多自然语言处理任务中&#xff0c;上下文学习的性能已经媲美甚至超过了全资源微调的方法。但是&#xff0c;其在关系抽取任务上的性能却不尽如人意。以 GPT-3 为例&#xff0c;一些基于 GPT-3 的上下文学习抽取方…

DXP学习002-PCB编辑器的环境参数及电路板参数相关设置

目录 一&#xff0c;dxp的pcb编辑器环境 1&#xff0c;创建新的PCB设计文档 2&#xff0c;PCB编辑器界面 1&#xff09;布线工具栏 2&#xff09;公用工具栏 3&#xff09;层标签栏 ​编辑 3&#xff0c;PCB设计面板 1&#xff09;打开pcb设计面板 4&#xff0c;PCB观…

【HTML】简单制作一个分形动画

目录 前言 开始 HTML部分 效果图 ​编辑​编辑​编辑​编辑总结 前言 无需多言&#xff0c;本文将详细介绍一段代码&#xff0c;具体内容如下&#xff1a; 开始 首先新建文件夹&#xff0c;创建一个文本文档&#xff0c;其中HTML的文件名改为[index.html]&a…

JavaEE初阶之单例模式详解

目录 题外话 正题 单例模式 概念 优点 缺点 饿汉式单例模式 代码及详解 懒汉式单例模式 代码及详解 小结 题外话 昨天爬山去了,回来吃了个烧烤有点累,昨天旷了一天,每周稳定发个五篇文章是没什么太大问题的 正题 单例模式 概念 是一种常见的软件设计模式,确保一个类…

nginx 配置访问地址和解决跨域问题(反向代理)

1、配置访问地址&#xff08;通过ip访问&#xff09; //配置ip访问地址 location ^~/auditApp{alias /usr/local/front-apps/cbd/auditApp;index index.html;if (!-e $request_filename) {rewrite ^/(.*) /auditApp/index.html last;break;}} 2、解决跨域问题&…

电商技术揭秘十四:大数据平台的选择与构建

相关系列文章 电商技术揭秘一&#xff1a;电商架构设计与核心技术 电商技术揭秘二&#xff1a;电商平台推荐系统的实现与优化 电商技术揭秘三&#xff1a;电商平台的支付与结算系统 电商技术揭秘四&#xff1a;电商平台的物流管理系统 电商技术揭秘五&#xff1a;电商平台…

2024年MathorCup数学建模挑战赛A题B题C题D题思路模型代码

2024年MathorCup数学建模挑战赛 2024年MathorCup数学建模挑战赛A题B题C题D题思路模型代码开赛后第一时间更新&#xff1a;更新见文末 01 组织单位 主办单位&#xff1a;中国优选法统筹法与经济数学研究会 报名网址&#xff1a; https://www.saikr.com/vse/mathorcup/202…

如何使用Java和RabbitMQ实现延迟队列(方式二)?

前言 昨天写了一篇关于Java和RabbitMQ使用插件实现延迟队列功能的文章&#xff0c;今天来讲下另外一种方式&#xff0c;不需要RabbitMQ的插件。 前期准备&#xff0c;需要安装好docker、docker-compose的运行环境。 需要安装RabbitMQ的可以看下面这篇文章。 如何使用PHP和R…

AWS入门实践-在EC2上部署Wordpress网站

在AWS EC2上部署WordPress涉及到几个步骤&#xff0c;包括启动EC2实例、配置数据库、安装WordPress等。以下是详细的步骤和相应的命令脚本 第一步: 启动 EC2 实例 登录 AWS 控制台,进入 EC2 服务启动一个新的 EC2 实例,选择 Amazon Linux 2 AMI选择合适的实例类型(例如 t2.mi…

Java-接口-定义接口Filter及其实现类WordFilter

所谓&#xff1a;“纸上得来终觉浅&#xff0c;绝知此事要躬行。” 关于接口的知识&#xff0c;可以几分钟过一遍&#xff1a;Java-接口—知识&#xff08;基础&#xff09;-CSDN博客 现在就是练习time&#xff0c;先来看题&#xff1a; 定义一个接口 Filter&#xff0c;表示…

linux之shell命令

shell基础命令 浏览Linux 文件系统 Linux 系统目录结构 /bin&#xff1a; bin 是 Binaries (二进制文件) 的缩写, 这个目录存放着最经常使用的命令。 /boot&#xff1a; 这里存放的是启动 Linux 时使用的一些核心文件&#xff0c;包括一些连接文件以及镜像文件。 /dev &…

免费分享 .NET C#面试宝典

为.NET和C#开发者准备的全面指南&#xff0c;涵盖了从基础知识到高级应用的各个方面。以下是对手册内容的详细总结&#xff0c;分为多个关键点进行阐述。 1. 基础语法和数据类型 数据类型和变量&#xff1a;手册介绍了基本数据类型如int、double、bool等&#xff0c;以及如何…

微服务初始及Eureka注册中心

1&#xff0c;架构演变 单体架构&#xff1a;将所有业务功能集中在一个项目中开发&#xff0c;达成一个包部署 优点&#xff1a;架构简单&#xff0c;部署成本低 缺点&#xff1a;项目耦合度高 分布式架构&#xff1a;根据业务功能对系统进行拆分&#xff0c;每个业务作为独…

PCB学习记录-----入门基础知识

一、搭建环境 1.下载嘉立创EDA 软件下载 - 嘉立创EDA (lceda.cn) 选专业版 在线编辑&#xff1a;嘉立创EDA(专业版) - V2.1.45 (lceda.cn) 官方教程&#xff1a;立创EDA专业版-使用教程 (lceda.cn) 2.新建工程 文件-新建-项目&#xff0c;右键Board1可以重命名&#xff…