当前位置: 首页 > news >正文

以太网基础④IP 协议介绍与 IP 校验和算法实现

1. 今日摸鱼任务

IP 校验和算法实现

02_【逻辑教程】基于HDL的FPGA逻辑设计与验证教程V3.5.2.pdf

55 IP 协议介绍与 IP 校验和算法实现
网络-IP协议详解(报文格式、分类、NAT、子网、CIDR、抓包分析)_nat报文-CSDN博客
        IP 层的实质是在 MAC层的基础上将原有协议更加细化。
        最核心的意义是让IP 地址参与到网络数据传输中,让硬件和硬件的通信传输,从网卡号作为唯一的身份识别标志,变为以 IP 地址作为身份识别标志。

2. IP 协议数据字段格式

所有的 TCPUDPICMPIGMP 数据都以 IP 数据报的格式传输。
IP 仅提供尽力而为的传输服务,如果发生某种错误,IP 会丢失该数据,然后发送 ICMP 消息给信源端。另外,IP 数据报可以不按发送顺序接收。
IP 数据报的长度/类型段的数值为 0x0800,数据和填充段包括 IP 头部数据和 IP 数据两个部分。

jiangjiangjiang~

上面这个图是不是感觉看不懂?????

直接看下面的表就可以啦!!!

IP

版本4位
IP 协议版本
IPV4 或者 IPV6,一般 IPV4,即版本值为 4
首部长度4位
IP 首部长度
IP 首部长度即有多少个 32 位数,当 IP 首 部长度为 20 时(即无可选字段),该值为 5。(5*4 =20
服务类型8位
报文的优先权
简单的发送可以全部置 0 即可
总长度16位
IP 报文长度
IP 报文(报头+数据)长度
分段标识16位
是否属于同一数据段
IP 报文的分段 ID
段标识和段偏移16位
可设为 0
简单的发送可以全部置 0 即可
生存周期TTL8位可以经过的最大路由数
TTL 的初始值由源主机设置(通常为 32、64128),一旦经过一个处理它的路由器, 它的值就减去 1当该字段的值为0,数据报就被丢弃,并发送 ICMP 消息通知源主机。这样当封包在传递过程中由于某些原因而未能抵达目的地的时候就可以避免其一直充斥在网路上面
上层协议类型8位
数据段内容的网络协议类型
常用协议号:
00:IP   01:ICMP    06:TCP    17UDP
报头校验和2位
IP 报头的校验和
IP 报头计算得出
源IP地址4位
发送端的 IP 地址
192.168.0.2
目的IP地址4位
接收端的 IP 地址
192.168.0.3
可选字段--
没有的时候长度可以为 0

这样再看上面的图,就会发现,只是每行按32计数,这样可以清楚看懂首部长度~

前 20 个字节是固定的,可选字段则可有可无。

3. 校验和计算

校验和计算步骤:

        ①将校验和字段置零:

                在计算前,先将首部中的校验和字段(16 位)设为 0x0000。

        ②将首部分解为 16 位字:

                 IP 首部长度通常是 20 字节(无选项时),按 2 字节为一组分割,得到 10 个 16 位字。

                此时校验和为0,计算时累加9个2字节。

        ③计算二进制反码和:

                将所有 16 位字相加(按二进制加法,溢出时回卷,即最高位进位加到最低位)。

                最后对和取反码(按位取反),得到校验和。

        ④存储校验和:

                将计算得到的校验和存入 IP 首部的校验和字段。

使用小兵计算校验和(pdf截图):

module checksum(
    input [3:0]ver, //版本
    input [3:0]hdr_len,//首部长度
    input [7:0]tos, //服务类型
    input [15:0]total_len,  //IP报文总长
    input [15:0]id, //分段标识
    input [15:0]offset, //偏移
    input [7:0]ttl, //生存周期
    input [7:0]protocol, //上层协议类型
    input [31:0]src_ip, //源IP地址
    input [31:0]dst_ip, //目的IP地址
    
    output [15:0]checksum_result //校验和
);

    
    wire [31:0]suma,sumb;

    assign suma = {ver,hdr_len,tos} + total_len + id + offset + {ttl,protocol} 
                    + src_ip[31:16] + src_ip[15:0] + dst_ip[31:16] + dst_ip[15:0];
    
    assign sumb = (suma[31:16] + suma[15:0]);
    
    assign checksum_result = sumb[31:16]? ~(sumb[31:16] + sumb[15:0]):~sumb[15:0];

endmodule

http://www.dtcms.com/a/271074.html

相关文章:

  • 逆向 qq 音乐 sign,data, 解密 response 返回的 arraybuffer
  • 在 Coze 平台工作流开发中,使用图生视频大模型需要时间比较长比如5分钟,如何解决工作流运行超时的问题以及等在视频生成以后再向下走
  • JavaEE初阶第八期:解锁多线程,从 “单车道” 到 “高速公路” 的编程升级(六)
  • Jmeter进阶篇(35)完美解决Jmeter转换HTML报告报错“Begin size 0 is not equal to fixed size 5”
  • git中的指令解释
  • 详解CAN总线的位填充机制
  • 【学习笔记】计算机操作系统(七)—— 文件管理
  • 全志H616开发学习文档
  • prometheus+grafana接入kafka实战
  • Python管理咨询数据可视化实战:收入分布与顾问利用率双轴对比图表生成脚本
  • 基于BRPC构建高性能HTTP/2服务实战指南
  • python之requests库解析
  • 1️⃣理解大语言模型
  • 【时时三省】(C语言基础)通过指针引用数组
  • 阿里开源WebSailor:超越闭源模型的网络智能体新星
  • 疏锦行Python打卡 DAY 54 Inception网络及其思考
  • HTML + CSS + JavaScript
  • 字体 Unicode 区块字符展示 PDF 生成器
  • Ubuntu重装系统后ssh连接不上(遇到 ​​“Unit ssh.service not found“​​ 错误)
  • kubernetes存储入门
  • Spring Boot + Vue.js 全栈开发:从前后端分离到高效部署,打造你的MVP利器!
  • 【05】MFC入门到精通——MFC 为对话框中的控件添加变量 和 数据交换和检验
  • 【01】MFC入门到精通—— MFC新建基于对话框的项目 介绍(工作界面、资源视图 、类视图)
  • Flink-1.19.0源码详解6-JobGraph生成-后篇
  • AJAX总结
  • Flink1.20.1集成Paimon遇到的问题
  • Electron 应用打包全指南
  • 机器学习模型在C++平台的部署
  • 基于 Redis 实现高并发滑动窗口限流:Java实战与深度解析
  • 开始读 PostgreSQL 16 Administration Cookbook