网络抓包分析工具

摘要

随着网络技术的快速发展,网络数据的传输和处理变得日益复杂。网络抓包分析工具作为网络故障排查、性能优化以及安全审计的重要工具,对于提升网络管理的效率和准确性具有重要意义。本文旨在设计并实现一款高效、易用的网络抓包分析工具,以满足现代网络管理的需求。
在工具设计方面,本文首先对网络抓包的基本原理和常用技术进行了深入研究,包括数据包捕获、数据展示等关键环节。基于这些原理和技术,本文提出了一种基于多线程和异步处理的数据包捕获机制,以提高抓包效率和响应速度。同时,工具还采用了模块化的设计思想,使得协议解析和数据展示等功能可以灵活扩展和定制。
在实现过程中,本文利用Java编程语言和Jnetpcap,完成了网络抓包分析工具的编码工作。工具实现了对多种网络协议(如TCP、UDP等)的解析功能,并能够以直观的方式展示数据包的结构和内容。此外,工具还提供了丰富的过滤功能,方便用户快速定位和分析目标数据包。
通过实际测试和应用,本文设计的网络抓包分析工具表现出了良好的性能和稳定性。在抓包速度、解析精度以及用户体验等方面均达到了预期目标。该工具不仅为网络管理人员提供了有力的支持,也为网络技术的研究和发展提供了有价值的参考。
关键词:网络抓包工具;数据包捕获;数据包分析;数据包存储;TCP; UDP;

结构安排

本文主要围绕网络抓包分析工具的设计与实现展开论述。全文结构分为七个部分,具体如下:
(1)绪论:介绍网络抓包技术的基本概念、发展历程及其在网络安全、网络游戏等领域的重要作用,明确本文的研究目的和意义。
(2)相关技术:阐述网络抓包技术所涉及的关键技术,包括Jnetpcap技术、Java Swing技术、IO流等,为理解网络抓包分析工具的实现奠定基础。
(3)需求分析:详细分析本网络抓包分析工具的功能需求、性能需求和安全需求,为后续设计与实现提供依据。
(4)工具设计:基于上述技术原理,详细设计网络抓包分析工具的整体架构、功能模块及其交互方式,明确各模块的功能和实现方法。
(5)工具实现:介绍网络抓包分析工具的具体实现过程,包括关键代码编写、调试和优化,以及如何利用HOOK技术、DLL技术等实现对网络数据的拦截和分析。
(6)测试与分析:通过实际案例展示网络抓包分析工具在网络安全、网络游戏等方面的应用,验证工具的有效性和实用性。
(7)结论与展望:总结全文,阐述网络抓包分析工具的研究成果和价值,并对未来发展趋势进行展望。
本文旨在为网络抓包技术的研究和应用提供理论依据和实践指导,通过对网络抓包分析工具的设计与实现,进一步推动网络抓包技术在各个领域的广泛应用。

需求概述

网络数据包分析工具要实现五个功能, 数据包的捕获、数据包的解析、数据包信息分析和数据包的信息显示以及数据存储。数据包的捕获和解析是系统的基础部分, 数据包信息的分析和显示是对数据的处理部分。五个模块相互协调共同对当前主机的网络数据包进行分析。
在这里插入图片描述

数据包解析需求分析

