FPGA实现千兆以太网RGMII接收模块:UDP帧解析与双沿采样设计
1. 从网线到逻辑千兆以太网接收模块的使命大家好我是老张在FPGA和高速通信这块摸爬滚打了十几年。今天咱们不聊那些虚头巴脑的理论直接上手一个硬核实战项目用FPGA实现千兆以太网的RGMII接收模块核心任务是把网线里跑的UDP数据包给“抓”出来把用户数据干干净净地提取出来。想象一下这个场景你的电脑通过网线正以每秒10亿比特1Gbps的速度向一块FPGA开发板狂灌数据比如是一幅高清图片或者一段传感器读数。FPGA这边呢它不能像电脑CPU那样用软件慢慢解析它得靠硬件逻辑在每一个时钟节拍里实时地识别数据包、检查地址、剥掉层层“包装”最后把有用的“干货”存到自己的内存里。这就是我们要做的接收模块的活儿。为什么是RGMII和UDPRGMII是“简化版千兆媒体独立接口”它用4根数据线加125MHz时钟通过上升沿和下降沿都传数据这叫双沿采样来实现千兆速率比用8根数据线的GMII接口省了一半的引脚对FPGA来说非常友好。而UDP协议相比TCP它没有复杂的握手、确认、重传机制协议头简单特别适合用FPGA这种硬件逻辑来实现高速、低延迟的数据传输像视频流、实时控制这些场景用它就对了。所以今天这篇文章就是带你手把手在FPGA里搭建一个高速数据入口。我们会从最核心的UDP帧解析状态机讲起再攻克RGMII接口双沿采样的硬件实现难题最后把它们拼成一个完整的接收系统。我会把我在调试中踩过的坑、总结的技巧都分享出来目标是让你看完就能理解原理甚至能照着动手实现。2. UDP帧解析设计一个“聪明”的接收状态机接收模块的核心是一个“解析引擎”它需要像流水线上的质检员一样对源源不断的数据流进行分段检查决定是收下还是丢弃。最优雅的实现方式就是状态机。2.1 理解UDP数据包的“洋葱”结构一个通过以太网传输的UDP数据包就像一颗洋葱从外到内有多层封装。我们的接收逻辑就是一层层地剥开它最外层以太网帧Ethernet Frame。以7个字节的前导码0x55和1个字节的帧起始符0xD5开头接着是14字节的MAC帧头里面包含了目的MAC地址、源MAC地址和以太网类型比如0x0800代表里面是IP包。中间层IP数据报IP Datagram。以太网帧的数据部分如果类型是0x0800那它的开头就是IP头。IP头里包含了源IP地址、目的IP地址以及上层协议类型比如17代表UDP。最内层UDP数据报UDP Datagram。IP数据报的数据部分如果协议类型是17那它的开头就是UDP头。UDP头很简单主要是源端口、目的端口、长度和校验和。UDP头后面就是我们想要的用户数据了。我们的状态机就是要依次走过这些层次并在每一层做关键检查。只有目的MAC地址是我们的或广播地址、目的IP地址是我们的、协议类型是UDP这个包才会被最终接收。2.2 三段式状态机实战清晰、安全、易维护在Verilog里我强烈推荐使用“三段式”状态机来写这个解析逻辑。它把状态转移、状态输出和输出逻辑分开结构清晰不容易出错。首先我们定义状态。状态应该和协议的分段一一对应localparam IDLE 4d0; // 空闲等待包开始 localparam PREAMBLE 4d1; // 接收前导码和SFD localparam ETH_HEADER 4d2; // 接收以太网帧头 localparam IP_HEADER 4d3; // 接收IP帧头 localparam UDP_HEADER 4d4; // 接收UDP帧头 localparam USER_DATA 4d5; // 接收用户数据 localparam FCS_CHECK 4d6; // 检查帧校验序列可选 localparam RX_END 4d7; // 包接收结束无论成功失败第一个always块时序逻辑更新当前状态 这是最标准的写法每个时钟沿根据复位或下一个状态来更新当前状态寄存器。always (posedge clk or posedge rst) begin if (rst) begin curr_state IDLE; end else begin curr_state next_state; end end第二个always块组合逻辑判断状态转移 这里是状态机的“大脑”根据当前状态、输入数据和一些标志决定下一个状态是什么。这里有几个关键技巧分段计数器在每个接收状态如ETH_HEADER使用一个计数器记录已经接收了多少字节。例如以太网帧头固定14字节计数器到130-13后就产生跳转条件。动态长度处理IP头长度不固定由头中的“首部长度”字段IHL低4位指出单位是4字节。所以IP头实际字节数 IHL * 4。我们需要在接收到这个字段后把它存下来并用一个计数器计数到(ip_hdr_len-1)才跳出IP_HEADER状态。UDP包长度也类似由UDP头中的“长度”字段指出用户数据长度 UDP长度 - 8字节UDP头。错误即时丢弃一旦在任一状态发现错误如MAC地址不匹配、IP地址不匹配、以太网类型不是IP下一个状态不是回IDLE而是跳转到RX_END。这是因为此时物理层数据有效信号可能还在持续必须等到它结束rx_dv变低才能回到IDLE否则会错把后续数据当成新包的前导码。always (*) begin next_state IDLE; // 默认状态 case (curr_state) IDLE: begin if (rx_dv 1b1 rx_data 8h55) // 检测到前导码开始 next_state PREAMBLE; else next_state IDLE; end ETH_HEADER: begin if (eth_hdr_cnt 5d13) begin // 14字节收完 if (dst_mac_match eth_type 16h0800) next_state IP_HEADER; else next_state RX_END; // 地址或类型错误准备丢弃 end else begin next_state ETH_HEADER; end end RX_END: begin if (rx_dv 1b0) // 等待当前包传输彻底结束 next_state IDLE; else next_state RX_END; end // ... 其他状态转移逻辑 endcase end第三个always块时序逻辑产生控制信号和输出 这个块根据curr_state来决定每个时钟周期做什么。比如在USER_DATA状态使能数据存储信号将gmii_rxd总线上的数据写入FIFO或RAM。同时它也负责更新各个分段计数器。always (posedge clk or posedge rst) begin if (rst) begin user_data_valid 1b0; user_data_out 8d0; eth_hdr_cnt 5d0; end else begin user_data_valid 1b0; // 默认拉低 case (curr_state) ETH_HEADER: begin if (rx_dv) begin // 存储MAC地址、类型等字段到对应寄存器 eth_hdr_cnt eth_hdr_cnt 1; end end USER_DATA: begin if (rx_dv user_data_cnt udp_data_length) begin user_data_valid 1b1; // 产生有效信号 user_data_out gmii_rxd; // 输出用户数据 user_data_cnt user_data_cnt 1; end end // ... endcase end end2.3 校验机制的取舍与实现思路原始文章提到这个模块没有实现CRC校验。在实际项目中这是一个需要权衡的决策。不做校验逻辑简单资源占用少延迟最低。适用于链路质量极好如板间短距离连接或应用层本身有校验的场景。做校验更可靠。但需要增加一个CRC计算模块并在FCS_CHECK状态将计算得到的CRC值与接收到的CRC尾4字节比较。这里有个关键点校验通过前用户数据不能确认有效。因此你需要一个缓存如FIFO在接收用户数据阶段先将其暂存。等到CRC校验通过再从FIFO中读出数据并输出有效信号若校验失败则清空FIFO丢弃该包。我个人的经验是对于可靠性要求高的产品级应用建议加上CRC校验。你可以先用一个简单的FIFO如Xilinx的IP核做缓存后期再优化。3. 征服RGMII双沿采样与时钟时序的艺术解析逻辑状态机工作在GMII接口8位数据125MHz单沿采样下。但我们的物理接口是RGMII4位数据125MHz双沿采样。所以首要任务是把RGMII转换成GMII这就是整个设计的第一个硬件难点。3.1 RGMII接口的时序挑战RGMII接口为了用4根线达到千兆速率采用了DDR技术在125MHz时钟的上升沿传输数据的低4位rxd[3:0]在下降沿传输数据的高4位rxd[7:4]。同时控制信号rx_ctl也是双沿的上升沿传输数据有效信号rx_dv下降沿传输错误信号rx_err通常我们暂不处理。PHY芯片发送数据时为了保证对端FPGA能采到稳定的数据通常会让时钟rx_clk的边沿对准数据rxd和rx_ctl的中心。这就意味着rx_clk的跳变沿比数据的变化沿晚了大约2ns对于125MHz时钟90度相位差。这就是所谓的“非延时模式”。有些PHY也支持“延时模式”即时钟边沿与数据边沿对齐。3.2 调用Xilinx原语搭建可靠的接收通道为了在FPGA内可靠地实现双沿采样我们必须使用Xilinx提供的专用硬件原语直接操作IOB输入输出块中的资源。主要用到以下几个IDELAYE2输入延时单元用来微调输入数据的延时让数据边沿和时钟边沿满足建立/保持时间。我们可以把它配置为FIXED固定延时模式并设置一个初始的IDELAY_VALUE如14个tap。每个tap的延时精度由参考时钟REFCLK_FREQUENCY决定200MHz时约78ps。IDELAYCTRL这是IDELAYE2的“校准器”。只要使用了IDELAYE2就必须例化一个IDELAYCTRL并给它提供一个稳定的参考时钟通常用MMCM/PLL产生200MHz或300MHz。它保证了在不同电压、温度下每个tap的延时值是准确的。BUFG和BUFIO这是时钟缓冲器。rx_clk从引脚进来我们通常用BUFIO驱动它到IO区域专用的时钟网络供给IDDR原语使用因为BUFIO的抖动最小。同时再用BUFG驱动它到全局时钟网络供给FPGA内部逻辑如状态机使用。IDDR输入双沿寄存器这是执行双沿采样的核心。它内部有两个寄存器分别在时钟上升沿和下降沿锁存输入数据然后输出两个并行的单沿数据。整个rgmii_to_gmii模块的框图和数据流是这样的PHY引脚 - FPGA IO | v rgmii_rx_clk -- BUFIO -- IDDR.C (采样时钟) -- BUFG -- 内部逻辑时钟 | v rgmii_rx_data[3:0] -- IDELAYE2 (延时调整) -- IDDR.D (输入数据) | v rgmii_rx_ctl -- IDELAYE2 (延时调整) -- IDDR.D (输入控制) | v IDDR.Q1 (上升沿数据) -- 组合成 gmii_rx_data[7:0] IDDR.Q2 (下降沿数据) -- 组合成 gmii_rx_data[7:0] IDDR.Q1 (上升沿控制) -- 作为 gmii_rx_dv IDDR.Q2 (下降沿控制) -- 作为 gmii_rx_err (可选)3.3 关键代码与参数配置详解下面我给出一个针对Artix-7系列FPGA的核心代码片段并解释关键参数// 1. 时钟缓冲 BUFG BUFG_inst ( .I (rgmii_rx_clk), .O (rgmii_rx_bufg) // 给内部状态机用 ); BUFIO BUFIO_inst ( .I (rgmii_rx_clk), .O (rgmii_rx_bufio) // 给IDDR用抖动小 ); // 2. 延时控制校准器 (* IODELAY_GROUP rgmii_rx_group *) // 将相关单元分组 IDELAYCTRL IDELAYCTRL_inst ( .RDY (), // 校准完成信号可悬空或用于指示 .REFCLK (ref_clk_200m), // 必须来自MMCM的200MHz稳定时钟 .RST (1b0) // 复位上电后置0 ); // 3. 对rx_ctl信号进行延时 (* IODELAY_GROUP rgmii_rx_group *) IDELAYE2 #( .CINVCTRL_SEL (FALSE), .DELAY_SRC (IDATAIN), // 从IO引脚输入 .HIGH_PERFORMANCE_MODE (TRUE), // 减少抖动 .IDELAY_TYPE (FIXED), // 固定延时模式 .IDELAY_VALUE (14), // 关键初始延时tap值需根据板级调试确定 .PIPE_SEL (FALSE), .REFCLK_FREQUENCY (200.0), // 与IDELAYCTRL的参考时钟一致 .SIGNAL_PATTERN (DATA) ) IDELAYE2_rx_ctl ( .DATAOUT (rgmii_rx_ctl_delayed), .C (1b0), // FIXED模式下不需要 .CE (1b0), // FIXED模式下不需要 ... // 其他输入端口接地或置0 .IDATAIN (rgmii_rx_ctl) ); // 4. 对4位rx_data总线进行延时使用generate循环 genvar i; generate for (i0; i4; ii1) begin : rx_data_delay_gen (* IODELAY_GROUP rgmii_rx_group *) IDELAYE2 #( // 参数与上述IDELAYE2_rx_ctl类似 .IDELAY_TYPE (FIXED), .IDELAY_VALUE (14), // 通常与ctl使用相同的tap值 .REFCLK_FREQUENCY (200.0) ) IDELAYE2_rx_data ( .DATAOUT (rgmii_rx_data_delayed[i]), .IDATAIN (rgmii_rx_data[i]) // ... 其他连接 ); end endgenerate // 5. 双沿采样核心IDDR generate for (i0; i4; ii1) begin : rx_data_iddr_gen IDDR #( .DDR_CLK_EDGE (SAME_EDGE_PIPELINED), // 推荐模式输出对齐到同一时钟边沿 .INIT_Q1 (1b0), .INIT_Q2 (1b0), .SRTYPE (SYNC) ) IDDR_rx_data ( .Q1 (gmii_rx_data[i]), // 上升沿采到的位作为低4位 .Q2 (gmii_rx_data[i4]), // 下降沿采到的位作为高4位 .C (rgmii_rx_bufio), // 使用BUFIO的时钟 .CE (1b1), .D (rgmii_rx_data_delayed[i]), // 连接延时后的数据 .R (1b0), .S (1b0) ); end endgenerate // 6. 对控制信号同样进行双沿采样 IDDR #( .DDR_CLK_EDGE (SAME_EDGE_PIPELINED) ) IDDR_rx_ctl ( .Q1 (gmii_rx_dv), // 上升沿采到的是数据有效信号 .Q2 (gmii_rx_err), // 下降沿采到的是错误信号 .C (rgmii_rx_bufio), .CE (1b1), .D (rgmii_rx_ctl_delayed), .R (1b0), .S (1b0) );关键调试参数IDELAY_VALUE 这个值0-31不是随便设的。它需要根据你的具体PCB布线长度、PHY芯片型号来调整。我常用的方法是在硬件上电后通过一个简单的测试逻辑循环改变这个tap值同时发送固定的测试数据包如连续0xAA在FPGA内检查接收到的数据是否正确。找到能稳定接收数据的tap值范围然后取中间值。如果找不到可能需要调整ref_clk_200m的相位。4. 系统集成与调试让整个链路跑起来当rgmii_to_gmii模块和udp_gmii_rx模块都准备好后顶层模块的集成就是水到渠成的事情。但别急着庆祝调试阶段才是真正见功力的地方。4.1 顶层连接与时钟域处理顶层模块主要做三件事实例化并连接子模块将rgmii_to_gmii输出的gmii_rx_data、gmii_rx_dv和gmii_rx_clk即rgmii_rx_bufg连接到udp_gmii_rx模块的输入。处理PHY芯片复位很多PHY芯片如VSC8601要求上电后复位信号保持至少几毫秒的低电平。这个必须在顶层用计数器实现。提供用户接口将udp_gmii_rx模块输出的user_data_valid、user_data_out以及接收字节数rec_byte_num等信号引出连接到外部的FIFO或存储器控制器。这里要注意时钟域udp_gmii_rx模块内部的状态机应该使用gmii_rx_clk即125MHz的接收时钟作为驱动时钟。用户数据输出接口也在这个时钟域。如果你的应用逻辑工作在另一个时钟域如系统晶振的100MHz那么就需要在用户接口处添加一个异步FIFO来进行时钟域转换。4.2 仿真用ModelSim/QuestaSec验证逻辑在烧录到板子之前必须做充分的仿真。你需要编写一个testbench模拟PHY芯片的行为产生包含正确前导码、MAC头、IP头、UDP头和用户数据的RGMII时序信号。仿真要点双沿数据生成在testbench中要用(posedge clk)和(negedge clk)分别给rgmii_rx_data和rgmii_rx_ctl赋值模拟DDR行为。时钟相位为了模拟“非延时模式”可以让rgmii_rx_clk的边沿比数据变化晚四分之一周期90度相位。错误案例测试不仅要测正确包还要故意发送MAC地址错误、IP地址错误、CRC错误的包验证你的状态机是否能正确丢弃。检查输出观察user_data_valid和user_data_out是否与发送的用户数据完全一致且没有混入任何协议头信息。4.3 上板调试与ILA抓取真实波形仿真通过后就可以综合实现生成比特流下载到FPGA了。这时Xilinx的ILA集成逻辑分析仪是你最得力的助手。调试步骤连接物理链路用网线将FPGA板卡的RJ45接口与PC或网络交换机连接。确保PC的网卡和FPGA的PHY芯片都协商在千兆全双工模式通常看板载LED。添加ILA核在Vivado中添加一个ILA IP核将关键信号拉出来观察。我必看的信号有rgmii_rx_clk,rgmii_rx_data,rgmii_rx_ctl看物理层信号是否正常gmii_rx_data,gmii_rx_dv看转换后的8位数据是否连续状态机的curr_state看状态跳转是否符合预期user_data_valid,user_data_out看最终输出是否正确触发设置将ILA的触发条件设置为gmii_rx_dv的上升沿或者状态机进入USER_DATA状态。发送测试数据在PC上用网络调试助手如Packet Sender或自己写的Python脚本向FPGA板的IP地址发送一个已知内容的UDP包。分析波形首先看物理层应该能看到7个0x55和一个0xD5的前导码。然后看状态机应该依次经历PREAMBLE、ETH_HEADER、IP_HEADER、UDP_HEADER、USER_DATA。最后user_data_out上的数据应该和你从PC发送的数据完全一致。常见问题与排查收不到任何数据检查PHY芯片复位时序是否正确检查引脚约束文件XDC是否正确特别是rgmii_rx_clk是否约束到了全局时钟引脚用示波器或逻辑分析仪测量板卡RX引脚是否有信号。数据错位或乱码这几乎肯定是IDELAY_VALUE没调好。尝试在Vivado的Tcl控制台动态调整IDELAYE2的tap值如果配置为VARIABLE模式或者修改代码中的IDELAY_VALUE初始值重新编译测试。状态机卡在某个状态检查你的分段计数器逻辑和跳转条件。很可能是长度计算错误或者比较条件写成了“等于”而不是“大于等于”。仔细核对协议字段的解析代码。我在第一次调通这个模块时花了整整两天时间在调整IDELAY的tap值上。后来我写了一个简单的自动扫描脚本集成到FPGA里上电后自动寻找最优tap大大提高了不同板卡的兼容性。这个经验告诉我对于高速接口动态校准往往比固定值更可靠。

