FPGA实现 TCP/IP 协议栈 客户端 纯VHDL代码编写 提供4套vivado工程源码和技术支持

目录

  • 1、前言
    • 版本更新说明
    • 免责声明
  • 2、相关方案推荐
    • 我这里已有的以太网方案
    • 1G 千兆网 TCP-->服务器 方案
    • 10G 万兆网 TCP-->服务器+客户端 方案
    • 常规性能
    • 支持多节点
    • FPGA资源占用少
    • 数据吞吐率高
    • 低延时性能
  • 4、TCP/IP 协议栈代码详解
    • 代码架构
    • 用户接口
    • 代码模块级细讲
      • 顶层模块
      • PACKET_PARSING模块
      • ARP模块
      • IGMP_REPORT和IGMP_QUERY模块
      • PING和WHOIS2模块
      • ARP_CACHE2模块
      • UDP_TX模块
      • UDP_RX模块
      • TCP_SERVER模块
      • TCP_TX模块
      • TCP_TXBUF模块
      • TCP_RXBUFNDEMUX模块
      • IP、MAC地址定义修改
  • 5、详细设计方案
    • PHY
    • Tri Mode Ethernet MAC
    • TCP数据回环
  • 6、vivado工程1-->B50610 工程
  • 7、vivado工程2-->RTL8211 工程
  • 8、vivado工程3-->88E1518 工程
  • 9、vivado工程4-->Zynq7020 B50610 工程
  • 10、工程移植说明
    • vivado版本不一致处理
    • FPGA型号不一致处理
    • 其他注意事项
  • 11、上板调试验证并演示
    • 准备工作
    • ping测试
    • TCP数据回环测试
    • 传输速率测试
  • 12、福利:工程代码的获取

FPGA实现 TCP/IP 协议栈 客户端 纯VHDL代码编写 提供4套vivado工程源码和技术支持

1、前言

没玩过TCP网络通信都不好意思说自己玩儿过FPGA,这是CSDN某大佬说过的一句话,鄙人深信不疑。。。目前网上fpga实现udp协议的源码满天飞,我这里也有不少,但用FPGA纯源码实现TCP的项目却很少,能上板调试跑通的项目更是少之又少,甚至可以说是凤毛菱角,但很不巧,本人这儿就有一个;一般而言,用FPGA实现TCP并不是一个经济的方案,但对于芯片原型验证、航天可靠通信、水下通信等一些数据传输可靠性极高的领域而言,FPGA实现TCP方案依然占有一席之地;

本设采用纯VHDL实现了TCP/IP协议栈,该协议栈为TCP客户端,没有用到任何一个IP核,为了适应大批量数据传输和匹配不同型号FPGA的源语,RGMII转GMII部分调用了Xilinx的Tri Mode Ethernet MAC三速网IP,TCP/IP协议栈的MAC接口与Tri Mode Ethernet MAC实现了MAC层数据交互,TCP/IP协议栈用户接口分为UDP和TCP接口,这里只需要用到TCP接口,感兴趣的朋友可以试试UDP玩儿,将TCP的收发端口直接用assign语句连接起来形成数据回环,外部指定FPGA开发板的IP地址、MAC地址、端口号、目的IP地址、目的端口号等信息,即可完成TCP协议栈数据回环的工程搭建;TCP/IP协议栈目前速率固定为千兆速率,MAC层数据接口为GMII,所以与phy对接的数据接口为RGMII,鉴于不同phy的时序略有不同,所以我在RTL8211、B50610、88E1518三款phy上做了测试,对应的也建了4套vivado工程,在电脑端进行ping、使用网络调试助手进行TCP收发验证;本设计为TCP客户端端,即FPGA开发板作为客户端,远程节点(比如 PC 电脑)为服务器;

提供4套vivado工程源码,4套代码的区别在于使用的FPGA型号和PHY型号不同,分别如下:

1套vivado工程:FPGA型号为Xilinx 的Artix7--35T,PHY为RTL8211;
第2套vivado工程:FPGA型号为Xilinx 的Kintex7--35T,PHY为B50610;
第3套vivado工程:FPGA型号为Xilinx 的Kintex7--35T,PHY为88E1518;
第4套vivado工程:FPGA型号为Xilinx 的Zynq7020,PHY为B50610;