数据包解析需求分析的关键在于确定所需捕获的网络数据包类型。一般来说,需要关注以下几种数据包类型:

  1. 网络层数据包:主要包括 IP、ICMP、IGMP 等协议的数据包,这些数据包承载了网络层以上的协议数据,是网络通信的基础。
  2. 传输层数据包:主要包括 TCP 和 UDP 协议的数据包。TCP 数据包具有可靠的数据传输特性,而 UDP 数据包则具有较低的传输延迟。捕获这些数据包有助于分析网络应用的传输性能和可靠性。
  3. 应用层数据包:包括 HTTP、FTP、DNS 等常见网络应用协议的数据包。分析这些数据包可以深入了解网络应用的运行状态、性能瓶颈以及潜在的安全问题。
  4. 特殊协议数据包:例如 ARP、RARP、ICMP 等,这些数据包在特定场景下具有重要价值,如 ARP 攻击分析、网络故障诊断等。
    在数据包解析过程中,需要提取有价值的信息,如源地址、目的地址、端口号、协议类型等。这些信息将有助于对网络流量进行分类、统计和分析。
    此外,针对不同场景和需求,根据预设的条件,筛选出符合条件的数据包。例如,可以设置过滤特定主机、特定端口、特定协议等。对捕获的数据包进行深入解析,如解析 HTTP 请求内容、FTP 文件传输过程等。
    数据包信息显示需求分析
    数据包显示内容应涵盖以下几个关键要素:时间戳、源地址、目的地址、协议类型、数据包长度、发送速率等。这些信息有助于用户快速了解数据包的基本情况,从而进行更深入的分析。此外,为了方便用户识别,数据包中的关键字段(如源地址、目的地址等)应支持颜色标注、字体加粗等视觉提示。
    数据包信息的展示方式应直观易懂。一种有效的方式是采用分层次展示策略,将数据包按照时间顺序、协议类型等进行分类,便于用户快速定位感兴趣的数据包。此外,支持数据包列表和详细信息两种展示模式,让用户在需要时能够方便地切换查看方式。对于复杂的数据包分析,提供图表统计功能,如协议占比、速率分布等,以帮助用户快速了解网络状况。
    在用户交互方面,设计应注重易用性。提供直观的过滤和排序功能,让用户能够根据需求筛选和排序数据包。支持多种数据包视图,如原始数据、二进制数据等,以满足不同用户的分析需求。

数据包信息分析需求分析

抓包工具应当具备对捕获的数据包进行深度分析的能力,并能提供一系列详尽的指标数据,以便用户全面了解网络传输的详细情况。这些指标数据包括但不限于数据包的总数,即捕获到的数据包的总量;错误包数,即在传输过程中出现错误或异常的数据包数量;以及速率,即数据包传输的速率,这可以反映出网络的繁忙程度和传输效率。通过这些数据的呈现,用户能够更为精准地评估网络性
能,及时发现并解决潜在问题。

用户管理需求分析

用户使用本抓包工具抓取到的数据包需要存储在各自用户独立拥有的文件内,而不是所有用户共享所有抓取到的网络数据包,这就需要辨别出每次使用此抓包工具的用户。
用户在注册界面提交自己的相关注册信息来实现用户账号以及本地文件夹的生成,为后续相关操作提供相关权限。用户通过输入正确的用户名和密码来访问其个人账户。

数据包信息存储需求分析

存储需求应满足多样性。由于网络数据包涉及多种协议,如TCP、UDP、ICMP等,存储结构应能兼容这些协议的相关信息。同时,存储结构应具备可扩展性,以便在未来添加新的协议或功能时能方便地进行调整。
数据包信息的存储应具备高效性。在存储过程中,尽量减少数据包的处理时间,提高抓包工具的性能。这可以通过优化存储算法、使用快速的数据结构以及高效的数据存储格式等方式实现。
存储需求应具备良好的兼容性。抓包工具需要支持多种操作系统和平台,如Windows、Linux、Mac等。因此,存储结构应能适应不同操作系统的特点,确保数据包信息的完整性和准确性。
数据包存储需求还应考虑安全性。在存储过程中,应对数据包进行加密处理,以防止数据泄露和篡改。同时,加密算法应具备较高的性能,以平衡安全性和存储效率。

系统模块划分

网络抓包分析工具的设计与实现主要包括四个模块:网络抓包模块、数据解析模块、数据分析模块和可视化模块。
网络抓包模块是整个系统的核心部分,负责实时捕获网络流量中的数据包。该模块采用WinPcap库作为基础,通过socket接口与底层网络设备进行通信,实现对数据包的捕获。在此过程中,模块需要处理多种网络协议,如TCP、UDP、ARP等,并实现对数据包的解析,提取出感兴趣的信息。
数据解析模块负责对捕获到的数据包进行深入分析。该模块主要包括两个部分:一是协议解析,将数据包从原始二进制数据转换为可读的协议数据单元,如IP、TCP、UDP等;二是内容解析,提取出数据包中的关键信息,如源地址、目的地址、端口号、数据 payload 等。
数据分析模块对解析后的数据进行处理和分析。该模块主要包括数据统计、趋势分析、异常检测等功能。通过这些功能,用户可以快速了解网络流量的整体状况,发现潜在的问题和风险。
可视化模块将分析结果以图表和报表的形式展示给用户。该模块支持多种可视化方式,如折线图、柱状图、饼图等,帮助用户直观地了解网络状况,从而做出合理的决策。
系统的总体模块图如下图4.1所示:
在这里插入图片描述
在这里插入图片描述

