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

文章目录

前言: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. 最终结果取反即为首部校验和
c 复制代码
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

相关推荐
左手厨刀右手茼蒿1 小时前
Flutter 组件 http_requests 适配鸿蒙 HarmonyOS 实战:极简网络请求,构建边缘端轻量级 RESTful 通讯架构
网络·flutter·http
江南风月1 小时前
日志审计系统WGLOG支持syslog吗
运维·网络·日志审计
fei_sun2 小时前
逻辑设计概念及Vivado基础
fpga开发
Blurpath住宅代理2 小时前
代理IP全面解析:从协议原理到高阶应用场景的技术指南
网络·静态ip·动态代理·住宅ip·住宅代理
聊点儿技术3 小时前
利用IP归属地查询识别异地登录风险:企业账号安全的技术探索
数据库·tcp/ip·安全
晏宁科技YaningAI3 小时前
全球短信路由系统设计逻辑打破 80%送达率瓶颈:工程实践拆解
网络·网络协议·架构·gateway·信息与通信·paas
发光的沙子4 小时前
FPGA----vitis测试linux程序
fpga开发
WIN-U64 小时前
新版华三H3C交换机配置NTP时钟步骤 示例(命令及WEB配置)
网络协议·tcp/ip·http
爱学习的小囧4 小时前
ESXi 8.0 无法选择分区方式 小白级详细解决办法
运维·服务器·网络·虚拟化·esxi8.0
F1FJJ4 小时前
什么是 Shield CLI?视频讲解:一条命令,可浏览器远程访问一切内部服务(RDP/VNC/SSH/数据库等)
运维·网络·数据库·网络协议·ssh