本设计经过反复大量测试稳定可靠,可在项目中直接移植使用,工程代码可综合编译上板调试,可直接项目移植,适用于在校学生、研究生项目开发,也适用于在职工程师做项目开发,可应用于医疗、军工等行业的数字通信领域;
提供完整的、跑通的工程源码和技术支持;
工程源码和技术支持的获取方式放在了文章末尾,请耐心看到最后;

版本更新说明

此版本为第2版,根据读者的建议,对第1版工程做了如下改进和更新:
1:增加了工程移植的简单说明;
2:增加了Tri Mode Ethernet MAC IP核的使用、更新、修改等说明,以单独文档形式放在了资料包中;
3:新增一套Zynq7020,PHY为B50610的vivado工程;
4:增加了RTL8211、B50610、88E1518三款phy的原理图,已放在资料包中,如下:
在这里插入图片描述

免责声明

本工程及其源码即有自己写的一部分,也有网络公开渠道获取的一部分(包括CSDN、Xilinx官网、Altera官网等等),若大佬们觉得有所冒犯,请私信批评教育;基于此,本工程及其源码仅限于读者或粉丝个人学习和研究,禁止用于商业用途,若由于读者或粉丝自身原因用于商业用途所导致的法律问题,与本博客及博主无关,请谨慎使用。。。

2、相关方案推荐

我这里已有的以太网方案

目前我这里有大量UDP协议的工程源码,包括UDP数据回环,视频传输,AD采集传输等,也有TCP协议的工程,对网络通信有需求的兄弟可以去看看:直接点击前往

1G 千兆网 TCP–>服务器 方案

TCP分为服务器和客户端,两者代码是不一样的,看具体需求,既然本博客介绍的是TCP客户端,那么肯定就有TCP服务器,本来TCP服务器之前一直都有,但一直没有调通,经过两年半的练习调试,总算是调通了;TCP服务器依然是4套工程源码,我另外写了一篇博客介绍TCP服务器,感兴趣的朋友可以去看看:直接点击前往

10G 万兆网 TCP–>服务器+客户端 方案

我这里也有10G 万兆网 TCP 方案,该方案有服务器和客户端两套代码,在Xilinx KU和KUP等平台测试通过并很稳定,对10G 万兆网 TCP 方案感兴趣的朋友可以去看看:直接点击前往

常规性能

1:纯VHDL实现,没有用到任何一个IP核;
2:移植性天花板,该协议栈可在Xilinx、Altera、Lattice、国产FPGA等各大FPGA型号之间任意移植,因为是没有任何IP和源语的纯VHDL代码实现;但例如Tri Mode Ethernet MAC这样的PHY侧IP核目前用的Xilinx的;
3:功能齐全,包含了服务器和客户端,客户端目前还在开发中,暂不提供;TCP/IP协议栈本身包含了动态ARP、NDP、PING、IGMP (for multicast UDP)、DHCP client(客户端才有)等功能模块;
4:代码符合标准的IEEE 802.3协议,支持IPv4和IPv6;
5:对外接PHY的数据格式要求:RGMII;
6:时序收敛很到位,考虑到TCP协议的复杂性和时序的高要求,所以没有采用时序收敛不强的verilog,而是VHDL,虽然阅读性可能会低一些,但用户只需要知道用户接口即可,并不需要去看内部的复杂代码;
7:动态ARP功能;
8:带ping功能;
9:支持多播;

支持多节点

支持节点数是TCP里面最重要的性能指标之一,这里需要重点讲述:
TCP节点数最大支持255个,通过parameter TCP_NUM参数设置,但前提是你的FPGA资源能满足;TCP_NUM参数可以在代码中自由修改,含义和用法,在代码里有详细的注释,为了防止不同编译器下中文注释出现乱码,注释均由英文书写,英语较差的兄弟可以直接某度翻译,位置如下:
在这里插入图片描述
在这里插入图片描述
本例程只用到了1个节点;

FPGA资源占用少

FPGA资源消耗是TCP里面最重要的性能指标之一,这里需要重点讲述:
FPGA资源消耗很低;以下举例:
以Xilinx旗下资源很小的Spartan-6平台为例,下只运行UDP时的资源消耗如下:
在这里插入图片描述
只运行1个TCP服务器时的资源消耗如下:
在这里插入图片描述
运行2个TCP服务器时的资源消耗如下:
在这里插入图片描述