相关新闻

如何让GitHub界面秒变中文?5大核心功能助你高效协作

如何让GitHub界面秒变中文?5大核心功能助你高效协作

如何让GitHub界面秒变中文?5大核心功能助你高效协作 【免费下载链接】github-chinese GitHub 汉化插件,GitHub 中文化界面。 (GitHub Translation To Chinese) 项目地址: https://gitcode.com/gh_mirrors/gi/github-chinese 当开发者面对GitHub满…

2026/5/17 6:22:36 阅读更多 →
NS-USBLoader:Switch游戏高效管理的全流程工具

NS-USBLoader:Switch游戏高效管理的全流程工具

NS-USBLoader:Switch游戏高效管理的全流程工具 【免费下载链接】ns-usbloader Awoo Installer and GoldLeaf uploader of the NSPs (and other files), RCM payload injector, application for split/merge files. 项目地址: https://gitcode.com/gh_mirrors/ns/n…

2026/7/3 2:39:29 阅读更多 →
GTE模型与Elasticsearch集成:构建全文检索系统

GTE模型与Elasticsearch集成:构建全文检索系统

GTE模型与Elasticsearch集成:构建全文检索系统 1. 引言 想象一下,你正在开发一个电商搜索系统,用户输入"适合夏天穿的轻薄透气衬衫",传统的关键词匹配可能只能找到包含"夏天"、"轻薄"、"透气…

