网络抓包分析工具

摘要

随着网络技术的快速发展,网络数据的传输和处理变得日益复杂。网络抓包分析工具作为网络故障排查、性能优化以及安全审计的重要工具,对于提升网络管理的效率和准确性具有重要意义。本文旨在设计并实现一款高效、易用的网络抓包分析工具,以满足现代网络管理的需求。
在工具设计方面,本文首先对网络抓包的基本原理和常用技术进行了深入研究,包括数据包捕获、数据展示等关键环节。基于这些原理和技术,本文提出了一种基于多线程和异步处理的数据包捕获机制,以提高抓包效率和响应速度。同时,工具还采用了模块化的设计思想,使得协议解析和数据展示等功能可以灵活扩展和定制。
在实现过程中,本文利用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 65535
	int 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和目的ip
	objects[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.mfbz.cn/a/751896.html

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

相关文章

Python实现数据库与Excel文件之间的数据导入与导出

数据库和Excel文件是两种常见且重要的数据存储方式。数据库通常用于大规模数据的高效存储、管理和查询,而Excel则以其直观的界面和简单的操作方式广泛应用于数据分析、报告生成和可视化等领域。在实际工作中,可能需要在这两者之间进行数据的导入与导出。…

网上零食销售系统

摘 要 随着互联网的快速发展,网上销售已成为零售业的重要组成部分。在众多的线上购物品类中,零食销售因其受众广泛、购买频率高、消费金额适中等特点,一直备受关注。然而,传统的零食销售方式,如实体店铺销售&#xff…

Python湍流隐式模型耗散粘性方程和大涡流模拟

🎯要点 🎯达朗贝尔一维波动通解,二维变速模拟 | 🎯达朗贝尔算子解双曲波形微分方程 | 🎯耗散系统粘性伯格斯方程快速傅里叶变换算法 | 🎯二维线性和非线性对流扩散解和湍流隐式建模 📜偏微分方…

网络研究观:网络犯罪简报

通过犯罪研究人员精选的新闻提要了解最新的全球网络犯罪威胁。 了解不同的数字欺诈以及如何保护自己。 1. 网络犯罪分子冒充 CBI 和 IB 官员:KP 加尔各答警察局警告公民,诈骗者通过发送虚假的 CBI 和 IB 通知来勒索钱财,指控他们在线观看儿…

Avue框架学习

Avue框架学习 我们的项目使用的框架是 Avue 在我看来这个框架最大的特点是可以基于JSON配置页面上的From,Table以及各种各样的输入框等,不需要懂前端就可以很快上手,前提是需要多查一下文档 开发环境搭建 由于我本地的环境全是用docker来搭建的,所以我依然选择用docker搭建我…

【第二周】基础语法学习

目录 前言初始化项目文件介绍基本介绍JSWXMLWXSS 常见组件基础组件视图容器match-mediamovable-area/viewpage-containerscroll-viewswiper 表单组件自定义组件 模板语法数据绑定单向数据绑定双向数据绑定 列表渲染条件渲染模板引用 事件系统事件类型事件绑定阻止冒泡互斥事件事…

【开源项目】自然语言处理领域的明星项目推荐:Hugging Face Transformers

在当今人工智能与大数据飞速发展的时代,自然语言处理(NLP)已成为推动科技进步的重要力量。而在NLP领域,Hugging Face Transformers无疑是一个备受瞩目的开源项目。本文将从项目介绍、代码解释以及技术特点等角度,为您深…

《梦醒蝶飞:释放Excel函数与公式的力量》6.3NOW函数

6.3NOW函数 1)NOW函数概述 NOW函数是Excel中一个非常实用的内置函数,它返回当前的日期和时间。这个函数可以自动更新,以反映打开工作簿时的确切日期和时间。 2)函数语法 NOW函数的语法非常简单,因为它不需要任何参…

操作系统-中断和异常

中断和异常 用户态:普通应用程序运行在用户态,有很多权限限制 内核态:操作系统运行在内核态,有完全的权限访问和管理所有资源(硬件,内存) 中断的作用 把CPU从用户态变内核态 异常&#xff08…

前端性能优化-实测