数据吞吐率高

数据吞吐率是TCP里面最重要的性能指标之一,这里需要重点讲述:
下面给出4项测试结果,你可以自己对比评估以下:
测试1:
通过千兆以太网在TCP服务器和TCP客户端之间双向连接,FPGA参考时钟120 MHz条件下,测量的持续吞吐率为双向并发452 Mbits/s;
测试2:
Xilinx Spartan-6 -2速度等级,FPGA参考时钟120 MHz,512字节的UDP数据包通过局域网点对点发送下测得:
0丢包,吞吐率为878.5 Mbits/s;当用户时钟为125 MHz或以上时,UDP最大帧吞吐率为915 Mbits/s;
测试3:
TCP服务器传输吞吐量在1百兆局域网下PC端测量平均吞吐量为93 Mbps,如下;
在这里插入图片描述
测试4:
TCP服务器将8Gbits发送到TCP Java客户端,同时Wireshark收集速度信息。从基于FPGA的TCP服务器到PC的点对点LAN连接平均吞吐率为390.2 Mbits/s;如下:
在这里插入图片描述

低延时性能

延时性能是TCP里面最重要的性能指标之一,这里需要重点讲述:
延时与TCP数据包长直接相关,如果你对延时性能性能要求很高,则可以减少包长来有效降低延时,假设你的载包为X bytes,那么你的收发延时关系如下:
发送延时=0.5 + 2X÷125 µs;
接收延时=0.5 + X÷125 µs;
最大帧长度为1460字节,FPGA 时钟125 MHz下的测试结果如下:
发送延时=23.9µs;
接收延时=12.2µs;

4、TCP/IP 协议栈代码详解

此TCP/IP协议栈是TCP客户端,不是服务器;即FPGA是TCP客户端,远程节点(比如 PC 电脑)是服务器;

代码架构

TCP/IP 协议栈代码架构如下:
在这里插入图片描述
所有模块均由vhdl源码实现,没有使用任何IP,可以移植到任何平台的FPGA上;模块的具体细节在后续章节讲述;用户接口顶层代码如下:
纯VHDL实现,没有用到任何一个IP核,用户只需要知道用户接口即可,并不需要去看内部的复杂代码;用户接口及其注释如下:

