万兆以太网MAC设计(6)IP协议报文格式详解以及IP层模块设计

文章目录

  • 前言:IPv4报文协议格式
  • 二、IP_RX模块设计
    • 2.1、模块接口
    • 2.2、模块工作过程
  • 三、IP_TX模块设计
    • 3.1、模块接口
    • 3.2、模块工作过程
  • 四、仿真
    • 4.1、发送端
    • 4.2、接受端

前言:IPv4报文协议格式

参考:https://sunyunqiang.com/blog/ipv4_protocol_rfc791/这篇文章内容很丰富,建议看看

在这里插入图片描述

Version : 长度为 4 比特, 表征 IP 协议的版本号, 对 IPv4 来说该字段的值为 4

IHL : 长度为 4 比特, IHL 是 Internet Header Length 的缩写, 以 4 字节为单位指示 IP Header 的长度, 对于 IPv4 来说, Header 的最小长度为 20 字节, 因此该字段的最小值为 5

Type of Service : 服务类型, IETF 在之后将该字段改为 Differentiated Service, 即区分服务, 长度为 8 比特, 该字段用来表达发送端对服务质量的期望程度, 例如可以通过在该字段中设置标志位表达发送方希望该 IP Datagram 低时延 (Low Delay) 的效果送达终端, 或希望以高可靠性 (High Relibility) 的效果送达终端, 但这些都需特定网络或 ISP 的支持。

Total Length: 长度为 16 比特, 顾名思义该字段以字节为单位指示整个 IP Datagram 的长度, 结合 IHL, 我们可以计算出一个 IP Datagram 的数据部分长度为 Total Length - IHL / 4, 因为该字段的长度为 16 比特, 所以可以知道一个 IP Datagram 理论上最大的长度为 2 ^ 16, 即 65535 个字节, 但实际上这么长的 IP Datagram 往往无法保证一定可以被主机或路由器正确的处理, RFC 791 规定所有主机都至少能够处理 576 字节的 IP Datagram, 因此不建议发送超过 576 字节的 IP Datagram, 除非你知晓中途的主机或路由器都可以正确地处理

Identification: 长度为 16 比特, 发送方维护一个计数器, 每产生一个 IP Datagram, 计数器的值就加一, 该字段主要用在 IP 分片场景中, 对于分片的 IP Datagram, 它们在逻辑上仍然是一个 IP Datagram, 所有分片的 IP Datagram 的 Identification 值都是相同的, 接收方最终可以根据该字段知晓哪些 IP Datagram 是属于同一个整体的

Flag: 长度为 3 比特, 其中最高位为保留位, 目前没有使用, 必须设置为 0, 中间的一位是 DF (Don’t Fragment), 当该位为 1 时代表不分片, IP Datagram 在传输过程中, 如果其长度过长, 中间设备无法处理, 但又发现该字段为 1 时, 应丢弃该 IP Datagram, 最后一位是 MF (More Fragments), 当该位为 1 时, 代表当前不是分片的最后一个 IP Datagram, 在之后还有更多的分片, 当该位为 0 时代表当前是分片的最后一个 IP Datagram,总结如下:

  • Bit 0 : 保留,必须置零。
  • Bit 1: (DF) 为0 表示可以对分组进行分片, 为1 表示不可以对分组进行分片
  • Bit 2: (MF) 为0表示该数据段是本分组中最后的一个数据分段,为1 表示后面还有数据分段

Fragment Offset: 片偏移, 长度为 13 比特, 当发生 IP Datagram 分片时, 该字段将指示当前分片在原先的整个 IP Datagram 上的偏移量, 以 8 字节为单位, 对于不分片或分片的第一个 IP Datagram, 该字段的值必须为 0

