当前位置: 首页 > 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.lryc.cn/news/583620.html

相关文章:

  • 【Linux网络编程】Socket - TCP
  • Java-----韩顺平单例设计模式学习笔记
  • swiglu 激活函数学习笔记
  • Java垃圾收集机制Test1
  • [Python] 区分方法 函数
  • 深度解析:将SymPy符号表达式转化为高效NumPy计算函数的通用解决方案
  • Git系列--3.分支管理
  • Python管理咨询数据可视化实战:收入分布与顾问利用率双轴对比图表生成脚本
  • 零基础上手 Amazon DynamoDB:NoSQL 数据库服务的核心概念与快速搭建指南
  • SQL Server 2008R2 到 2012 数据库迁移完整指南
  • Redis-哨兵选取主节点流程
  • CVE-2025-32463复现
  • AI进化论03:达特茅斯会议——AI的“开宗立派”大会
  • SpringBoot实现MCP
  • Git版本控制完全指南:从入门到实战(简单版)
  • 【LeetCode207.课程表】以及变式
  • Flutter基础(前端教程⑨-图片)
  • 「macOS 系统字体收集器 (C++17 实现)」
  • JavaScript对象的深度拷贝
  • 全球发展币GDEV:从中国出发,走向全球的数字发展合作蓝图
  • 【RK3568+PG2L50H开发板实验例程】FPGA部分 | DDR3 读写实验例程
  • 【学习笔记】OkHttp源码架构解析:从设计模式到核心实现
  • 【Java】【力扣】【字节高频】3.无重复字符的最长字串
  • 便捷的电脑自动关机辅助工具
  • Deepseek搭建智能体个人知识库
  • yolo8实现目标检测
  • 操作系统核心技术剖析:从Android驱动模型到鸿蒙微内核的国产化实践
  • Day 56
  • EPLAN 电气制图(六):结构盒与设备管理器核心概念(基础知识选看)
  • Linux操作系统之进程间通信:管道概念