module network_top #(
    parameter TCP_NUM = 1
)(
	input                  sys_rst                  ,
	input                  clk_125                  ,
	input                  clk_200                  ,
	output                 phy_rst_n                ,
	output                 gtx_resetn               ,
    output [3: 0]          rgmii_txd                ,	// RGMII Interface
    output                 rgmii_tx_ctl             ,	// RGMII Interface
    output                 rgmii_txc                ,	// RGMII Interface
    input  [3: 0]          rgmii_rxd                ,	// RGMII Interface
    input                  rgmii_rx_ctl             ,	// RGMII Interface
    input                  rgmii_rxc                ,	// RGMII Interface
	output [7: 0]          UDP_RX_DATA              ,	// UDP 接收数据输出
	output                 UDP_RX_DATA_VALID        ,	// UDP 接收数据输出有效信号 高有效
	output                 UDP_RX_SOF               ,	// UDP 接收数据包的第一个数据标志
	output                 UDP_RX_EOF               ,	// UDP 接收数据包的最后一个数据标志
	input  [15:0]          UDP_RX_DEST_PORT_NO_IN   ,	// UDP 接收目的端口号
	input                  CHECK_UDP_RX_DEST_PORT_NO,	// 置 1 使能 UDP 接收目的端口号输入比对
	output [15:0]          UDP_RX_DEST_PORT_NO_OUT  ,	// CHECK_UDP_RX_DEST_PORT_NO=1-->UDP_RX_DEST_PORT_NO_OUT=UDP_RX_DEST_PORT_NO_IN
	input  [7:0]           UDP_TX_DATA              ,	// UDP 发送数据输出
	input                  UDP_TX_DATA_VALID        ,	// UDP 发送数据输出有效信号 高有效
	input                  UDP_TX_SOF               ,	// UDP 发送数据包的第一个数据标志
	input                  UDP_TX_EOF               ,	// UDP 发送数据包的最后一个数据标志
	output                 UDP_TX_CTS               ,	// UDP 数据此时可以发送标志
	output                 UDP_TX_ACK               ,	// UDP 数据包发送完成应答
	output                 UDP_TX_NAK               ,	// UDP 数据包发送未完成应答
	input  [31:0]          UDP_TX_DEST_IP_ADDR      ,	// UDP 发送目的 IP 地址	
	input  [15:0]          UDP_TX_DEST_PORT_NO      ,	// UDP 发送目的端口号
	input  [15:0]          UDP_TX_SOURCE_PORT_NO    ,	// UDP 发送源端口号
	output [8*TCP_NUM-1:0] TCP_RX_DATA              ,	// TCP 接收数据输出
	output [TCP_NUM-1:  0] TCP_RX_DATA_VALID        ,	// TCP 接收数据输出有效信号 高有效
	output [TCP_NUM-1:  0] TCP_RX_RTS               ,	// 通知用户准备接收 TCP 数据
	input  [TCP_NUM-1:  0] TCP_RX_CTS               ,	// 清除接收的 TCP 数据
	input  [8*TCP_NUM-1:0] TCP_TX_DATA              ,	// TCP 发送数据输入
	input  [TCP_NUM-1:  0] TCP_TX_DATA_VALID        ,	// TCP 发送数据输入有效信号 高有效
	output [TCP_NUM-1:  0] TCP_TX_CTS               ,	// TCP 数据此时可以发送标志	
    input [47:          0] MAC_ADDR					,	// 本地 MAC 地址         
    input [31:          0] IPv4_ADDR                ,	// IPv4 地址        
    input [127:         0] IPv6_ADDR                ,	// IPv6 地址         
    input [31:          0] GATEWAY_IP_ADDR          ,	// 本地网关地址  
    input [31:          0] SUBNET_MASK              ,	// 本地子网掩码      
    input [31:          0] MULTICAST_IP_ADDR        ,	// 多播 IP 地址	
    input [16*TCP_NUM-1:0] TCP_LOCAL_PORTS          ,	// 本地 TCP 端口号  	
    input [TCP_NUM-1:   0] CONNECTION_RESET          	// TCP 模块高电平复位
    );

详细代码请看源代码;

用户接口

用户接口分为配置接口和用户接口,用户接口又分为跟应用程序对接的接口和跟MAC对接的用户接口;框图如下:
在这里插入图片描述
配置接口主要完成一些开关功能,例如使能UDP、IPv6、IGMP、本地MAC地址、IP地址等等,下面举1个例子:
使能UDP接收的配置在代码中的位置如下:
在这里插入图片描述
与MAC对接的用户接口不需要讲述,直接与MAC对接即可;
UDP协议的用户接口个人感觉不太重要,因为这里有价值的是TCP协议,所以直接介绍TCP协议的用户接口,TCP协议的用户接口分为接收和发送,都是可与AXI4-Stream对接的类AXI4-Stream接口,代码中有用法,你一看就懂,很简单;
代码的端口中,有一些缩写可能不好理解,下面给出解释:
在这里插入图片描述

代码模块级细讲

顶层模块

顶层模块将各个分模块例化在一起,没什么可讲的,在代码中的位置如下:
在这里插入图片描述

PACKET_PARSING模块

PACKET_PARSING模块功能是解析从MAC接收到的数据包,并有效地提取与多个协议相关的关键信息。解析是动态进行的,而不存储数据;在代码中的位置如下:
在这里插入图片描述

ARP模块

ARP模块的作用是检测ARP请求,并组包一个ARP响应以太网数据包传输到MAC;在代码中的位置如下:在这里插入图片描述

IGMP_REPORT和IGMP_QUERY模块

IGMP_REPORT模块的作用是以广播形式发送GMP成员身份报告,IGMP_QUERY.vhd模块响应成员资格查询。在代码中的位置如下:
在这里插入图片描述

PING和WHOIS2模块

PING模块的作用是检测ICMP回波(ping)请求,并组装一个ping回波以太网数据包,以传输到MAC,Ping同时适用于IPv4和IPv6。
WHOIS2模块的作用是生成一个ARP请求广播包(IPv4)或一个请求消息(IPv6),请求由其IP地址标识的目标用其MAC地址响应。
两个模块共同构成了我们经常用到的ping功能;
在代码中的位置如下:
在这里插入图片描述