Time to Live : 简称 TTL, 长度为 8 比特, 由发送端设置初始值, 在 RFC 791 中, 该字段的语义是一个 IP Datagram 从发出以后所能存活的最长时间, 以秒为单位, IP Datagram 在每经过一个主机或路由器时, 都需要减去路由器处理该 IP Datagram 时所花费的时间, 如果花费时间少于 1s 则按 1s 算, 现在该字段已经被改为跳数, 即每经过一个主机或路由器该字段减去1, 当某个 IP Datagram 的 TTL 字段的值减到 0 时, 必须立即丢弃该分组, 设置该字段的目的是为了防止那些无法被交付到目的地的分组在网络中无限地循环, 造成不必要的资源浪费

Protocol : 长度为 8 比特, 用于指示 IP Datagram 携带的数据使用的上层协议类型, 该字段的值为协议的编号, 协议编号由 IANA 维护

Header Checksum : 长度为 16 比特, 其值为 IP Header 部分的校验和, 在一定程度上保证 IP 数据的完整性, 接收到 IP Datagram 的主机应检查该字段是否正确, 若不正确应立即丢弃该分组, 另外, 用于每经过一个主机或路由器, Header 部分都会更改 (至少需要更改 TTL), 因此该字段的值每经过一跳都需要重新计算和赋值

Source Address : 32 bits,指明了发送节点的IP地址。

Destination Address : 32 bits,指明了接收节点的IP地址。

Options :拓展字段, 该字段长度可变, 扩展字段可以包含一些可选项, 例如客户端可以利用拓展字段来记录 Datagram 的路由数据等

Padding:由于 IHL 字段以 4 字节为单位表征 IP Datagram 的 Header 部分的长度, 因此 IP Header 的长度必须是 4 字节的整数倍, 由于 Options 的长度是可变的, 它可能导致整个 IP Header 的长度不是 4 字节的整数倍, 此时需要使用 Padding 字段来填充, Padding 字段的值必须设置为全 0

二、IP_RX模块设计

2.1、模块接口

该模块主要功能为接收MAC层收到的的IP数据包,将其进行解析,发送给更上层的协议,ICMP或者是UDP层。

module IP_RX#(
    parameter       P_SRC_IP_ADDR   = {8'd192,8'd168,8'd100,8'd99},
    parameter       P_DST_IP_ADDR   = {8'd192,8'd168,8'd100,8'd100}
)(
    input           i_clk               ,
    input           i_rst               ,
    input  [31:0]   i_dynamic_src_ip    ,
    input           i_dynamic_src_valid ,
    input  [31:0]   i_dynamic_dst_ip    ,
    input           i_dynamic_dst_valid ,
    /*****MAC AXIS interface*****/
    input  [63:0]   s_axis_mac_data     ,
    input  [79:0]   s_axis_mac_user     ,//用户自定义{16'dlen,r_src_mac[47:0],16'dr_type}
    input  [7 :0]   s_axis_mac_keep     ,
    input           s_axis_mac_last     ,
    input           s_axis_mac_valid    ,
    /*****upper layer AXIS interface*****/
    output [63:0]   m_axis_upper_data   ,
    output [55:0]   m_axis_upper_user   ,//用户自定义{16'dlen,3'bflag,8'dtype,13'doffset,16'dID}
    output [7 :0]   m_axis_upper_keep   ,
    output          m_axis_upper_last   ,
    output          m_axis_upper_valid  
);

2.2、模块工作过程

  1. 接收数据并解析关键字段信息
  2. 判数据包的目的IP地址是否为本机
  3. 将数据转化为AXIS的数据流形式传递给上层(难点在于尾端keep处理,但比MAC层的简单许多)

三、IP_TX模块设计

3.1、模块接口

该模块主要功能为接收上层协议的数据内容,按照IP协议进行组包,然后发送给MAC层

