基于FPGA的UDP协议栈设计第二章_IP层设计

news/2024/5/18 11:52:31 标签: udp, tcp/ip, 网络, fpga开发

文章目录

  • 前言:IP层报文解析
  • 一、IP_TX模块
  • 一、IP_RX模块
  • 总结

前言:IP层报文解析

参考:https://blog.csdn.net/Mary19920410/article/details/59035804
在这里插入图片描述

  • 版本:IP协议的版本,4bit,IPV4-0100,IPV6-0110
  • 首部长度:IP报头的长度。固定部分的长度(20字节,5个32bit,一般就填5)和可变部分的长度之和。4bit。最大为1111,即10进制的15,代表IP报头的最大长度可以为15个32bits(4字节),也就是最长可为15*4=60字节,除去固定部分的长度20字节,可变部分的长度最大为40字节。
  • 服务类型:Type Of Service,没用过,那就写0!
  • 总长度:IP报文的总长度。报头的长度和数据部分的长度之和,以字节为单位。
  • 标识:唯一的标识主机发送的每一分数据报。通常每发送一个报文,它的值加一。当IP报文长度超过传输网络的MTU(最大传输单元)时必须分片,这个标识字段的值被复制到所有数据分片的标识字段中,使得这些分片在达到最终目的地时可以依照标识字段的内容重新组成原先的数据。
  • 标志:共3位。R、DF、MF三位。目前只有后两位有效,DF位:为1表示不分片,为0表示分片。MF:为1表示“更多的片”,为0表示这是最后一片。
  • 片位移:本分片在原先数据报文中相对首位的偏移位。(需要再乘以8)
  • 生存时间:IP报文所允许通过的路由器的最大数量。每经过一个路由器,TTL减1,当为0时,路由器将该数据报丢弃。TTL 字段是由发送端初始设置一个 8 bit字段.推荐的初始值由分配数字 RFC 指定,当前值为 64。发送 ICMP 回显应答时经常把 TTL 设为最大值 255。
  • 协议:指出IP报文携带的数据使用的是那种协议,以便目的主机的IP层能知道要将数据报上交到哪个进程(不同的协议有专门不同的进程处理)。和端口号类似,此处采用协议号,TCP的协议号为6,UDP的协议号为17。ICMP的协议号为1,IGMP的协议号为2.
  • 首部校验和:计算IP头部的校验和,检查IP报头的完整性。
  • 源IP地址:标识IP数据报的源端设备。
  • 目的IP地址:标识IP数据报的目的地址。

一、IP_TX模块

将上层协议发送的数据进行组帧,具体如何实现与上一篇内容MAC层设计一致,连接在此:https://blog.csdn.net/m0_56222647/article/details/136958436?spm=1001.2014.3001.5502
难点在于首部校验和计算过程:
计算过程:

  1. 首部校验和只需要校验报文头部即可,将IP头数据以每16bit进行分组,其中的首部校验和字段初始为0
  2. 将这些16bit数据进行反码加法运算(高位溢出加到低位)
  3. 由于会出现溢位,所以r_ip_header_chk 是32位的,将相加得到的和的高16位(溢出位)和低16位再进行一次相加
  4. 最终结果取反即为首部校验和