ARP_CACHE2模块

ARP_CACHE2模块是一个共享的路由表,它存储最多128个IP地址及其关联的48位MAC地址和一个“实时的”时间戳。此模块将确定目标IP地址是否为本地地址。在后一种情况下,将返回网关的MAC地址,只存储有关本地地址的记录(例如,不是WAN地址,因为这些地址通常指向路由器MAC地址);仲裁电路用于仲裁来自多个传输实例的路由请求。在代码中的位置如下:
在这里插入图片描述

UDP_TX模块

UDP_TX模块的作用是将一个数据包封装到一个UDP帧中,即从任何端口到任何端口/IP目标的地址。同时支持IPv4和IPv6。通常例化一次,而不管源或目标UDP端口的数量如何,在代码中的位置如下:
在这里插入图片描述

UDP_RX模块

UDP_RX模块的作用是验证接收到的UDP帧,并提取其中的数据包。由于验证是在接收到的数据通过时动态执行的(没有存储),因此在数据包结束时提供了有效性确认信号。在代码中的位置如下:
在这里插入图片描述

TCP_SERVER模块

TCP_SERVER模块是TCP协议的核心。它可参数化配置,以支持ntcp流并发TCP连接。它本质上是处理TCP服务器的TCP状态机:首先监听来自远程TCP客户端的连接请求,建立和删除连接,并在建立连接时管理流控制和字节排序。由于这是一个服务器,它事先不预先知道协议是IPv4还是IPv6(它依赖于客户端),所以每个服务器有两个IP地址,每个IP版本一个。此模块在TCP服务器的vivado工程中才有,在代码中的位置如下:
在这里插入图片描述

TCP_TX模块

TCP_TX模块的作用是格式化TCP tx帧,包括所有层:TCP,IP,MAC/以太网。它对所有并发流都是通用的,因此只实例化一次。在代码中的位置如下:
在这里插入图片描述

TCP_TXBUF模块

TCP_TXBUF模块的作用是将TCP tx有效负载数据存储在单独的弹性缓冲区中,每个传输流对应一个。缓冲区大小是在合成之前通过ADDR_WIDTH通用参数配置的。在代码中的位置如下:
在这里插入图片描述

TCP_RXBUFNDEMUX模块

TCP_RXBUFNDEMUX模块解复用了几个TCP rx流。该模块有两个目标: (1)暂时保持一个接收到的TCP帧,直到在帧结束时确认其有效性。如果无效则丢弃,如果无效则丢弃进一步处理。(2)基于目标端口号来分解多个TCP流。在代码中的位置如下:
在这里插入图片描述

IP、MAC地址定义修改

工程代码中需要定义开发板的MAC、IP地址以及端口号等信息,包括服务器和客户端的;
服务器和客户端的定义修改在代码中的位置一样的,如下:
开发板本地 IP、MAC地址定义修改位置如下:
代码位于top.v
在这里插入图片描述

5、详细设计方案

详细设计方案如下:
在这里插入图片描述

PHY

本例程提供3套vivado工程源码,分别对应RTL8211、B50610、88E1518三款不同的PHY,为了方便大家设计,我直接给出了三款PHY的原理图,已放在资料包中,如下:
在这里插入图片描述

Tri Mode Ethernet MAC

由于TCP协议栈前面已经详细讲过了,这里重点讲讲Tri Mode Ethernet MAC这个IP,IP调用如下:适应大批量数据传输和匹配不同型号FPGA的源语,RGMII转GMII部分调用了Xilinx的Tri Mode Ethernet MAC三速网IP,TCP/IP协议栈的MAC接口与Tri Mode Ethernet MAC实现了MAC层数据交互,MAC数据在Tri Mode Ethernet MAC和TCP/IP 协议栈之间用两个AXI-FIFO实现数据缓冲和提高数据带宽;Tri Mode Ethernet MAC固定速率为1000兆,IP配置如下:
在这里插入图片描述
在这里插入图片描述
Tri Mode Ethernet MAC在本设计中处于被锁定状态,这是我们故意为之,目的是根据不同的PHY延时参数而修改其内部代码和内部时序约束代码,这里重点介绍使Tri Mode Ethernet MAC时的修改和移植事项,当你需要工程移植,或者你的vivado版本与我的不一致时,Tri Mode Ethernet MAC都需要在vivado中进行升级,但由于该IP已被我们人为锁定,所以升级和修改需要一些高端操作,关于操作方法,我专门写了一篇文档,已附在资料包里,如下:
在这里插入图片描述