module IP_TX#(
    parameter       P_SRC_IP_ADDR   = {8'd192,8'd168,8'd100,8'd99},
    parameter       P_DST_IP_ADDR   = {8'd192,8'd168,8'd100,8'd100}
)(
    input           i_clk               ,
    input           i_rst               ,
    input  [31:0]   i_dynamic_src_ip    ,
    input           i_dynamic_src_valid ,
    input  [31:0]   i_dynamic_dst_ip    ,
    input           i_dynamic_dst_valid ,
    /*****MAC AXIS interface*****/
    output [63:0]   m_axis_mac_data     ,
    output [79:0]   m_axis_mac_user     ,//用户自定义{16'dlen,r_src_mac[47:0],16'dr_type}
    output [7 :0]   m_axis_mac_keep     ,
    output          m_axis_mac_last     ,
    output          m_axis_mac_valid    ,
    /*****upper layer AXIS interface*****/
    input  [63:0]   s_axis_upper_data   ,
    input  [55:0]   s_axis_upper_user   ,//用户自定义{16'dlen,3'flag,8'dtype,13'doffset,16'dID}
    input  [7 :0]   s_axis_upper_keep   ,
    input           s_axis_upper_last   ,
    input           s_axis_upper_valid  ,
    output          s_axis_upper_ready  
);

3.2、模块工作过程

  1. 将上层的数据先进入FIFO
  2. 将IP报文头组完后从FIFO当中取出数据,组成完整的IP报文
  3. 带有简单的流控机制,当前数据包发送完毕后通知上层继续传输数据包。

四、仿真

4.1、发送端

橙色信号为仿真文件产生的上层协议数据,蓝色为组好的IP数据,发送给MAC层。
在这里插入图片描述

4.2、接受端

仿真当中进行了数据回环,即发送端组好的IP数据又回到了IP接收端,即图中的绿色信号,橙色信号为IP_RX模块处理好的数据并发送给上次协议,与上图对比,恢复出来的数据一致。
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

CLIP论文笔记:Learning Transferable Visual Models From Natural Language Supervision

导语 会议:ICML 2021链接:https://proceedings.mlr.press/v139/radford21a/radford21a.pdf 当前的计算机视觉系统通常只能识别预先设定的对象类别,这限制了它们的广泛应用。为了突破这一局限,本文探索了一种新的学习方法&#x…

[ESP32]:TFLite Micro推理CIFAR10模型

[ESP32]:TFLite Micro推理CIFAR10模型 模型训练 数据集处理 from keras.datasets import cifar10 from keras.preprocessing.image import ImageDataGenerator from keras.models import Sequential, load_model, Model from keras.layers import Input, Dense, …

SSH新功能揭秘:远程工作提升指南【AI写作】

首先,这篇文章是基于笔尖AI写作进行文章创作的,喜欢的宝子,也可以去体验下,解放双手,上班直接摸鱼~ 按照惯例,先介绍下这款笔尖AI写作,宝子也可以直接下滑跳过看正文~ 笔尖Ai写作:…

【快速入门 LVGL】-- 5、Gui Guider界面移植到STM32工程

上篇,我们已学习:【快速入门 LVGL】-- 4、显示中文 工程中添加了两个按钮作示范。运行效果如图: 本篇:把Gui Guider设计好的界面,移植到STM32工程。 特别地: 在使用Gui Guider进行界面设计时,应…

浅谈叉车车载电脑的市场现状

叉车的起源 叉车源于美国,兴于日本,虽然中国起步较晚,但是近些年来发展迅速。叉车又称叉式装载车,是对于成件托盘类货物进行装卸、堆垛和短距离运输,实现重物搬运作业的轮式工业车辆。 叉车的分类 叉车分为以上六大类…

Apache RocketMQ ACL 2.0 全新升级

作者:徒钟 引言 RocketMQ 作为一款流行的分布式消息中间件,被广泛应用于各种大型分布式系统和微服务中,承担着异步通信、系统解耦、削峰填谷和消息通知等重要的角色。随着技术的演进和业务规模的扩大,安全相关的挑战日益突出&am…

报错:测试报错postman(测试接口)

报错如下 c.e.exception.GlobalExceptionHandler : 异常信息: Content type multipart/form-data;boundary--------------------------952399813172082093419475;charsetUTF-8 not supported 解决: 异常信息 Content type multipart/form-data;boundary…

git常见命令(成长版)

ps:所谓成长版就是后续可能还会添加命令: 1.删除本地分支: git branch -d 分支名 2.拉取代码后默认master分支,切换到线上其他分支: (1)查看线上所有分支: git branch -a &#…