2026/7/2 22:47:13 阅读更多 →

最新新闻

3分钟解锁网易云音乐:NCM转MP3的完全免费解决方案

3分钟解锁网易云音乐:NCM转MP3的完全免费解决方案

3分钟解锁网易云音乐:NCM转MP3的完全免费解决方案 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 你是否曾经遇到过这样的尴尬:在网易云音乐下载了心爱的歌曲,却只能在特定App里播放?车…

2026/7/5 10:15:07 阅读更多 →
RK3576芯片架构与AIoT应用开发全解析

RK3576芯片架构与AIoT应用开发全解析

1. RK3576/RK3576J芯片架构解析 Rockchip RK3576系列是瑞芯微面向AIoT和工业市场推出的高性能应用处理器,采用"44"大小核设计: 4个Cortex-A72性能核心2.2GHz(工业版2.1GHz) 4个Cortex-A53能效核心2.0GHz(工…

2026/7/5 10:15:07 阅读更多 →
RK3588核心板硬件架构与AI加速技术解析

RK3588核心板硬件架构与AI加速技术解析

1. RK3588核心板的硬件架构解析 作为当前ARM架构中的旗舰级SoC,RK3588采用了创新的"44"大小核设计。具体由4个Cortex-A76性能核心(主频2.4GHz)和4个Cortex-A55能效核心(主频1.8GHz)组成,这种组合…

2026/7/5 10:15:07 阅读更多 →
昂瑞微OM662X低功耗蓝牙SoC芯片解析与应用指南

昂瑞微OM662X低功耗蓝牙SoC芯片解析与应用指南

1. 昂瑞微OM662X系列芯片概述 OM662X系列是昂瑞微电子推出的低功耗蓝牙SoC产品线,专为物联网终端设备设计。这个系列目前包含OM6621、OM6626和最新发布的OM6629三款主力型号,采用ARM Cortex-M0/M4双核架构,在保持超低功耗特性的同时&#xff…

2026/7/5 10:15:07 阅读更多 →
ALU性能演进史:从74181芯片到现代CPU的并行计算单元

ALU性能演进史:从74181芯片到现代CPU的并行计算单元

ALU性能演进史:从74181芯片到现代CPU的并行计算单元在计算机体系结构的漫长发展历程中,算术逻辑单元(ALU)作为CPU的核心执行部件,其技术演进直接反映了计算能力的跃迁。从早期只能处理4位运算的独立集成电路,到今天多核处理器中高…

2026/7/5 10:13:06 阅读更多 →
铷原子频率标准:高精度时间同步的核心技术解析

铷原子频率标准:高精度时间同步的核心技术解析

1. 铷原子频率标准:数字时代的隐形基石在煤矿井下,46台5G基站正在以微秒级精度同步工作,确保巡检机器人传回的瓦斯浓度数据不会因为时间偏差而误判;证券交易所里,高频交易系统依赖纳秒级时间戳维持着公平的交易顺序&am…

2026/7/5 10:11:05 阅读更多 →

日新闻

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱,支持下载视频、番剧等等各类资源 项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliTools …

2026/7/5 0:03:34 阅读更多 →
威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型的陌生现状在忙碌疲惫的一天里,参与了关于混合后量子密码学的讨论,应付端点攻击找茬的人,还参与留言板讨论后,发现“威胁模型”对多数人仍是陌生概念,且多被当作时髦用语。有趣的相关画作有一幅由 Embyr 创作的…

2026/7/5 0:03:34 阅读更多 →
渗透测试入门指南:从零基础到实战环境搭建

渗透测试入门指南:从零基础到实战环境搭建

1. 从“看热闹”到“入门”:我理解的渗透测试到底是什么?每次看到新闻里说某个大公司的数据被“黑”了,或者某个网站被攻击导致服务瘫痪,你是不是和我一样,心里会冒出两个念头:一是“这黑客真厉害”&#x…

2026/7/5 0:07:38 阅读更多 →

周新闻

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱,支持下载视频、番剧等等各类资源 项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliTools …

2026/7/5 0:03:34 阅读更多 →
威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型的陌生现状在忙碌疲惫的一天里,参与了关于混合后量子密码学的讨论,应付端点攻击找茬的人,还参与留言板讨论后,发现“威胁模型”对多数人仍是陌生概念,且多被当作时髦用语。有趣的相关画作有一幅由 Embyr 创作的…

2026/7/5 0:03:34 阅读更多 →
渗透测试入门指南:从零基础到实战环境搭建

渗透测试入门指南:从零基础到实战环境搭建

1. 从“看热闹”到“入门”:我理解的渗透测试到底是什么?每次看到新闻里说某个大公司的数据被“黑”了,或者某个网站被攻击导致服务瘫痪,你是不是和我一样,心里会冒出两个念头:一是“这黑客真厉害”&#x…

2026/7/5 0:07:38 阅读更多 →

月新闻