TCP数据回环

将TCP的收发端口直接用assign语句连接起来形成数据回环,外部指定FPGA开发板的IP地址、MAC地址、端口号、目的IP地址、目的端口号等信息,即可完成TCP协议栈数据回环的工程搭建;代码部分如下:
在这里插入图片描述

6、vivado工程1–>B50610 工程

开发板:Xilinx–>xc7k325tffg676-2;
开发环境:Vivado2020.2;
网络PHY:B50610 延时模式;
输入\输出:TCP 网络通信;
测试项:数据收发、连续ping;
工程代码架构如下:
在这里插入图片描述
FPGA资源消耗和功耗预估;
在这里插入图片描述

7、vivado工程2–>RTL8211 工程

开发板:Xilinx–>xc7a35tfgg484-2;
开发环境:Vivado2020.2;
网络PHY:RTL8211;
输入\输出:TCP 网络通信;
测试项:数据收发、连续ping;
工程代码架构如下:
在这里插入图片描述
FPGA资源消耗和功耗预估;
在这里插入图片描述

8、vivado工程3–>88E1518 工程

开发板:Xilinx–>xc7k325tffg676-2;
开发环境:Vivado2020.2;
网络PHY:88E1518;
输入\输出:TCP 网络通信;
测试项:数据收发、连续ping;
工程代码架构如下:
在这里插入图片描述
FPGA资源消耗和功耗预估;
在这里插入图片描述

9、vivado工程4–>Zynq7020 B50610 工程

开发板:Xilinx–>Zynq7000系列–>xc7z020clg400-2;
开发环境:Vivado2020.2;
网络PHY:B50610 延时模式;
输入\输出:TCP服务器端网络通信;
测试项:数据收发、连续ping;
工程代码架构如下:
在这里插入图片描述
FPGA资源消耗和功耗预估;
在这里插入图片描述

10、工程移植说明

vivado版本不一致处理

1:如果你的vivado版本与本工程vivado版本一致,则直接打开工程;
2:如果你的vivado版本低于本工程vivado版本,则需要打开工程后,点击文件–>另存为;但此方法并不保险,最保险的方法是将你的vivado版本升级到本工程vivado的版本或者更高版本;
在这里插入图片描述
3:如果你的vivado版本高于本工程vivado版本,解决如下:
在这里插入图片描述
打开工程后会发现IP都被锁住了,如下:
在这里插入图片描述
此时需要升级IP,操作如下:
在这里插入图片描述
在这里插入图片描述

FPGA型号不一致处理

如果你的FPGA型号与我的不一致,则需要更改FPGA型号,操作如下:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
更改FPGA型号后还需要升级IP,升级IP的方法前面已经讲述了;

其他注意事项

1:由于每个板子的DDR不一定完全一样,所以MIG IP需要根据你自己的原理图进行配置,甚至可以直接删掉我这里原工程的MIG并重新添加IP,重新配置;
2:根据你自己的原理图修改引脚约束,在xdc文件中修改即可;
3:纯FPGA移植到Zynq需要在工程中添加zynq软核;

11、上板调试验证并演示

准备工作

以vivado工程1–>B50610 工程为例进行上板调试;
连接如下:
在这里插入图片描述
首先设置电脑端IP如下:
在这里插入图片描述
下载bit,如下:
在这里插入图片描述

ping测试

打开cdm,输入 ping 192.168.0.56,如下:
在这里插入图片描述

TCP数据回环测试

打开网络调试助手并配置,如下:
在这里插入图片描述
单次发送数据测试结果如下:
在这里插入图片描述
循环发送数据测试结果如下,1秒时间间隔循环:可以看到,收发计数都到了165032 Byte没有丢包,足以证明其稳定性;
在这里插入图片描述

传输速率测试

去除合理线损后的PC段测得991M速率,如下:
在这里插入图片描述

12、福利:工程代码的获取