【网络安全】HTTP协议 — 特点

专栏文章索引:网络安全 有问题可私聊:QQ:3375119339 目录 学习目标​ 一、请求与响应 1.服务器和客户端 二、不保存状态 1.不保存状态的协议 三、资源定位 1.URI(统一资源标识符) 四、请求方法 1.请求方法 五…

代码随想录算法训练营Day10 | 232.用栈实现队列、225. 用队列实现栈

232.用栈实现队列 题目:请你仅使用两个栈实现先入先出队列。队列应当支持一般队列支持的所有操作(push、pop、peek、empty): 实现 MyQueue 类: void push(int x) 将元素 x 推到队列的末尾int pop() 从队列的开头移除…

Git的操作和使用

一、基本操作 1、创建git本地仓库 (1)创建目录:mkdir gitcode (2)进入目录:cd gitcode/ (3)查询目录内容:ls (4)在当前目录下创建git本地仓库…

数据结构(七)---二叉树

目录 一.树的基本概念 二.树的性质 三.二叉树 1.二叉树的基本概念 2.特殊的二叉树 (1)满二叉树 (2)完全二叉树 (3)二叉排序树 (4)平衡二叉树 3.二叉树的性质 4.完全二叉树…

CC软件防火墙和WEB应用防火墙哪个好

本文将从CC软件防火墙的定义、原理、功能以及应用方面进行全面探讨,旨在加深对CC软件防火墙的理解,并推动网络安全意识的普及。以及WEB应用防火墙二者之间的对比。让用户更了解两个形态产品并作出选择。 第一部分:CC软件防火墙的定义和原理 …

北京小米智能工厂

小米工厂智能化 小米集团昌平区的小米智能工厂二期,成为引领智能化制造的重要一环。这座工厂计划打造成为京津冀地区智能制造示范工厂和全球级的“灯塔工厂”。 工厂位于小米未来产业园区,占地81000平方米,年产能可达千万台智能手机&#xff…

创新指南 | 2024年企业如何十步打造最佳的数字化营销策略组合

营销是一个动态且不断变化的领域。顶级的数字营销策略随着消费者和技术趋势的变化而变化。这就是为什么每个公司都需要一个经过良好规划并具有明确里程碑和目标的营销策略。一旦你有了正确的计划,你实现为业务设定的目标的可能性就会大大增加。这意味着,…

提交链码-编辑前后端,调用链码功能

一 . 链码介绍 1.什么链码? • 链码是一段用 Go、Node.js 或者 Java 实现了规定接口的程序。链码在安全的Docker容器中运行, 与背书节点的进程隔离。通过应用程序提交的交易,链码初始化和管理账本状态。• 链码通常处理网络成员协商达成的业…

全网都在找的python+requests接口自动化测试框架实例详解教程

前言 Python是一种功能强大的编程语言,它可以用于自动化测试,特别是接口自动化测试。许多Python库都可以用于接口自动化测试,其中requests库是其中最受欢迎的库之一。 requests库可以用于发送HTTP请求并获取服务器响应,从而轻松…

spring常用注解(五)lombok库

一、介绍: 1、简介: Lombok是一个作用于编辑器和构建工具的 Java 库,可以对编写的 Java 代码进行增强,比如说不用再写实体类的 getter 方法,equals 方法而是自动生成,自动生成日志输出变量等等&#xff0…

uniapp 之 开发微信小程序入门详细指南

目录 配置运行设置(编辑器的设置)项目目录文件配置基础配置中的uniapp应用标识(AppID)配置微信小程序的AppID 总结 配置运行设置(编辑器的设置) 点击编辑器上方菜单栏 - 运行 - 运行到小程序模拟器 - 运行…

css利用transform:skew()属性画一个大屏的背景斜面四边形特效

在工作工程中需要写一个如下的大屏背景&#xff0c;是由几个斜面做成的效果 使用css transform function中的skew()方法实现画其中一个斜面&#xff0c;然后调整背景色实现 写一个div <div class"skew_container test-2"><div class"skew_container_it…