当前位置: 首页 > news >正文

Golang抓包:实现网络数据包捕获与分析

介绍

在网络通信中,网络数据包是信息传递的基本单位。抓包是一种监控和分析网络流量的方法,用于获取网络数据包并对其进行分析。在Golang中,我们可以借助现有的库来实现抓包功能,进一步对网络数据进行分析和处理。

本文将介绍如何使用Golang实现抓包功能,包括网络数据包捕获和数据包分析。我们将使用gopacket库来实现抓包功能,并结合示例代码来演示抓包过程以及常见的数据包分析方法。

准备工作

在开始之前,我们需要安装gopacket库。打开命令行界面,并执行以下命令:

go get github.com/google/gopacket

安装完成后,我们就可以开始使用gopacket库来进行抓包和数据包分析。

抓包基础

打开网络设备

首先,我们需要确定要监控的网络设备。可以通过以下代码来获取计算机中的网络设备列表:

package mainimport ("fmt""net"
)func main() {interfaces, err := net.Interfaces()if err != nil {fmt.Println("Failed to get interfaces:", err)return}fmt.Println("Network interfaces:")for _, iface := range interfaces {fmt.Println("- Name:", iface.Name)}
}

执行上述代码,会输出计算机上所有的网络设备名称。

可以通过以下代码来打开一个网络设备:

package mainimport ("fmt""log""net""github.com/google/gopacket/pcap"
)func main() {device := "eth0" // 要打开的网络设备名称handle, err := pcap.OpenLive(device, 65536, true, pcap.BlockForever)if err != nil {log.Fatal(err)}defer handle.Close()fmt.Println("Device opened:", device)
}

在上述代码中,我们使用pcap.OpenLive函数来打开一个网络设备。该函数接受设备名称、数据包最大长度、是否要抓取数据包的全部内容以及超时时间作为参数。如果打开成功,将返回一个pcap.Handle对象,可以用于后续的数据包捕获和分析。

捕获数据包

在打开网络设备之后,我们可以开始捕获数据包。可以通过以下代码来捕获指定数量的数据包:

package mainimport ("fmt""log""net""time""github.com/google/gopacket/pcap"
)func main() {device, err := pcap.FindAllDevs()if err != nil {log.Fatal(err)}handle, err := pcap.OpenLive(device[0].Name, 65536, true, pcap.BlockForever)if err != nil {log.Fatal(err)}defer handle.Close()packetCount := 0packetSource := gopacket.NewPacketSource(handle, handle.LinkType())for packet := range packetSource.Packets() {packetCount++fmt.Println("Packet:", packetCount)// TODO: 进行数据包分析time.Sleep(1 * time.Second) // 仅用于示例,避免数据包流量过大}
}

上述代码中,我们使用gopacket.NewPacketSource函数将打开的设备与pcap.Handle对象关联起来,然后使用PacketSourcePackets方法来获取捕获到的数据包。每次从Packets方法获取到一个数据包,我们都会对其进行处理,即打印出数据包的序号(用于示例,实际应用中可能需要根据需求进行其他操作)。

数据包分析

在捕获到数据包后,我们可以对其进行分析并提取所需的信息。gopacket库提供了丰富的工具和功能,用于数据包分析。

以下是一些常见的数据包分析方法:

解析以太网帧
ethernetLayer := packet.Layer(layers.LayerTypeEthernet)
if ethernetLayer != nil {ethernetPacket, _ := ethernetLayer.(*layers.Ethernet)fmt.Println("Ethernet source MAC:", ethernetPacket.SrcMAC)fmt.Println("Ethernet destination MAC:", ethernetPacket.DstMAC)fmt.Println("Ethernet type:", ethernetPacket.EthernetType)
}

以上代码演示了如何解析以太网帧中的源MAC地址、目的MAC地址和以太网类型。

解析IP包
ipLayer := packet.Layer(layers.LayerTypeIPv4)
if ipLayer != nil {ipPacket, _ := ipLayer.(*layers.IPv4)fmt.Println("IP version:", ipPacket.Version)fmt.Println("IP source address:", ipPacket.SrcIP)fmt.Println("IP destination address:", ipPacket.DstIP)fmt.Println("IP protocol:", ipPacket.Protocol)
}

以上代码演示了如何解析IPv4包中的版本、源IP地址、目的IP地址和协议。

解析TCP包
tcpLayer := packet.Layer(layers.LayerTypeTCP)
if tcpLayer != nil {tcpPacket, _ := tcpLayer.(*layers.TCP)fmt.Println("TCP source port:", tcpPacket.SrcPort)fmt.Println("TCP destination port:", tcpPacket.DstPort)fmt.Println("TCP sequence number:", tcpPacket.Sequence)fmt.Println("TCP acknowledgment number:", tcpPacket.Acknowledgment)fmt.Println("TCP flags:", tcpPacket.Flags)
}

以上代码演示了如何解析TCP包中的源端口、目的端口、序列号、确认号和标志位。

解析UDP包
udpLayer := packet.Layer(layers.LayerTypeUDP)
if udpLayer != nil {udpPacket, _ := udpLayer.(*layers.UDP)fmt.Println("UDP source port:", udpPacket.SrcPort)fmt.Println("UDP destination port:", udpPacket.DstPort)
}

以上代码演示了如何解析UDP包中的源端口和目的端口。

解析应用层协议

在数据包的应用层有各种各样的协议,如HTTP、DNS等。gopacket库提供了根据协议类型解析数据包的方法。以下是解析HTTP协议的示例代码:

httpLayer := packet.Layer(layers.LayerTypeHTTP)
if httpLayer != nil {httpPacket, _ := httpLayer.(*layers.HTTP)fmt.Println("HTTP method:", httpPacket.Method)fmt.Println("HTTP host:", httpPacket.Host)fmt.Println("HTTP user-agent:", httpPacket.UserAgent)
}

以上代码演示了如何解析HTTP包中的方法、主机和用户代理信息。

示例:捕获HTTP请求

现在,我们将结合以上的知识来实现一个简单的示例:捕获HTTP请求,并提取请求的URL和请求头信息。

package mainimport ("fmt""log""net""strings""time""github.com/google/gopacket""github.com/google/gopacket/pcap""github.com/google/gopacket/layers"
)func main() {device, err := pcap.FindAllDevs()if err != nil {log.Fatal(err)}handle, err := pcap.OpenLive(device[0].Name, 65536, true, pcap.BlockForever)if err != nil {log.Fatal(err)}defer handle.Close()packetSource := gopacket.NewPacketSource(handle, handle.LinkType())for packet := range packetSource.Packets() {ethernetLayer := packet.Layer(layers.LayerTypeEthernet)if ethernetLayer != nil {ethernetPacket, _ := ethernetLayer.(*layers.Ethernet)ipLayer := packet.Layer(layers.LayerTypeIPv4)if ipLayer != nil {ipPacket, _ := ipLayer.(*layers.IPv4)tcpLayer := packet.Layer(layers.LayerTypeTCP)if tcpLayer != nil {tcpPacket, _ := tcpLayer.(*layers.TCP)httpLayer := packet.Layer(layers.LayerTypeHTTP)if httpLayer != nil {httpPacket, _ := httpLayer.(*layers.HTTP)fmt.Println("Source MAC:", ethernetPacket.SrcMAC)fmt.Println("Destination MAC:", ethernetPacket.DstMAC)fmt.Println("Source IP:", ipPacket.SrcIP)fmt.Println("Destination IP:", ipPacket.DstIP)fmt.Println("Source Port:", tcpPacket.SrcPort)fmt.Println("Destination Port:", tcpPacket.DstPort)fmt.Println("HTTP Method:", httpPacket.Method)fmt.Println("HTTP Host:", httpPacket.Host)headers := strings.Split(string(httpPacket.Headers), "\r\n")for _, header := range headers {fmt.Println("HTTP Header:", header)}fmt.Println("--------")}}}}time.Sleep(1 * time.Second) // 仅用于示例,避免数据包流量过大}
}

以上示例代码中,我们使用了嵌套的条件语句来逐级解析数据包的各个层级,并提取所需的信息。其中,我们关注以太网帧、IPv4包、TCP包和HTTP协议,提取了包括源MAC地址、目的MAC地址、源IP地址、目的IP地址、源端口、目的端口、HTTP方法、主机和请求头信息等。

案例

案例一:统计流量

我们可以使用抓包技术来统计特定端口的流量。以下示例代码演示了如何捕获HTTP流量,并统计总共传输的数据量:

package mainimport ("fmt""log""net""strings""time""github.com/google/gopacket""github.com/google/gopacket/pcap""github.com/google/gopacket/layers"
)func main() {device, err := pcap.FindAllDevs()if err != nil {log.Fatal(err)}handle, err := pcap.OpenLive(device[0].Name, 65536, true, pcap.BlockForever)if err != nil {log.Fatal(err)}defer handle.Close()packetSource := gopacket.NewPacketSource(handle, handle.LinkType())totalBytes := 0startTime := time.Now()for packet := range packetSource.Packets() {ethernetLayer := packet.Layer(layers.LayerTypeEthernet)if ethernetLayer != nil {ethernetPacket, _ := ethernetLayer.(*layers.Ethernet)ipLayer := packet.Layer(layers.LayerTypeIPv4)if ipLayer != nil {ipPacket, _ := ipLayer.(*layers.IPv4)tcpLayer := packet.Layer(layers.LayerTypeTCP)if tcpLayer != nil {tcpPacket, _ := tcpLayer.(*layers.TCP)httpLayer := packet.Layer(layers.LayerTypeHTTP)if httpLayer != nil {httpPacket, _ := httpLayer.(*layers.HTTP)if tcpPacket.SrcPort.String() == "80" || tcpPacket.DstPort.String() == "80" {totalBytes += len(packet.Data())}}}}}elapsed := time.Since(startTime)if elapsed.Seconds() >= 10 {fmt.Printf("Total Bytes: %d\n", totalBytes)break}}
}

上述代码中,我们在数据包捕获的过程中判断源端口或目标端口是否为80(HTTP默认端口),如果是则统计这些HTTP流量的数据量。我们使用一个计时器来控制统计的时间,示例中设置为10秒。随着流量的捕获,我们将统计的总数据量打印出来。

案例二:HTTP请求重放

我们可以抓取HTTP请求,并将其重放到目标服务器。以下示例代码演示了如何捕获HTTP请求,并将其重放到指定的目标服务器:

package mainimport ("log""net/http""strings""github.com/google/gopacket""github.com/google/gopacket/pcap""github.com/google/gopacket/layers"
)func main() {device, err := pcap.FindAllDevs()if err != nil {log.Fatal(err)}handle, err := pcap.OpenLive(device[0].Name, 65536, true, pcap.BlockForever)if err != nil {log.Fatal(err)}defer handle.Close()packetSource := gopacket.NewPacketSource(handle, handle.LinkType())for packet := range packetSource.Packets() {ethernetLayer := packet.Layer(layers.LayerTypeEthernet)if ethernetLayer != nil {ethernetPacket, _ := ethernetLayer.(*layers.Ethernet)ipLayer := packet.Layer(layers.LayerTypeIPv4)if ipLayer != nil {ipPacket, _ := ipLayer.(*layers.IPv4)tcpLayer := packet.Layer(layers.LayerTypeTCP)if tcpLayer != nil {tcpPacket, _ := tcpLayer.(*layers.TCP)httpLayer := packet.Layer(layers.LayerTypeHTTP)if httpLayer != nil {httpPacket, _ := httpLayer.(*layers.HTTP)if tcpPacket.SrcPort.String() == "80" || tcpPacket.DstPort.String() == "80" {method := httpPacket.Methodurl := "http://" + string(ipPacket.DstIP) + string(httpPacket.URL)headers := make(http.Header)for _, header := range strings.Split(string(httpPacket.Headers), "\r\n") {parts := strings.SplitN(header, ":", 2)if len(parts) == 2 {headers.Add(strings.TrimSpace(parts[0]), strings.TrimSpace(parts[1]))}}client := &http.Client{}req, err := http.NewRequest(method, url, nil)if err != nil {log.Fatal(err)}req.Header = headersresp, err := client.Do(req)if err != nil {log.Fatal(err)}log.Println("Response:", resp)}}}}}}
}

上述代码中,我们在抓取到HTTP请求后,构造一个新的HTTP请求,其中包括方法、URL、请求头等信息。然后,我们使用http.Client发送这个新的HTTP请求,并打印出服务器的响应。通过这种方式,我们可以捕获并重放HTTP请求。

案例三:网络嗅探器

我们可以使用抓包技术来实现一个简单的网络嗅探器,监控网络通信并输出相关信息。以下示例代码演示了如何实现一个简单的网络嗅探器:

package mainimport ("fmt""log""net""github.com/google/gopacket""github.com/google/gopacket/pcap""github.com/google/gopacket/layers"
)func main() {device, err := pcap.FindAllDevs()if err != nil {log.Fatal(err)}handle, err := pcap.OpenLive(device[0].Name, 65536, true, pcap.BlockForever)if err != nil {log.Fatal(err)}defer handle.Close()packetSource := gopacket.NewPacketSource(handle, handle.LinkType())for packet := range packetSource.Packets() {ethernetLayer := packet.Layer(layers.LayerTypeEthernet)if ethernetLayer != nil {ethernetPacket, _ := ethernetLayer.(*layers.Ethernet)ipLayer := packet.Layer(layers.LayerTypeIPv4)if ipLayer != nil {ipPacket, _ := ipLayer.(*layers.IPv4)fmt.Println("Source IP:", ipPacket.SrcIP)fmt.Println("Destination IP:", ipPacket.DstIP)tcpLayer := packet.Layer(layers.LayerTypeTCP)if tcpLayer != nil {tcpPacket, _ := tcpLayer.(*layers.TCP)fmt.Println("Source Port:", tcpPacket.SrcPort)fmt.Println("Destination Port:", tcpPacket.DstPort)fmt.Println("Payload:", string(tcpPacket.Payload))}udpLayer := packet.Layer(layers.LayerTypeUDP)if udpLayer != nil {udpPacket, _ := udpLayer.(*layers.UDP)fmt.Println("Source Port:", udpPacket.SrcPort)fmt.Println("Destination Port:", udpPacket.DstPort)fmt.Println("Payload:", string(udpPacket.Payload))}}}}
}

上述代码中,我们在数据包捕获的过程中,获取到IP层和TCP/UDP层的信息,并将其打印出来。通过此网络嗅探器,我们可以实时监控网络通信,并输出重要的数据包信息。

总结

通过使用gopacket库,我们可以轻松地实现网络数据包的抓取和分析。本文介绍了使用Golang实现抓包功能的基本步骤,包括打开网络设备、捕获数据包和数据包分析等。我们还提供了一些常用的数据包分析方法的示例代码,以帮助读者更好地理解数据包的解析过程。

抓包是网络安全、网络性能优化、网络协议分析等领域的重要工具,掌握抓包技术不仅可以帮助我们更好地理解网络通信过程,还可以帮助我们发现网络中的问题和潜在威胁。通过使用Golang实现抓包功能,我们可以利用Golang的优势,如高效性能、并发性和丰富的库支持,来实现更灵活、高效的网络数据包捕获与分析。

相关文章:

Golang抓包:实现网络数据包捕获与分析

介绍 在网络通信中,网络数据包是信息传递的基本单位。抓包是一种监控和分析网络流量的方法,用于获取网络数据包并对其进行分析。在Golang中,我们可以借助现有的库来实现抓包功能,进一步对网络数据进行分析和处理。 本文将介绍如…...

分类预测 | Matlab实现QPSO-SVM、PSO-SVM、SVM多特征分类预测对比

分类预测 | Matlab实现QPSO-SVM、PSO-SVM、SVM多特征分类预测对比 目录 分类预测 | Matlab实现QPSO-SVM、PSO-SVM、SVM多特征分类预测对比分类效果基本描述程序设计参考资料 分类效果 基本描述 1.Matlab实现QPSO-SVM、PSO-SVM、SVM分类预测对比,运行环境Matlab2018b…...

kubernetes部署jenkins

参考:kubernetes 部署 Jenkins jenkins kubernetes pipeline_mob64ca14116c53的技术博客_51CTO博客 第七篇:kubernetes部署jenkins-CSDN博客 1、当前kubernetes集群已部署nfs服务 showmount -e 创建jenkins目录 2、添加jenkins的pvc kubectl create …...

Node.js详解

一、是什么 Node.js 是一个开源与跨平台的 JavaScript 运行时环境 在浏览器外运行 V8 JavaScript 引擎(Google Chrome 的内核),利用事件驱动、非阻塞和异步输入输出模型等技术提高性能 可以理解为 Node.js 就是一个服务器端的、非阻塞式I/…...

v-html命令渲染的内容,使用scoped属性的情况下,样式不起作用

v-html命令渲染的内容&#xff0c;使用scoped属性的情况下&#xff0c;样式不起作用 如&#xff1a; CSS&#xff1a; <style scoped> .question_title_text img{ display: block; height: 200px; margin: 10px auto 0 auto;} </style> HTML&#xff1a; <d…...

浅谈vue2.0和vue3.0的区别

Vue3.0相对于Vue2.0有以下改进&#xff1a; Vue 3.0 是一个新版本的 Vue.js&#xff0c;它提供了更高效的渲染性能和更强大的工具链。下面是一些 Vue 3.0 的具体用法&#xff1a; 创建 Vue 实例&#xff1a;与 Vue 2.x 相同&#xff0c;使用 Vue.createApp() 方法创建 Vue 实例…...

git clone报错SSL connect error

解决CentOS 6.6上Git操作引发的SSL连接错误问题 最近在处理一个CentOS 6.6服务器上的问题时&#xff0c;遇到了一个比较棘手的问题。我的小伙伴在操作Git时&#xff0c;发现无法执行git pull命令&#xff0c;提示找不到Git组件。在这篇文章中&#xff0c;我会详细介绍我们是如…...

LeetCode(26)判断子序列【双指针】【简单】

目录 1.题目2.答案3.提交结果截图 链接&#xff1a; 判断子序列 1.题目 给定字符串 s 和 t &#xff0c;判断 s 是否为 t 的子序列。 字符串的一个子序列是原始字符串删除一些&#xff08;也可以不删除&#xff09;字符而不改变剩余字符相对位置形成的新字符串。&#xff08;…...

学习c#的第十五天

目录 C# 预处理器指令 C# 预处理器指令列表 #define 预处理器 条件指令 #warning 和 #error #region 和 #endregion #line #pragma C# 预处理器指令 预处理器指令指导编译器在实际编译开始之前对信息进行预处理。 所有的预处理器指令都是以 # 开始。且在一行上&#…...

TrafficGPT: Viewing, Processing, and Interacting with Traffic Foundation Models

这篇论文的标题是“TrafficGPT: Viewing, Processing, and Interacting with Traffic Foundation Models”&#xff0c;它探讨了将大型语言模型&#xff08;如ChatGPT&#xff09;与交通基础模型结合的潜力和应用。主要内容包括&#xff1a; 论文背景&#xff1a;论文指出&…...

SPASS-参数估计与假设检验

参数估计 点估计 点估计用样本统计量的值直接作为总体参数的估计值。如用样本均值直接作为总体均值的估计值,用样本方差直接作为总体方差的估计值等。 常用的点估计法 (1)矩估计法 (2)极大似然估计法 (3)稳健估计法 区间估计 因为点估计直接用样本估计值作为总体参数…...

虚拟博物馆和纪念馆全景漫游

VR全景漫游 今天不写代码&#xff0c;小郭我从网上找了许多虚拟展览的网站&#xff0c;主要分为博物馆和纪念馆&#xff0c;在这里总结分享给大家&#xff0c;大家在家中就能做到全景漫游中国的博物馆和纪念馆啦&#xff01; 中国国家博物馆数字展厅 中国数字科技馆 博物馆…...

chrome 浏览器个别字体模糊不清

特别是在虚拟机里&#xff0c;有些字体看不清&#xff0c;但是有些就可以&#xff0c;设置办法&#xff1a; chrome://settings/fonts 这里明显可以看到有些字体就是模糊的状态&#xff1a; 把这种模糊的字体换掉即可解决一部分问题。 另外&#xff0c;经过观察&#xff0c;…...

Resolume Arena 7.15.0(VJ音视频软件)

Resolume Arena 7是一款专业的实时视觉效果软件&#xff0c;用于创造引人入胜的视频演出和灯光秀。它提供了丰富多样的功能和工具&#xff0c;可以将音频、视频和图像合成在一起&#xff0c;创造出令人惊叹的视觉效果。 Resolume Arena 7支持多种媒体格式&#xff0c;包括视频文…...

Java设计模式

1.设计模式概述 软件设计模式(Software Design Pattern),又称设计模式,是一套被反复使用、多数人知晓 的、经过分类编目的、代码设计经验的总结。 1.创建型模式 用于描述“怎样创建对象”,它的主要特点是“将对象的创建与使用分离”。提供了单例、原型、工厂方法、抽象工…...

平均分(C++)

系列文章目录 进阶的卡莎C++_睡觉觉觉得的博客-CSDN博客数1的个数_睡觉觉觉得的博客-CSDN博客双精度浮点数的输入输出_睡觉觉觉得的博客-CSDN博客足球联赛积分_睡觉觉觉得的博客-CSDN博客大减价(一级)_睡觉觉觉得的博客-CSDN博客小写字母的判断_睡觉觉觉得的博客-CSDN博客纸币(…...

.NET8.0 AOT 经验分享 FreeSql/FreeRedis/FreeScheduler 均已通过测试

2023年11月15日&#xff0c;对.net的开发圈是一个重大的日子&#xff0c;.net 8.0正式版发布。 圈内已经预热了有半个月有余&#xff0c;性能不断超越&#xff0c;开发体验越来越完美&#xff0c;早在.net 5.0的时候就各种吹风Aot编译&#xff0c;直到6.0 7.0使用仍然比较麻烦…...

Django之模型层

【1】常见的13中查询方法 例子语法&#xff1a;models.Userinfo.objects.filter().all() 查询方法解释all()查询所有数据first()那queryset中第一条数据last()那最后一条数据filter()带有过滤条件的查询&#xff0c;查询不到结果返回Noneget()带有guolv条件的查询&#xff0c;…...

京东数据挖掘(京东运营数据分析):2023年宠物行业数据分析报告

随着社会经济的发展&#xff0c;人均收入水平逐渐提高&#xff0c;使得宠物成为越来越多家庭的成员&#xff0c;宠物数量不断增长。伴随养宠人群的增多&#xff0c;宠物相关产业的发展也不断升温&#xff0c;宠物经济规模持续增长。 根据鲸参谋平台的数据显示&#xff0c;在宠物…...

五分钟k8s实战-Istio 网关

istio-03.png 在上一期 k8s-服务网格实战-配置 Mesh 中讲解了如何配置集群内的 Mesh 请求&#xff0c;Istio 同样也可以处理集群外部流量&#xff0c;也就是我们常见的网关。 其实和之前讲到的k8s入门到实战-使用Ingress Ingress 作用类似&#xff0c;都是将内部服务暴露出去的…...

在HarmonyOS ArkTS ArkUI-X 5.0及以上版本中,手势开发全攻略:

在 HarmonyOS 应用开发中&#xff0c;手势交互是连接用户与设备的核心纽带。ArkTS 框架提供了丰富的手势处理能力&#xff0c;既支持点击、长按、拖拽等基础单一手势的精细控制&#xff0c;也能通过多种绑定策略解决父子组件的手势竞争问题。本文将结合官方开发文档&#xff0c…...

CMake基础:构建流程详解

目录 1.CMake构建过程的基本流程 2.CMake构建的具体步骤 2.1.创建构建目录 2.2.使用 CMake 生成构建文件 2.3.编译和构建 2.4.清理构建文件 2.5.重新配置和构建 3.跨平台构建示例 4.工具链与交叉编译 5.CMake构建后的项目结构解析 5.1.CMake构建后的目录结构 5.2.构…...

C# SqlSugar:依赖注入与仓储模式实践

C# SqlSugar&#xff1a;依赖注入与仓储模式实践 在 C# 的应用开发中&#xff0c;数据库操作是必不可少的环节。为了让数据访问层更加简洁、高效且易于维护&#xff0c;许多开发者会选择成熟的 ORM&#xff08;对象关系映射&#xff09;框架&#xff0c;SqlSugar 就是其中备受…...

NLP学习路线图(二十三):长短期记忆网络(LSTM)

在自然语言处理(NLP)领域,我们时刻面临着处理序列数据的核心挑战。无论是理解句子的结构、分析文本的情感,还是实现语言的翻译,都需要模型能够捕捉词语之间依时序产生的复杂依赖关系。传统的神经网络结构在处理这种序列依赖时显得力不从心,而循环神经网络(RNN) 曾被视为…...

c#开发AI模型对话

AI模型 前面已经介绍了一般AI模型本地部署&#xff0c;直接调用现成的模型数据。这里主要讲述讲接口集成到我们自己的程序中使用方式。 微软提供了ML.NET来开发和使用AI模型&#xff0c;但是目前国内可能使用不多&#xff0c;至少实践例子很少看见。开发训练模型就不介绍了&am…...

大数据学习(132)-HIve数据分析

​​​​&#x1f34b;&#x1f34b;大数据学习&#x1f34b;&#x1f34b; &#x1f525;系列专栏&#xff1a; &#x1f451;哲学语录: 用力所能及&#xff0c;改变世界。 &#x1f496;如果觉得博主的文章还不错的话&#xff0c;请点赞&#x1f44d;收藏⭐️留言&#x1f4…...

使用 SymPy 进行向量和矩阵的高级操作

在科学计算和工程领域&#xff0c;向量和矩阵操作是解决问题的核心技能之一。Python 的 SymPy 库提供了强大的符号计算功能&#xff0c;能够高效地处理向量和矩阵的各种操作。本文将深入探讨如何使用 SymPy 进行向量和矩阵的创建、合并以及维度拓展等操作&#xff0c;并通过具体…...

2023赣州旅游投资集团

单选题 1.“不登高山&#xff0c;不知天之高也&#xff1b;不临深溪&#xff0c;不知地之厚也。”这句话说明_____。 A、人的意识具有创造性 B、人的认识是独立于实践之外的 C、实践在认识过程中具有决定作用 D、人的一切知识都是从直接经验中获得的 参考答案: C 本题解…...

算法岗面试经验分享-大模型篇

文章目录 A 基础语言模型A.1 TransformerA.2 Bert B 大语言模型结构B.1 GPTB.2 LLamaB.3 ChatGLMB.4 Qwen C 大语言模型微调C.1 Fine-tuningC.2 Adapter-tuningC.3 Prefix-tuningC.4 P-tuningC.5 LoRA A 基础语言模型 A.1 Transformer &#xff08;1&#xff09;资源 论文&a…...

计算机基础知识解析:从应用到架构的全面拆解

目录 前言 1、 计算机的应用领域&#xff1a;无处不在的数字助手 2、 计算机的进化史&#xff1a;从算盘到量子计算 3、计算机的分类&#xff1a;不止 “台式机和笔记本” 4、计算机的组件&#xff1a;硬件与软件的协同 4.1 硬件&#xff1a;五大核心部件 4.2 软件&#…...