福利:工程代码的获取
代码太大,无法邮箱发送,以某度网盘链接方式发送,
资料获取方式:私,或者文章末尾的V名片。
网盘资料如下:
在这里插入图片描述
在这里插入图片描述
TCP源码路径如下:
在这里插入图片描述
对 1G 千兆网 TCP 服务器感兴趣的朋友也可以看看服务器的4套vivado工程源码,网盘资料如下:
在这里插入图片描述
TCP源码路径如下:
在这里插入图片描述

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

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

相关文章

腾讯地图绘画多边形和计算面积

<!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta name"viewport" content"widthdevice-width, initial-scale1.0" /><title>地图</title></head><script src…

将加速度计当作麦克风来听振动

我们都知道&#xff0c;用麦克风来捕捉声音时&#xff0c;最大的挑战是&#xff1a;背景噪音。这背景噪音有&#xff0c;车辆行驶中的风噪、车辆所处周围的环境的声音&#xff08;人声、车间其它声音&#xff09;、车辆其它部件正常工作的声音。 我们测用加速度计测振动时&…

Flink系列之:监控反压

Flink系列之&#xff1a;监控反压 一、反压二、Task 性能指标三、示例四、反压状态 Flink Web 界面提供了一个选项卡来监控正在运行 jobs 的反压行为。 一、反压 如果你看到一个 task 发生 反压警告&#xff08;例如&#xff1a; High&#xff09;&#xff0c;意味着它生产数…

CTF竞赛密码学题目解析

CTF&#xff08;Capture The Flag&#xff09;竞赛是一个有趣的挑战。密码学是CTF竞赛中的核心元素之一&#xff0c;通常涉及解密、破译密码、理解加密算法等技能。以下是30个题目及答案&#xff0c;新入行的可以看看鸭。 题目及答案 1. Caesar Cipher 描述&#xff1a;给出一…

【JavaEE】多线程(5) -- 阻塞队列

目录 1.阻塞队列是什么? 2.生产者消费者模型 3.标准库中的阻塞队列 4.阻塞队列的实现 1.阻塞队列是什么? 阻塞队列是⼀种特殊的队列. 也遵守 "先进先出" 的原则 阻塞队列能是⼀种线程安全的数据结构, 并且具有以下特性: 当队列满的时候, 继续⼊队列就会阻塞, …

论文阅读二——基于全脸外观的凝视估计

论文阅读二——基于全脸外观的凝视估计 基础知识主要内容文章中需要学习的架构AlexNet 代码复现 该论文是2017年在CVPR中发表的一篇关于 “gaze estimation” 的文章&#xff0c;其论文地址与代码地址如下&#xff1a; 论文地址 代码地址 论文特点&#xff1a;文章提出了一种…

IT和业务部门都想要的数据摆渡产品是这样的!

企业只要进行了网络隔离&#xff0c;就必然会需要数据摆渡相关产品&#xff0c;不管是免费的也好&#xff0c;专业收费的也好&#xff0c;总之都是需要将数据流转起来进行使用。 传统的数据摆渡产品也不少&#xff0c;比如FTP&#xff0c;甚至是U盘拷贝&#xff0c;在功能上来说…

Java数组(2)

我是南城余&#xff01;阿里云开发者平台专家博士证书获得者&#xff01; 欢迎关注我的博客&#xff01;一同成长&#xff01; 一名从事运维开发的worker&#xff0c;记录分享学习。 专注于AI&#xff0c;运维开发&#xff0c;windows Linux 系统领域的分享&#xff01; 本…

Docker容器如何优雅地访问宿主机网络

# 前言 某些时候&#xff0c;我们会有在容器内容访问宿主机某个服务的需求&#xff0c;比如现在 openai 无法直接访问&#xff0c;需要给项目添加代理&#xff0c;我的 chatgpt-dingtalk (opens new window) 项目支持了通过环境变量指定代理地址。 添加方式如下&#xff1a; …

微信小程序(五)地图

一、引言 作者开发《目的地到了》需要满足用户选取地址作为目的地的需求&#xff0c;所以需要使用到地图。作者用的是腾讯地图&#xff0c;这里介绍下技术实现。 二、引包 引入腾讯地图的组件包微信小程序JavaScript SDK | 腾讯位置服务&#xff0c;根据经纬度调用里面的api才…