系统实现

数据包捕获模块实现
数据包捕获模块依赖于操作系统提供的网络接口驱动程序来实现。使用Jnetpcap来捕获网络数据包。通过Jnetpcap,可以实现对网络数据包的捕获和解析。
为了确保捕获到的数据包完整且准确,我们需要在捕获过程中对数据包进行过滤。过滤模块根据预先设定的条件,如IP地址、端口号、协议类型等,对捕获到的数据包进行筛选。只有满足条件的数据包才会被送往后续处理模块进行分析。
关键代码如下:

public Pcap startCap(JPanel contentPane,int netInterface,String filterExpre) {PcapIf devIf = allDevs.get(netInterface);// 截取长度不超过数据报max 65535int snaplen = 64 * 1024; // 混杂模式,抓取所有数据包int flags = Pcap.MODE_PROMISCUOUS; int timeout = 1 * 1000; // 超时Pcap pcap = Pcap.openLive(devIf.getName(), snaplen, flags, timeout,errbuf);if (pcap == null) {JOptionPane.showMessageDialog(contentPane,"Error while opening device for capture: "+errbuf.toString(),"错误 ",0);return null;}String msgString;if(!filterExpre.equals(""))msgString = this.setFilter(pcap, filterExpre);else {msgString="ok";}if(msgString!="ok") {JOptionPane.showMessageDialog(contentPane,msgString,"错误 ",0);}

数据包解析模块实现
数据包解析模块支持多种网络协议,如 IP、TCP、UDP、HTTP、DNS 等。对于不同协议的数据包,模块会根据协议特点进行针对性解析。例如,对于 IP 数据包,模块可以提取源 IP 地址、目的 IP 地址、协议类型等信息;对于 TCP 数据包,模块可以提取源端口、目的端口、序列号、确认号等信息;对于 HTTP 数据包,模块可以提取请求方法、URL、请求头、请求体等信息。关键代码如下:

// 根据协议类型,设置协议字段(objects[2])
if (packet.hasHeader(Ethernet.ID)) {// 解析Ethernet,获取MAC地址Ethernet ethernet = packet.getHeader(new Ethernet());objects[4] = AddressUtil.macBytesToString(ethernet.source());objects[7] = AddressUtil.macBytesToString(ethernet.destination());
}
if (packet.hasHeader(Ip4.ID)) {// 解析IP,获取IP地址Ip4 ip = packet.getHeader(new Ip4());objects[2] = "ip4";objects[5] = AddressUtil.ipBytesToString(ip.source());objects[8] = AddressUtil.ipBytesToString(ip.destination());
}
if (packet.hasHeader(Ip6.ID)) {// 解析IP,获取IP地址Ip6 ip = packet.getHeader(new Ip6());objects[2] = "ip6";objects[5] = AddressUtil.ipBytesToString(ip.source());objects[8] = AddressUtil.ipBytesToString(ip.destination());
}
if (packet.hasHeader(Tcp.ID)) {// 解析TCP,获取端口号Tcp tcp = packet.getHeader(new Tcp());objects[2] = "tcp";objects[6] = tcp.source();objects[9] = tcp.destination();
}
if (packet.hasHeader(Udp.ID)) {// 解析UDP,获取端口号Udp udp = packet.getHeader(new Udp());objects[2] = "udp";objects[6] = udp.source();objects[9] = udp.destination();
}
if (packet.hasHeader(new Arp())) {// 解析Arp,获取源ip和目的ipobjects[2] = "arp";Arp arp = packet.getHeader(new Arp());objects[5] = AddressUtil.ipBytesToString(arp.spa());objects[8] = AddressUtil.ipBytesToString(arp.tpa());
}
if (packet.hasHeader(Icmp.ID)) { 	objects[2] = "icmp";}

数据包信息显示模块实现
展示捕获到的数据包,包括数据包序号、时间、发送方和接收方IP地址等信息。用户可以在这里查看各个数据包的详细信息。为了提高用户体验,还设计了实时更新功能,当有新的数据包被捕获时,模块会自动更新显示列表,确保用户能够实时查看最新的数据包信息。核心代码如下:

FlatIntelliJLaf.setup();
MainFrame frame = new MainFrame();
frame.setVisible(true);
public MainFrame() {
setTitle("网络抓包");
// 获取网卡即描述信息
allDevs = netCap.getDevList();
descList = this.netCap.getDescList();
//设置窗口的默认操作
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setBounds(100, 100, 920, 550);
contentPane = new JPanel();
contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
setContentPane(contentPane);
contentPane.setLayout(new BorderLayout(0, 0));
}
panel = new JPanel();
contentPane.add(panel, BorderLayout.NORTH);
panel.setLayout(new FormLayout(new ColumnSpec[] { FormSpecs.LABEL_COMPONENT_GAP_COLSPEC,ColumnSpec.decode("45px"), ColumnSpec.decode("352px"), ColumnSpec.decode("59px"),ColumnSpec.decode("78px"), ColumnSpec.decode("95px"), FormSpecs.RELATED_GAP_COLSPEC,FormSpecs.DEFAULT_COLSPEC, FormSpecs.RELATED_GAP_COLSPEC, ColumnSpec.decode("max(7dlu;default)"),ColumnSpec.decode("128px"), }, new RowSpec[] { RowSpec.decode("23px"), }));

数据包显示实现效果如下图4.6所示:
在这里插入图片描述
数据包信息分析模块实现
数据分析功能通过统计功能以及用户自定义的过滤器实现。例如,用户可以分析某个IP地址的流量分布,找出异常流量并采取相应措施。此外,通过将抓取到的数据包保存为PCAP文件,用户可以在后续时间进行分析,方便进行故障排查和性能优化。数据包信息分析模块可以帮助用户更好地理解网络流量,发现并解决潜在问题,提高网络性能。
TCP协议的数据包,其结构包含多个字段。以下是TCP协议各字段的详细解析:
源端口:表示发送方的端口号,范围为0-65535。
目的端口:表示接收方的端口号,范围与源端口相同。
序列号:用于标识TCP流中发送的字节的起始位置。TCP连接中传送的数据流中的每一个字节都编上一个序号,序号字段的值则指的是本报文段所发送的数据的第一个字节的序号。
确认号:表示期望收到对方的下一个报文段的数据的第一个字节的序号。
数据偏移:表示TCP头部长度,以32位字为单位。
保留字段:当前未使用,为未来使用而保留。
控制位:包含多个控制标志,如URG(紧急)、ACK(确认)、PSH(推送)、RST(重置)、SYN(同步)、FIN(终止)等。
窗口大小:用于实现TCP的流量控制。它告诉对方本端的接收窗口大小,单位是字节。
校验和:用于校验TCP头部和数据的完整性。发送端计算校验和,接收端进行验证。
紧急指针:当URG控制位被设置时,该字段有效,指出紧急数据在TCP数据部分的偏移量。
选项:TCP头部可以包含可选项,用于支持额外的功能或参数。常见的选项包括最大段大小(MSS)、窗口扩大因子、时间戳等。
数据:这是TCP报文段的主要部分,包含要传输的实际数据。其长度受MTU(最大传输单元)和窗口大小的限制。
TCP协议分析核心代码如下:

StringBuilder builder = new StringBuilder();
builder.append(parseEthernet());
if(packet.hasHeader(Ip4.ID))builder.append(parseIp());
else {builder.append(parseIp6());
}
Tcp tcp = packet.getHeader(new Tcp());
builder.append("------------------Tcp------------------\n");
builder.append("源端口(2字节):" + tcp.source() + "\n");
builder.append("目的端口(2字节):" + tcp.destination() + "\n");
builder.append("序号(4字节):" + tcp.seq() + "\n");
builder.append("确认号(4字节):" + tcp.ack() + "\n");
builder.append("数据偏移(4位)[首部长度]:" + tcp.hlen() + " [ 4 bytes ]\n");
builder.append("保留(6位):" + tcp.reserved() + "\n");
builder.append("紧急URG(1位):" + boolToInt(tcp.flags_URG()) + "\n");
builder.append("确认ACK(1位)[1-确认号有效]:" + boolToInt(tcp.flags_ACK()) + "\n");
builder.append("推送PSH(1位):" + boolToInt(tcp.flags_PSH()) + "\n");
builder.append("复位RST(1位):" + boolToInt(tcp.flags_RST()) + "\n");
builder.append("同步SYN(1位):" + boolToInt(tcp.flags_SYN()) + "\n");
builder.append("终止FIN(1位):" + boolToInt(tcp.flags_FIN()) + "\n");
builder.append("窗口(2字节):" + tcp.window() + "\n");
builder.append("检验和(2字节):" + tcp.checksum() + "\n");
builder.append("紧急指针(2字节)[URG=1时有意义]:" + tcp.urgent() + "\n\n");
return builder.toString();

在这里插入图片描述
UDP是计算机网络中的一种无连接的传输层协议,它为应用程序提供了一种无需建立连接就可以发送封装的原始IP数据报的方法。以下是UDP协议数据包各字段解析:
源端口:表示发送方的端口号,用于标识发送应用程序。
目的端口:表示接收方的端口号,用于标识接收应用程序。
长度:表示UDP头部和UDP数据的总长度(以字节为单位)。
校验和:用于验证UDP头部和数据的完整性。发送方计算校验和,接收方进行验证。如果校验和不匹配,则数据报会被丢弃。
UDP协议分析核心代码如下:

StringBuilder builder = new StringBuilder();
builder.append(parseEthernet());
if(packet.hasHeader(Ip4.ID))builder.append(parseIp());
else {builder.append(parseIp6());
}
Udp udp = packet.getHeader(new Udp());
builder.append("------------------Udp------------------\n");
builder.append("源端口(2字节):" + udp.source() + "\n");
builder.append("目的端口(2字节):" + udp.destination() + "\n");
builder.append("长度(2字节)[整个UDP数据报长度]:" + udp.length() + "\n");
builder.append("检验和(2字节):" + udp.checksum() + "\n\n");
return builder.toString();

在这里插入图片描述
ARP是用于将网络层的32位IP地址解析为数据链路层的48位MAC地址的协议。以下是ARP协议报文各字段的解析:
硬件类型:标识ARP报文所使用的硬件地址类型。
协议类型:标识ARP报文所映射的协议地址类型。
硬件地址长度:标识硬件地址的字节长度。
协议地址长度:标识协议地址的字节长度。
操作码:标识ARP报文的类型。常见的操作码有: ARP请求,ARP应答,RARP请求,RARP应答。
发送方硬件地址:标识发送ARP报文的主机的硬件地址。
发送方协议地址:标识发送ARP报文的主机的协议地址(如IP地址)。
目标硬件地址:标识ARP报文所请求解析的硬件地址。
目标协议地址:标识ARP报文所请求解析的协议地址。

ARP协议分析核心代码如下:

StringBuilder builder = new StringBuilder();
builder.append(parseEthernet());
Arp arp = packet.getHeader(new Arp());
builder.append("------------------Arp------------------\n");
builder.append("硬件类型(2字节):" + arp.hardwareType() + " [ " + arp.hardwareTypeDescription() + " ] \n");
builder.append("协议类型(2字节):" + arp.protocolType() + " [ " + arp.protocolTypeDescription() + " ] \n");
builder.append("硬件地址长度(1字节):" + arp.hlen() + " [ bytes ] \n");
builder.append("协议长度(1字节):" + arp.plen() + " [ bytes ] \n");
builder.append("操作类型op(2字节):" + arp.operation() + " [ " + arp.operationDescription() + " ] \n");
builder.append("发送方MAC(6字节):" + AddressUtil.macBytesToString(arp.sha()) + "\n");
builder.append("发送方Ip(4字节):" + AddressUtil.ipBytesToString(arp.spa()) + "\n");
builder.append("接收方MAC(6字节):" + AddressUtil.macBytesToString(arp.tha()) + "\n");
builder.append("接收方Ip(4字节):" + AddressUtil.ipBytesToString(arp.tpa()) + "\n\n");

在这里插入图片描述
ICMP是TCP/IP协议族的一个子协议,用于在IP主机、路由器之间传递控制消息。ICMP协议对于网络诊断非常有用,例如用于检测网络是否通畅、路由是否可用等。以下是ICMP报文各字段的解析:
类型:标识ICMP报文的类型。
代码:对于某些ICMP报文类型,代码字段提供了额外的信息。不是所有的ICMP报文类型都使用代码字段,对于某些类型,该字段的值被设置为0。
校验和:用于检测ICMP报文在传输过程中是否发生错误。
标识符:用于标识ICMP请求和应答之间的关联。
序列号:用于标识ICMP报文的一个序列号。
数据:包含与ICMP报文类型相关的数据。不同的ICMP报文类型可能有不同的数据格式和长度。
ICMP协议分析核心代码如下:

StringBuilder builder = new StringBuilder();
builder.append(parseEthernet());
if(packet.hasHeader(Ip4.ID))builder.append(parseIp());
else {builder.append(parseIp6());
}
Icmp icmp = packet.getHeader(new Icmp());
builder.append("------------------Icmp------------------\n");
builder.append("类型(8位):" + icmp.type() + " [ " + icmp.typeDescription() + "] \n");
builder.append("代码(8位):" + icmp.code() + " \n");
builder.append("检验和(16位):" + icmp.checksum() + " \n");
builder.append("标识符(16位):" + icmp.getId() + "\n\n");
return builder.toString();

在这里插入图片描述
用户登录注册模块实现
用户使用登录功能,输入用户账户账号和密码,当用户点击登录按钮,会触发单击事件,执行get方法,将输入的账户和密码写入JavaBean,通过与数据库user表中的name与pwd字段比较,若登录的用户存在,则登录成功。
核心代码如下所示:

User user = new User(username,password);
IUserService userService = new UserServiceImpl();
User userCheck = userService.check(user);
if (userCheck!= null) {userCausal = userCheck;JOptionPane.showMessageDialog(contentPane, "登录成功!", "提示", JOptionPane.PLAIN_MESSAGE);
}else{JOptionPane.showMessageDialog(contentPane, "没有此用户请先注册", "提示", JOptionPane.PLAIN_MESSAGE);
}

在这里插入图片描述
用户使用注册功能,输入注册账户的账号名和密码,当用户点击注册按钮,
会触发单机事件,执行get方法,将输入的账户和密码写入JavaBean,通过与数据库user表中的name字段比较,若注册的用户不存在,则向数据库user表加入待注册用户数据,并在本地为此用户创建文件夹,注册成功。
核心代码如下:

if(username!=null && password!=null && !username.equals("") && !password.equals("")){User user = new User(username,password);IUserService userService = new UserServiceImpl();userService.save(user);File file = new File("E:\\Data\\"+username);
if(!file.exists()){file.mkdir();
}JOptionPane.showMessageDialog(contentPane, "用户注册成功!", "提示", JOptionPane.PLAIN_MESSAGE);
}

在这里插入图片描述
数据包信息存储模块实现
在本工具中,采用 Java的IO流来实现数据包的存储。具体来说,将解析后的数据包信息拼接成字符串进行存储。
在抓取数据包后,在服务端生成数据包的临时文件
关键代码如下

String data = "序号:" + objects[0] + "" +",时间:" + objects[1] +",类别:" + objects[2] +",长度:" + objects[3] +",源MAC:" + objects[4] +",源IP:" + objects[5] +",源端口:" + objects[6] +",目的MAC:" + objects[7] +",目的IP:" + objects[8] +",目的端口:" + objects[9] + "\r\n";FileUtils.write(new File("data1.txt"), data, "UTF-8", true);

在这里插入图片描述

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

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

相关文章

期末测试一

字符数组的排序注意的问题 &#xff1a; 1.对于输入字符的时候 如果给出了要输入几个字符 n >>>>> for ( i 0 ; i < n ;i ) { scanf("%c",&ch); } 如果说直到输入到换行符结束 >>>>>>while ( ch! \ n ) 这个需要额…

CSS|04 复合选择器伪类选择器属性选择器美化超链接

基本选择器&#xff1a;见上篇基本选择器 复合选择器选择器1,选择器2{属性:值;} 多元素选择器&#xff0c;同时匹配选择器1和选择器2&#xff0c;多个选择器之间用逗号分隔举例&#xff1a; p,h1,h2{margin:0px;}E F{属性:值;} 后代元素选择器&#xff0c;匹配所有属于E元素后…

基于长短时记忆网络LSTM的TE过程故障诊断(MATLAB R2021B)

实验所用 TE 仿真过程的数据集是网上公开的数据集&#xff0c;该数据集中的训练集和测试集分别包含 20 种故障工况和一种正常工况数据&#xff0c;其中所采集的每个样本信号包含 41 个测量变量和 11 个控制变量&#xff0c;所以每个时刻采集到的样本有 52 个观测变量。 TE 仿真…

NoSQL之Redis配置与管理

目录 一、关系型数据库和非关系型数据库 1.关系型数据库 2.非关系型数据库 3.关系型数据库和非关系型数据库区别 二、Redis 1.Redis简介 2.Redis 的优点 3.Redis 使用场景 4.Redis的数据类型 5.哪些数据适合放入缓存中&#xff1f; 6.Redis为什么这么快&#xff1f;…

ActiveMQ camel

游览器输入地址: http://127.0.0.1:8161/admin/ 访问activemq管理台 账号和密码默认为: admin/admin# yml配置的密码也是如下的密码 activemq:url: failover:(tcp://localhost:61616)username: adminpassword: adminComponent public class ActiveMqReceiveRouter extends Rout…

AudioLM音频生成模型

GPT-4o (OpenAI) AudioLM&#xff08;Audio Language Model&#xff09;是一种生成音频的深度学习模型。它可以通过学习语言模型的结构来生成连贯和高质量的音频信号。这类模型通常应用于语音合成、音乐生成和音频内容生成等领域。以下是一些与AudioLM相关的核心概念和技术细…

【JavaEE进阶】Spring AOP使用篇

目录 1.AOP概述 2.SpringAOP快速入门 2.1 引入AOP依赖 2.2 编写AOP程序 3. Spring AOP详解 3.1 Spring AOP 核心概念 3.1.1切点(Pointcut) 3.1.2 连接点 (Join Point) 3.1.3 通知(Advice) 3.1.4 切面(Aspect) 3.2 通知类型 3.3PointCut 3.4 切面优先级 3.5 切点表…

基于经典滑膜控制的永磁同步电机调速系统MATLAB仿真

滑膜控制器 取PMSM状态变量为&#xff1a; ωref为目标转速&#xff0c;ωm为电机输出转速。将此式求导得&#xff1a; 定义系统滑模面函数为&#xff1a; 对滑模面函数求导 在电机实际控制时&#xff0c;滑模控制方法存在高频抖振问题&#xff0c;则需要选取合适的指数趋近率…

web前端——css(一篇教会网页制作)

目录 一、基本语法 1.行内样式表 2.内嵌样式表 3.外部样式表 二、选择器 1.标签选择器 2.类选择器 3.id 选择器 4.通配选择器 三、常见修饰 1.文本 2.背景 3.列表 4.伪类 5.透明度 6.块级、行级、行级块标签 7.div 和 span 四、盒子模型&#xff08;重点&…

【PostgreSQL】守护数据安全:事务与数据完整性管理

目录 事务管理&#xff1a;确保操作的原子性 事务的概念与重要性 事务的启动与提交 事务的回滚&#xff08;ROLLBACK&#xff09;&#xff08; 数据一致性与隔离级别 隔离级别的解释 设置隔离级别 错误处理与事务的高级策略 异常处理&#xff08;SAVEPOINT & EXCE…

25届最近5年重庆邮电大学自动化考研院校分析

重庆邮电大学 目录 一、学校学院专业简介 二、考试科目指定教材 三、近5年考研分数情况 四、近5年招生录取情况 五、最新一年分数段图表 六、历年真题PDF 七、初试大纲复试大纲 八、学费&奖学金&就业方向 一、学校学院专业简介 二、考试科目指定教材 1、考试…

[数据集][目标检测]电缆钢丝绳线缆缺陷检测数据集VOC+YOLO格式1800张3类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;1800 标注数量(xml文件个数)&#xff1a;1800 标注数量(txt文件个数)&#xff1a;1800 标注…

单例模式(下)

文章目录 文章介绍步骤安排及单例讲解step1&#xff1a;注册单例类型&#xff08;main.cpp&#xff09;step2&#xff1a;定义类和私有构造函数&#xff08;keyboardinputmanager.h&#xff09;step3:&#xff08;keyboardinputmanager.cpp&#xff09;step4&#xff1a;在qml中…

【2024最新华为OD-C/D卷试题汇总】[支持在线评测] 特殊加密算法(200分) - 三语言AC题解(Python/Java/Cpp)

&#x1f36d; 大家好这里是清隆学长 &#xff0c;一枚热爱算法的程序员 ✨ 本系列打算持续跟新华为OD-C/D卷的三语言AC题解 &#x1f4bb; ACM银牌&#x1f948;| 多次AK大厂笔试 &#xff5c; 编程一对一辅导 &#x1f44f; 感谢大家的订阅➕ 和 喜欢&#x1f497; &#x1f…

Rust 跨平台-Android 和鸿蒙 OS

1. 安装 rustup rustup 是 Rust 的安装和版本管理工具 $ curl --proto https --tlsv1.2 https://sh.rustup.rs -sSf | sh 该命令会安装 rusup 和最新的稳定版本的 Rust&#xff1b;包括&#xff1a; rustc Rust 编译器&#xff0c;用于将 Rust 代码编译成可执行文件或库。 ca…

技术速递|Visual Studio Code 的 .NET MAUI 扩展现已正式发布

作者&#xff1a;Maddy Montaquila 排版&#xff1a;Alan Wang 今天&#xff0c;我们非常高兴地宣布 .NET MAUI VS Code 扩展插件结束了预览阶段&#xff0c;并将包含一些期待已久的新功能 - 包括 XAML IntelliSense 和 Hot Reload&#xff01; 什么是 .NET MAUI 扩展插件&…

GuLi商城-商品服务-API-三级分类-删除-页面效果

一步步学习Vue太慢了&#xff0c;准备跳过前端的学习&#xff0c;直接使用前端完整的项目 下载依赖npm install&#xff0c;会报错&#xff0c;排查了好久 我安装的是Node14&#xff0c;所以必须要安装4.14 Vscode终端输入&#xff1a;npm install node-sass4.14 输入&#x…

【博士每天一篇文献-综述】A survey on few-shot class-incremental learning

阅读时间&#xff1a;2023-12-19 1 介绍 年份&#xff1a;2024 作者&#xff1a;田松松&#xff0c;中国科学院半导体研究所&#xff1b;李璐思&#xff0c;老道明大学助理教授&#xff1b;李伟军&#xff0c;中国科学院半导体研究所AnnLab&#xff1b; 期刊&#xff1a; Neu…

LearnOpenGL - Android OpenGL ES 3.0 使用 FBO 进行离屏渲染

系列文章目录 LearnOpenGL 笔记 - 入门 01 OpenGLLearnOpenGL 笔记 - 入门 02 创建窗口LearnOpenGL 笔记 - 入门 03 你好&#xff0c;窗口LearnOpenGL 笔记 - 入门 04 你好&#xff0c;三角形OpenGL - 如何理解 VAO 与 VBO 之间的关系LearnOpenGL - Android OpenGL ES 3.0 绘制…

《Windows API每日一练》6.4 程序测试

前面我们讨论了鼠标的一些基础知识&#xff0c;本节我们将通过一些实例来讲解鼠标消息的不同处理方式。 本节必须掌握的知识点&#xff1a; 第36练&#xff1a;鼠标击中测试1 第37练&#xff1a;鼠标击中测试2—增加键盘接口 第38练&#xff1a;鼠标击中测试3—子窗口 第39练&…