万兆以太网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模块处理好的数据并发送给上次协议,与上图对比,恢复出来的数据一致。
在这里插入图片描述

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

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

相关文章

正点原子[第二期]Linux之ARM(MX6U)裸机篇学习笔记-5

前言: 本文是根据哔哩哔哩网站上“正点原子[第二期]Linux之ARM(MX6U)裸机篇”视频的学习笔记,在这里会记录下正点原子 I.MX6ULL 开发板的配套视频教程所作的实验和学习笔记内容。本文大量引用了正点原子教学视频和链接中的内容。…

曲线「三分」

明明做作业的时候遇到了 n 个二次函数Si(x)ax^2bxc ,他突发奇想设计了一个新的函数F(x)max{Si(x)},i1,2……n 。 明明现在想求这个函数在 的最小值,要求精确到小数点后四位,四舍五入。 输入格式 输入包含 T组数据,每组第一行一…

神经网络的优化器

神经网络的优化器是用于训练神经网络的一类算法,它们的核心目的是通过改变神经网络的权值参数来最小化或最大化一个损失函数。优化器对损失函数的搜索过程对于神经网络性能至关重要。 作用: 参数更新:优化器通过计算损失函数相对于权重参数的…

【蓝桥杯省赛真题38】python字符串拼接 中小学青少年组蓝桥杯比赛 算法思维python编程省赛真题解析

目录 python字符串拼接 一、题目要求 1、编程实现 2、输入输出 二、算法分析 三、程序编写 四、程序说明 五、运行结果 六、考点分析 七、 推荐资料 1、蓝桥杯比赛 2、考级资料 3、其它资料 python字符串拼接 第十三届蓝桥杯青少年组python编程省赛真题 一、题目…

MySQL8.0 msi版本安装教程

MySQL8.0 msi 版本安装教程 1> 官网下载安装包 2> 安装MySQL 2.1双击打开下载的安装包,进入到下面这个页面,选择 Custom 选项,之后,点击next 说明: 2.2 选择所需产品,更改安装位置(当然也可以默认安…

免费ChatGPT合集——亲测免费

1、YesChat 无需登录 网址:YesChat-ChatGPT4V Dalle3 Claude 3 All in One Freehttps://www.yeschat.ai/ 2. 讯飞星火 要登录 讯飞星火大模型-AI大语言模型-星火大模型-科大讯飞 3.通义千问 要登录 通义我是通义,一个专门响应人类指令的…

Unity打开Android文件管理器并加载文件

1、在AssetStore商店中加入免费插件 2、调用代码 3、使用UnityWebRequest加载路径数据

【算法】组合回溯专题

组合总数 给你一个 无重复元素 的整数数组 candidates 和一个目标整数 target ,找出 candidates 中可以使数字和为目标数 target 的 所有 不同组合 ,并以列表形式返回。你可以按 任意顺序 返回这些组合。 candidates 中的 同一个 数字可以 无限制重复被…

新能源车载芯片分析

新能源汽车市场正迸发出巨大的活力,传统主机厂和新势力都纷纷推出各种车型,打起了价格战,各种新技术让人眼花缭乱。当前,战场硝烟弥漫,新能源汽车公司犹如春秋时期的各诸侯国。车载芯片作为新能源汽车的关键组成部分&a…

Jmeter之Beanshell详解

一、 Beanshell概念 Beanshell: BeanShell是一种完全符合Java语法规范的脚本语言,并且又拥有自己的一些语法和方法;BeanShell是一种松散类型的脚本语言(这点和JS类似);BeanShell是用Java写成的,一个小型的、免费的、可以下载的、嵌入式的Java源代码解释器,具有对象脚本语言特性…

【Java】全套云HIS源码包含EMR、LIS(多医院、卫生机构使用)

云HIS系统简介 SaaS模式Java版云HIS系统源码,在公立二甲医院应用三年,经过多年持续优化和打磨,系统运行稳定、功能齐全,界面布局合理、操作简便。 1、融合B/S版电子病历系统,支持电子病历四级,HIS与电子病…

(超级详细)算法刷题Leecode15. 三数之和

题目描述 给你一个整数数组 nums ,判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i ! j、i ! k 且 j ! k ,同时还满足 nums[i] nums[j] nums[k] 0 。请 你返回所有和为 0 且不重复的三元组。 注意:答案中不可以包含重复的三元组…

鸿蒙内核源码分析(进程管理篇) | 谁在管理内核资源?

官方基本概念 从系统的角度看,进程是资源管理单元。进程可以使用或等待CPU、使用内存空间等系统资源,并独立于其它进程运行。 OpenHarmony内核的进程模块可以给用户提供多个进程,实现了进程之间的切换和通信,帮助用户管理业务程序…

香港BTC、ETH现货ETF同时通过,对行业意义几何?

香港比美国更快一步通过以太坊现货 ETF。 2024 年 4 月 15 日,香港嘉实国际资产管理有限公司(Harvest Global Investments)今天宣布,得到香港证监会的原则上批准,将推出两大数字资产(比特币及以太坊&#…

网络程序 -- TCP版服务器

一 多进程版TCP服务器 1.1 核心功能 对于之前编写的 字符串回响程序 来说,如果只有一个客户端进行连接并通信,是没有问题的,但如果有多个客户端发起连接请求,并尝试进行通信,服务器是无法应对的 原因在于 服务器是一个…

WIFI加密方式对无线速率的影响

文章目录 无线加密三种选择:WEP、WPA和WPA2测试平台和测试方法非加密和WEP加密测试 结果差别巨大非加密条件下 300M无线路由实测WEP加密条件下 300M无线路由实测 TKIP加密算法:WPA与WPA2成绩低迷WPA加密(TKIP加密算法)条件下 300M…

【C++】---STL之list详解

【C】---STL之list详解 一、了解list的基本信息二、成员函数1、构造2、迭代器3、empty()4、size()5、front()6、back()7、push_front()8、pop_front()9、push_back()10、pop_back()11、insert()12、erase()13、swap()14、sort()15、reverse() 一、了解list的基本信息 1、库里面…

Java同时使用@RequestBody和@RequestParam传参在postman中执行请求报错:Unsupported Media Type

天行健,君子以自强不息;地势坤,君子以厚德载物。 每个人都有惰性,但不断学习是好好生活的根本,共勉! 文章均为学习整理笔记,分享记录为主,如有错误请指正,共同学习进步。…

C语言数据结构之栈

目录 1.栈的概念及结构2.栈的实现3.栈的代码实现4.相关例题 •͈ᴗ•͈ 个人主页:御翮 •͈ᴗ•͈ 个人专栏:C语言数据结构 •͈ᴗ•͈ 欢迎大家关注和订阅!!! 1.栈的概念及结构 栈:一种特殊的线性表,其只允许在固定的一端进行插…

ElasticSearch集群

我们ES集群主要解决的是这两个问题:海量数据存储问题、单点故障问题 海量数据存储问题:单机的ES,数据存储能力是有上限的 单点故障问题:如果单机上的Elasticsearch节点发生故障,整个系统会停止服务,导致数据…