5款不可或缺的办公软件,好用且使用频率超高,几乎每个人都需要

在当今数字化时代&#xff0c;办公软件成为了现代职场必备的工具。这些软件可以大大提高我们的办公效率&#xff0c;简化工作流程&#xff0c;使我们更加高效地完成任务。今天给大家分享5款不可或缺的办公软件&#xff0c;它们不仅好用&#xff0c;而且使用频率极高&#xff0c…

【PWN】学习笔记(三)【返回导向编程】(中)

目录 课程回顾动态链接过程 课程 课程链接&#xff1a;https://www.bilibili.com/video/BV1854y1y7Ro/?vd_source7b06bd7a9dd90c45c5c9c44d12e7b4e6 课程附件&#xff1a; https://pan.baidu.com/s/1vRCd4bMkqnqqY1nT2uhSYw 提取码: 5rx6 回顾 管道符 | 把前一个指令的输出作…

【C++高阶(七)】C++异常处理的方式

&#x1f493;博主CSDN主页:杭电码农-NEO&#x1f493;   ⏩专栏分类:C从入门到精通⏪   &#x1f69a;代码仓库:NEO的学习日记&#x1f69a;   &#x1f339;关注我&#x1faf5;带你学习C   &#x1f51d;&#x1f51d; 异常处理的方式 1. 前言2. C语言处理异常的方式…

JVM-1-运行时数据区

程序计数器&#xff08;Program Counter Register&#xff09; 是一块较小的内存空间&#xff0c;它可以看作是当前线程所执行的字节码的行号指示器。在Java虚拟机的概念模型里[1]&#xff0c;字节码解释器工作时就是通过改变这个计数器的值来选取下一条需要执行的字节码指令&…

centos安装了curl却报 -bash: curl: command not found

前因 我服务器上想用curl下载docker-compress&#xff0c;发现没有curl命令&#xff0c;就去下载安装&#xff0c;安装完成之后&#xff0c;报-bash: curl: command not found 解决方法 [rootcentos ~]# rpm -e --nodeps curl warning: file /usr/bin/curl: remove failed: …

AIGC实战——条件生成对抗网络(Conditional Generative Adversarial Net, CGAN)

AIGC实战——条件生成对抗网络 0. 前言1. CGAN架构2. 模型训练3. CGAN 分析小结系列链接 0. 前言 我们已经学习了如何构建生成对抗网络 (Generative Adversarial Net, GAN) 以从给定的训练集中生成逼真图像。但是&#xff0c;我们无法控制想要生成的图像类型&#xff0c;例如控…

Nat Med | Tau靶向反义寡核苷酸

今天给同学们分享一篇实验文章“Tau-targeting antisense oligonucleotide MAPTRx in mild Alzheimers disease: a phase 1b, randomized, placebo-controlled trial”&#xff0c;这篇文章发表在Nat Med期刊上&#xff0c;影响因子为82.9。 结果解读&#xff1a; 患者 从201…

防止反编译,保护你的SpringBoot项目

ClassFinal-maven-plugin插件是一个用于加密Java字节码的工具&#xff0c;它能够保护你的Spring Boot项目中的源代码和配置文件不被非法获取或篡改。下面是如何使用这个插件来加密test.jar包的详细步骤&#xff1a; 安装并设置Maven&#xff1a; 首先确保你已经在你的开发环境中…

关于#c语言#的问题:分析递归调用的过程◇画出调用过程各语句执行过程

关于#c语言#的问题&#xff1a;分析递归调用的过程◇画出调用过程各语句执行过程 当涉及到递归调用的过程时&#xff0c;可以通过绘制函数调用栈来分析和理解递归的执行过程。下面是一个示例的C语言递归函数和相应的调用过程&#xff1a; #include <stdio.h>void recurs…

数据结构 AVL树概念以及实现插入的功能(含Java代码实现)

为啥要有avl树 avl树是在二叉搜索树下的一种进阶形式,是为了防止二叉搜索树在极端情况下产生的链表化的场景,从而在二叉搜索树的基础上,加上了某些条件来阻止这种极端情况的产生,但不是保证完全平衡,而是放开了一定的条件,使得这种情况不那么难以满足.(条件:左右子树的高度差的…