PageSpeed Insights 性能测试 今天测试网站性能的时候发现一个问题,一个h2标签内容为什么会占据这么长的渲染时间,甚至有阶段测到占据了7000多毫秒,使用了很多方法都不能解决,包括了修改标签,样式大小等,当…

【C++题解】* 1266. 求最大数

问题&#xff1a;1266. 求最大数 类型&#xff1a;简单循环 题目描述&#xff1a; 问 555555 的约数中最大的三位数是多少&#xff1f; 输入&#xff1a; 无。 输出&#xff1a; 约数中最大的三位数。 完整代码如下&#xff1a; #include<bits/stdc.h> using nam…

基于weixin小程序乡村旅游系统的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;用户管理&#xff0c;商家管理&#xff0c;旅游景点管理&#xff0c;景点类型管理&#xff0c;景点路线管理&#xff0c;系统管理 商家帐号账号功能包括&#xff1a;系统首页&#xff0c;旅游景点管理&…

【机器学习300问】132、自注意力机制(Self-Attention)和传统注意力机制(Attention)的区别?

最近学习注意力机制的时候&#xff0c;发现相同的概念很多&#xff0c;有必要给这些概念做一下区分&#xff0c;不然后续的学习可能会混成一团。本文先区分一下自注意力机制和传统注意力机制。我会先直接给出它们之间有何区别的结论&#xff0c;然后通过一个例子来说明。 【机…

2024最新!将mysql的数据导入到Solr

Solr导入mysql的数据 如何安装导入数据前准备配置Solr的Jar包以及Mysql驱动包1.1、将solr-8.11.3\dist下的两个包进行移动1.2、将mysql-connect包也移动到该位置1.3、重启Solr项目 配置xml2.1、第一步我们需要创建核心2.2、第二步修改xml(这里是结合19年的教程)2.3、 创建data-…

【力扣】有效的字母异位词

&#x1f525;博客主页&#xff1a; 我要成为C领域大神&#x1f3a5;系列专栏&#xff1a;【C核心编程】 【计算机网络】 【Linux编程】 【操作系统】 ❤️感谢大家点赞&#x1f44d;收藏⭐评论✍️ 本博客致力于知识分享&#xff0c;与更多的人进行学习交流 给定两个字符串 s …

嵌入式 Linux 设备刷系统具体组成

嵌入式 Linux 设备刷系统具体组成 1 介绍1.1 概述1.2 嵌入式 Linux 的组成1.3 U-Boot1.4 Linux 内核1.5 设备树1.6 根文件系统 参考 1 介绍 1.1 概述 一个完整的 linux 系统&#xff0c;通常包含了 U-Boot、kernel、设备树以及根文件系统。 1.2 嵌入式 Linux 的组成 1.3 U-…

Java源码实现《植物大战僵尸》

前言 学Java的朋友们&#xff0c;福利来了&#xff0c;今天小编给大家带来了一款 植物大战僵尸源码&#xff0c;看图: 视频演示 环境JDK1.8 类继承UML图 源码实现 我们先从main函数看起&#xff0c;继承了javafx.application.Application。JavaFx是Java图形化界面技术AWT、S…

30分钟速通ROS联合Webots仿真实战

写在前面&#xff1a; 本文是ROS联合Webots仿真实战教程&#xff0c;不包含ROS环境安装配置教程&#xff0c;ROS环境安装配置教程可以参考1.2.4 安装 ROS Autolabor-ROS机器人入门课程《ROS理论与实践》零基础教程 另本文所用版本如下&#xff1a; ubuntu版本&#xff1a;20…

Github 2024-06-28 Java开源项目日报Top9

根据Github Trendings的统计,今日(2024-06-28统计)共有9个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Java项目8非开发语言项目1HTML项目1《Hello 算法》:动画图解、一键运行的数据结构与算法教程 创建周期:476 天协议类型:OtherStar数量:63556…

基于 Paimon 的袋鼠云实时湖仓入湖实战剖析

在当今数据驱动的时代&#xff0c;企业对数据的实施性能力提出了前所未有的高要求。为了应对这一挑战&#xff0c;构建高效、灵活且可扩展的实时湖仓成为数字化转型的关键。本文将深入探讨袋鼠云数栈如何通过三大核心实践——ChunJun 融合 Flink CDC、MySQL 一键入湖至 Paimon …