always @(posedge i_clk or posedge i_rst)begin
    if(i_rst)
        r_ip_header_chk <= 'd0; 
    else if(ri_send_valid && r_ip_data_cnt == 0)
        r_ip_header_chk <= 16'h4500 + ri_send_len + r_ip_tag + 16'h4000 + {8'd64,ri_send_type} + 16'd0
                            + r_src_ip[31:16] + r_src_ip[15:0] + r_dst_ip[31:16] + r_dst_ip[15:0];  
    else if(r_ip_data_cnt == 1)
        r_ip_header_chk <= r_ip_header_chk[31:16] + r_ip_header_chk[15:0];       
    else if(r_ip_data_cnt == 2)
        r_ip_header_chk <= r_ip_header_chk[31:16] + r_ip_header_chk[15:0];   
    else if(r_ip_data_cnt == 3)
        r_ip_header_chk <= ~r_ip_header_chk;  
    else 
        r_ip_header_chk <= r_ip_header_chk;
end

一、IP_RX模块

很简单,按照协议进行解析即可,将IP头数据刨除,将数据字段交给上一层(UDP或者ICMP)即可。

总结

按部就班即可,完整代码参考GitHub:https://github.com/shun6-6/Tri_Eth_UDP_pro_stack


http://www.niftyadmin.cn/n/5447051.html

相关文章

Docker 【通过Dockerfile构建镜像】【docker容器与镜像的关系】

文章目录 前言一、前期的准备工作二、上手构建一个简单的镜像三、DcokerFile1 指令总览2 指令详情 四、Dockerfile文件规范五、docker运行build时发生了什么?六、调试手段1. 修改镜像打包后&#xff0c;如何验证新内容已更新至镜像 七、Dockerfile优化方案 前言 docker构建镜…

异常的认识(Java篇详解)

&#x1f341; 个人主页&#xff1a;爱编程的Tom&#x1f4ab; 本篇博文收录专栏&#xff1a;Java专栏&#x1f449; 目前其它专栏&#xff1a;c系列小游戏 c语言系列--万物的开始_ &#x1f389; 欢迎 &#x1f44d;点赞✍评论⭐收藏&#x1f496;三连支持一…

opencv()2

(正在读取数据库 ... 系统当前共安装有 289028 个文件和目录。) 准备解压 .../libpng12-0_1.2.54-1ubuntu1.1_arm64.deb ... 正在解压 libpng12-0:arm64 (1.2.54-1ubuntu1.1) ... dpkg: 处理归档 /var/cache/apt/archives/libpng12-0_1.2.54-1ubuntu1.1_arm64.deb (--unpack)时…

01.重新认识文件(Linux基本概念)

知识引入&#xff1a; 我们经常使用word或者wps写的论文、作业等都是文件&#xff0c;而我们这样对文件的认识也比较片面。我们是否思考过&#xff0c;如果文件里面没有写东西&#xff0c;那么计算机会不会保存呢&#xff1f;答案是&#xff0c;肯定会的。因为我们每次建的空文…

Rancher(v2.6.3)——安装Rancher

[详细安装说明请查看Rancher安装说明文档]&#xff1a;https://gitee.com/WilliamWangmy/snail-knowledge/blob/master/Rancher/Rancher%E4%BD%BF%E7%94%A8%E6%96%87%E6%A1%A3.md#1%E5%AE%89%E8%A3%85rancher Rancher部署Mysql&#xff08;单机版&#xff09;&#xff1a;http…

个人简历项目准备

文章目录 1. CSS 书写顺序1.1. 顺序的重要性1.2. 整体顺序1.3. 一般顺序 2. 选择器使用3. em 和 rem 区别3.1. em3.2. rem 4. 项目环境搭建5. object-fit6. 粘性定位6.1. 概念6.2. 参考点6.3. 特点6.4. 使用方式 7. 媒体查询7.1. 概念7.2. 媒体类型7.3. 媒体特性7.4. 常用阈值7…

富格林:出金不顺谨防虚假受害

富格林悉知&#xff0c;做投资有盈有亏是正常的&#xff0c;投资者需要做的是尽可能降低亏损的风险&#xff0c;警惕虚假出金陷阱&#xff0c;避免造成不必要的亏损。在进入黄金投资市场之前&#xff0c;投资者需学习一定的投资技巧&#xff0c;并且需要采取正规的策略来打击和…

0103设计算法-算法基础-算法导论第三版

文章目录 一、分治法二、分析分治算法结语 我们可以选择使用的算法设计技术有很多。插入排序使用了增量方法&#xff1a;在排序子数组 A [ 1 ⋯ j − 1 ] A[1\cdots j-1] A[1⋯j−1]后&#xff0c;将单个元素 A [ j ] A[j] A[j]插入子数组的适当位置&#xff0c;产生排序好的子…