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

2-2-18-14 QNX系统架构之 TCP/IP 网络

阅读前言

本文以QNX系统官方的文档英文原版资料为参考,翻译和逐句校对后,对QNX操作系统的相关概念进行了深度整理,旨在帮助想要了解QNX的读者及开发者可以快速阅读,而不必查看晦涩难懂的英文原文,这些文章将会作为一个或多个系列进行发布,从遵从原文的翻译,到针对某些重要概念的穿插引入,以及再到各个重要专题的梳理,大致分为这三个层次部分,分不同的文章进行发布,依据这样的原则进行组织,读者可以更好的查找和理解。


1. TCP/IP 网络

随着互联网在我们日常生活中的影响力日益显著,其所依托的协议 IP(Internet Protocol,互联网协议)也变得愈发重要。IP 协议及其相关工具无处不在,这使得 IP 成为众多专用网络事实上的首选协议。

IP 被用于从简单任务(例如远程登录)到更复杂任务(例如提供实时股票报价)等诸多方面。大多数企业都在借助通常基于 IP 协议栈运行的万维网来与客户进行沟通、开展广告宣传以及实现其他业务连接。QNX Neutrino 实时操作系统(RTOS)非常适合在这个全球网络中扮演各种各样的角色,从被连接到互联网的嵌入式设备,到用于构建互联网本身的路由器,都能胜任。

鉴于这些以及许多其他用户需求,我们打造了相对节省资源的 TCP/IP 协议栈(包含在 io-pkt * 中),同时采用了通用的 BSD 应用程序编程接口(API)。

@>>阅读扩展:

Q:这里的BSD是什么单词的缩写?是什么意思?

BSD 是指伯克利软件套件(Berkeley Software Distribution)。

历史背景

  • BSD 起源于加州大学伯克利分校(University of California, Berkeley)。在 20 世纪 70 年代末,伯克利的计算机系统研究组(Computer Systems Research Group,CSRG)在 AT&T 公司的 Unix Version 6 和 Version 7 的基础上进行开发。他们对 Unix 系统进行了大量的修改和扩展,添加了许多新的功能和工具,最终形成了自己的 Unix 版本,这就是 BSD。
  • BSD 在 Unix 的发展历程中起到了关键的作用,它推动了 Unix 系统在学术和商业领域的广泛应用。许多现代操作系统的技术和理念都源于 BSD。

技术特点

  • 网络功能强大:BSD 包含了 TCP/IP 协议栈的早期实现,这使得它在网络方面具有先天的优势。例如,它能够高效地处理网络连接、数据包传输等任务,为互联网的发展奠定了基础。许多网络服务器软件最初都是基于 BSD 开发的。
  • 高度可定制性:BSD 允许用户根据自己的需求灵活配置系统。用户可以选择安装不同的软件包,调整系统参数,甚至修改内核源代码来满足特定的应用场景。比如,对于一个高性能计算中心,可以通过定制 BSD 系统来优化计算资源的分配和利用。
  • 稳定性和安全性高:BSD 以其稳定性和安全性闻名。它经过了多年的实践检验,在关键系统和网络服务中被广泛应用。其安全机制包括访问控制、用户认证等多种手段,可以有效防止系统被非法访问和攻击。

主要版本和应用场景

  • FreeBSD:这是最知名的 BSD 衍生版本之一。它被广泛应用于服务器领域,尤其是网络服务器,如 Web 服务器、邮件服务器、文件服务器等。许多互联网服务提供商(ISP)使用 FreeBSD 来构建稳定可靠的服务器环境。
  • NetBSD:NetBSD 的设计目标是能够在尽可能多的硬件平台上运行,具有良好的移植性。它可以用于嵌入式系统、小型网络设备以及对硬件兼容性要求较高的场景。
  • OpenBSD:OpenBSD 注重系统安全,在安全审计、加密技术等方面投入了大量精力。它常用于对安全要求极高的环境,如防火墙系统、安全研究机构的实验平台等。

我们提供以下几种协议栈配置:


NetBSD TCP/IP 协议栈


基于最新的请求注解(RFC)文档,涵盖用户数据报协议(UDP)、IP 协议以及传输控制协议(TCP)。还支持转发、广播和多播,具备硬件校验和支持、路由套接字、Unix 域套接字、多链路点到点协议(PPP)、以太网上的点到点协议(PPoE)、无类别域间路由(CIDR,即超网划分)、网络地址转换 / IP 过滤、地址解析协议(ARP)、互联网控制消息协议(ICMP)以及互联网组管理协议(IGMP),此外还支持通用互联网文件系统(CIFS)、动态主机配置协议(DHCP)、自动 IP 配置(AutoIP)、域名系统(DNS)、网络文件系统(NFS,包含第 2 版和第 3 版的服务器 / 客户端功能)、网络时间协议(NTP)、路由信息协议(RIP)、路由信息协议第 2 版(RIPv2)以及一个嵌入式网络服务器。
要为该协议栈创建应用程序,需使用行业标准的 BSD 套接字 API。当该协议栈作为网络网关运行时,它还包含经过优化的转发代码,以实现更出色的性能以及高效的数据包路由。

@>> 补充概念:

“RFC” 全称为 “Request for Comments”,在网络技术领域通常为 “请求注解”,它实际上是一系列以编号排定的文件,内容涵盖了互联网相关的技术规范、协议、过程等诸多方面,用于记录互联网通信协议的相关标准以及对这些标准的修改、补充说明等信息。

互联网工程任务组(IETF)等相关组织会通过发布 RFC 文档来对网络协议等进行定义和规范,众多网络协议(比如文中提到的 TCP、IP 等相关协议)的具体内容、实现细节、运作规则等都是依据对应的 RFC 文档来确定的,网络技术领域的专业人员会参考这些 RFC 文档去进行相应的系统开发、网络构建等工作,使其符合标准规范。例如,开发某个遵循 IP 协议的应用时,开发者就要参照涉及 IP 协议的最新 RFC 文档中规定的各项要求和细节来进行编码等操作。

带有 IPsec(互联网协议安全)和 IPv6(互联网协议第 6 版)的增强型 NetBSD 协议栈


包含标准协议栈中的所有功能,再加上针对新一代移动和安全通信的功能特性。该协议栈通过 KAME 扩展提供对 IPv6 和 IPsec(涵盖 IPv4 和 IPv6)的全面支持,以及对基于 IPsec 隧道的虚拟专用网络(VPN)的支持。
这种双模协议栈可同时支持 IPv4 和 IPv6,并且包含针对自动配置的 IPv6 支持,这使得设备能在即插即用的网络环境中进行配置。IPv6 支持还包括支持 IPv6 的实用工具以及支持动态路由的路由信息协议 / 路由信息协议下一代(RIP/RIPng)。此外,还提供了一个高级套接字 API,用以补充标准套接字 API,以便充分利用 IPv6 扩展开发能力。
对 IPsec 的支持,能够实现主机之间或网络之间的安全通信,通过强大的加密算法提供数据保密性以及数据认证功能。对 IPsec 的支持还包括用于建立安全主机关联的互联网密钥交换(IKE,即 ISAKMP/Oakley)密钥管理协议。


QNX Neutrino TCP/IP 套件也是模块化的。例如,它将网络文件系统(NFS)作为独立模块提供。凭借这种模块化特性以及小巧的模块设计,嵌入式系统开发人员能够更轻松、更快速地构建具备 TCP/IP 功能的小型系统。

1.1. TCP/IP管理器的结构

作为资源管理器,io-pkt-* 得益于精简的代码以及所有本地资源管理器都具备的标准接口。由于 QNX Neutrino 进程间通信(IPC)具有天然的优先级继承特性,客户端将按照优先级和时间顺序得到处理,这使得 CPU 资源能得到更合理的分配。

io-pkt套件及其依赖项。
io-pkt套件及其依赖项。

点到点协议(PPP)是作为io-pkt的一部分来实现的。由于 io-pkt负责处理 PPP 数据包的传输,因此无需对数据包数据进行内存拷贝。这种方式可实现高性能的以太网上的点到点协议(PPoE)连接。
TCP/IP 协议套件的其他组件(例如网络文件系统等)是在io-pkt* 之外实现的。这样能实现更好的模块化以及具备更强的容错能力。

1.2. Socket API

伯克利软件套件(BSD)套接字应用程序编程接口(API)显然是 QNX Neutrino 实时操作系统(RTOS)的不二之选。该 API 是 UNIX 领域中进行 TCP/IP 编程的标准接口。在 Windows 领域,Windows 套接字(Winsock)API 基于 BSD 套接字 API 构建,并且与之有诸多共通之处,这使得在两者之间进行转换相当容易。

应用程序开发人员所期望的所有例程均可供使用,包括(但不限于)以下这些:

  • accept()(用于接受连接请求)
  • bind()(用于绑定地址和端口)
  • bindresvport()(用于绑定保留端口)
  • connect()(用于建立连接)
  • dn_comp()(域名压缩相关函数)
  • dn_expand()(展开域名相关函数)
  • endprotoent()(关闭协议数据库相关操作)
  • endservent()(关闭服务数据库相关操作)
  • gethostbyaddr()(通过网络地址获取主机信息)
  • gethostbyname()(通过主机名获取主机信息)
  • getpeername()(获取连接端的地址信息)
  • getprotobyname()(通过协议名获取协议信息)
  • getprotobynumber()(通过协议编号获取协议信息)
  • getprotoent()(获取协议数据库入口)
  • getservbyname()(通过服务名获取服务信息)
  • getservent()(获取服务数据库入口)
  • getsockname()(获取套接字的本地地址信息)
  • getsockopt()(获取套接字选项)
  • herror()(处理主机相关错误信息)
  • hstrerror()(将主机错误码转换为字符串描述)
  • htonl()(将主机字节序转换为网络字节序,长整型)
  • htons()(将主机字节序转换为网络字节序,短整型)
  • h_errlist(主机错误信息列表)
  • h_errno(主机错误编号)
  • h_nerr(主机错误信息数量)
  • inet_addr()(将点分十进制 IP 地址转换为网络字节序的整型表示)
  • inet_aton()(将点分十进制 IP 地址转换为网络字节序的二进制表示)
  • inet_lnaof()(获取 IP 地址的本地网络地址部分)
  • inet_makeaddr()(组合网络地址和本地地址部分生成 IP 地址)
  • inet_netof()(获取 IP 地址的网络地址部分)
  • inet_network()(将点分十进制 IP 地址转换为网络字节序的网络地址表示)
  • inet_ntoa()(将网络字节序的 IP 地址转换为点分十进制表示)
  • ioctl()(输入 / 输出控制操作)
  • listen()(监听端口,等待连接请求)
  • ntohl()(将网络字节序转换为主机字节序,长整型)
  • ntohs()(将网络字节序转换为主机字节序,短整型)
  • recv()(接收数据)
  • recvfrom()(从指定地址接收数据)
  • res_init()(初始化域名解析相关资源)
  • res_mkquery()(构建域名解析查询)
  • res_query()(执行域名解析查询)
  • res_querydomain()(在指定域名下执行域名解析查询)
  • res_search()(搜索域名解析信息)
  • res_send()(发送域名解析请求)
  • poll()(轮询 I/O 事件)
  • send()(发送数据)
  • sendto()(向指定地址发送数据)
  • setprotoent()(设置协议数据库相关操作)
  • setservent()(设置服务数据库相关操作)
  • setsockopt()(设置套接字选项)
  • shutdown()(关闭连接)
  • socket()(创建套接字)

如需更多信息,请参阅《QNX Neutrino C 语言库参考手册》。

互联网中常见的守护进程和实用工具可以很容易地在这个环境中进行移植或者直接编译。这使得在开发应用程序时能够轻松利用已有的相关资源。

1.2.1. 数据库例程(Database routines)

以下列出的数据库例程已经过修改,以便能更好地适配嵌入式系统。

文件节点 /etc/resolv.conf

你可以使用配置字符串(通过confstr()函数)来覆盖通常包含在 “/etc/resolv.conf” 文件中的数据。你也可以使用 “RESCONF” 环境变量来执行此操作。这两种方法中的任意一种都能让你在不使用 “/etc/resolv.conf” 文件的情况下使用域名服务器。这会对gethostbyname()以及其他域名解析例程产生影响。

文件节点 /etc/protocols

getprotobyname()getprotobynumber()函数已经过修改,使其包含少量内置协议,包括 IP 协议、互联网控制消息协议(ICNP)、用户数据报协议(UDP)以及传输控制协议(TCP)。对于许多应用程序来说,这意味着 “/etc/protocols” 文件并非必须存在。

文件节点 /etc/services

getservbyname()函数已经过修改,使其包含少量内置服务,包括文件传输协议(ftp)、远程登录协议(telnet)、简单邮件传输协议(smtp)、域名系统(domain)、网络新闻传输协议(nntp)、网络基本输入输出系统名称服务(netbios-ns)、网络基本输入输出系统会话服务(netbios-ssn)、太阳微系统远程过程调用(sunrpc)以及网络文件系统守护进程(nfsd)。对于许多应用程序而言,这意味着 “/etc/services” 文件并非一定要存在。

1.3. 多个协议栈(Multiple stacks)

QNX Neutrino 网络管理器(io-pkt)允许你加载多个协议共享对象。你甚至可以运行网络管理器(io-pkt*)本身的多个独立实例。与所有 QNX Neutrino 系统组件一样,得益于微内核架构,每个 io-pkt * 都能自然而然地从完备的内存保护中获益。

1.4. IP 过滤和网络地址转换(NAT)

进行 IP 过滤与 NAT(网络地址转换)的 io-pkt* 模块是一个可动态加载的 TCP/IP 协议栈模块。

lsm-pf-*.so 模块提供了高效的防火墙服务,具备以下功能特性:

  • 规则分组:可对不同的数据包应用不同的规则组;
  • 有状态过滤:一种可选配置,允许与已授权连接相关的数据包绕过过滤规则;
  • NAT:用于将多个内部地址映射到单个公网地址,使多个内部系统能够共享同一个公网 IP 地址;
  • 代理服务:允许文件传输协议(ftp)、网络基本输入输出系统(netbios)以及 H.323 协议使用 NAT;
  • 端口重定向:用于将传入流量重定向到内部服务器或服务器池。

IP 过滤和 NAT 规则可以在运行的系统中动态地添加或删除。该工具套件还提供了日志记录服务,以便对这个模块进行监控和管理。

1.5. NTP(Network Time Protocol)

网络时间协议(NTP,Network Time Protocol)能够让你将网络中各设备的时间与互联网标准时间服务器保持同步。QNX Neutrino 的网络时间协议守护进程同时支持服务器模式和客户端模式。

在服务器模式下,本地网络中的一个守护进程会与标准时间服务器进行同步。随后,它会将获取到的时间信息通过广播或多播的方式发送给本地网络中的客户端,或者等待客户端发起请求。之后,客户端的网络时间协议系统就会与服务器端的网络时间协议系统实现同步。网络时间协议套件实现了网络时间协议第 4 版,同时还保持了与第 3 版、第 2 版以及第 1 版的兼容性。

1.6. 动态主机配置

我们支持动态主机配置协议(DHCP),该协议用于获取 TCP/IP 配置参数。

我们的动态主机配置协议客户端(dhclient)会从动态主机配置协议服务器获取其配置参数,并为用户配置 TCP/IP 主机。这使得用户在不清楚主机需要哪些参数(如 IP 地址、网关等)的情况下,就能将主机添加到网络中。动态主机配置协议还允许系统管理员控制主机添加到网络中的方式。我们也提供了动态主机配置协议服务器守护进程(dhcpd)和中继代理(dhcrelay)来管理这些客户端。

如需更多信息,请查阅《实用工具参考手册》中关于 dhclient、dhcrelay 和 dhcpd 的条目内容。

1.6.1. 自动 IP

自动 IP(AutoIP)功能由零配置网络(Zeroconf)互联网工程任务组(IETF)草案发展而来,自动 IP 守护进程(autoipd)是一个 io-pkt* 模块,它能通过与网络中的对等节点进行协商,在无需服务器(与动态主机配置协议(DHCP)不同,DHCP 需要服务器)的情况下自动配置接口的 IPv4 地址。该模块还能与动态主机配置协议(DHCP,通过其客户端 dhclient 体现)共存,使得你的接口能够同时被分配一个链路本地 IP 地址以及一个由动态主机配置协议分配的 IP 地址。

@ >> 补充扩展:

Q:什么是自动IP?什么是DHCP?两者的区别?

自动 IP(Auto - IP)

  • 定义
    • 自动 IP 是一种在网络中自动配置设备 IPv4 地址的机制。它基于 Zeroconf(零配置网络)IETF 草案,通过设备与网络中的对等节点进行协商来确定自身的 IP 地址。这种方式不需要专门的服务器来分配地址,适用于小型的、临时的或没有 DHCP 服务器的网络环境。例如,在一个小型的家庭网络或临时搭建的办公网络中,如果没有配置 DHCP 服务器,设备可以利用自动 IP 来快速获得一个可用的链路本地 IP 地址,使设备能够在本地网络段内进行通信。
  • 工作原理
    • 设备在启动时,会在本地网络中发送探测消息,检查是否有其他设备正在使用特定范围内的 IP 地址。如果发现某个 IP 地址没有被使用,就会将该地址分配给自己。这个过程是通过与同一网络中的其他设备进行通信和协商来完成的,设备之间会交换信息以避免 IP 地址冲突。

动态主机配置协议(DHCP)

  • 定义
    • DHCP 是一种网络管理协议,用于集中分配和管理 IP 地址以及其他 TCP/IP 配置参数(如子网掩码、默认网关、DNS 服务器地址等)。它依赖于 DHCP 服务器来为网络中的客户端设备动态地分配 IP 地址。在大多数企业网络、校园网络以及家庭网络(如果有路由器作为 DHCP 服务器)中广泛使用。例如,当你将新的笔记本电脑接入公司的办公网络时,DHCP 服务器会自动为你的笔记本电脑分配一个在该网络中可用的 IP 地址,使你能够访问网络资源。
  • 工作原理
    • DHCP 的工作过程主要包括四个阶段:发现(Discover)、提供(Offer)、请求(Request)和确认(Acknowledge)。首先,客户端设备在网络中广播一个 DHCP 发现消息,寻找 DHCP 服务器。DHCP 服务器收到发现消息后,会从其可用的 IP 地址池中选择一个 IP 地址,并将该地址以及其他配置信息(如子网掩码、默认网关等)通过 DHCP 提供消息发送给客户端。客户端收到提供消息后,会发送一个 DHCP 请求消息,请求使用该 IP 地址。最后,DHCP 服务器发送一个 DHCP 确认消息,将 IP 地址正式分配给客户端,同时客户端将配置信息应用到自己的网络接口。

两者的区别

  • 配置方式
    • 自动 IP 是设备之间通过自主协商来配置 IP 地址,没有专门的服务器参与。而 DHCP 是由专门的 DHCP 服务器来集中管理和分配 IP 地址。
  • 适用场景
    • 自动 IP 适用于小型、临时或没有服务器支持的网络环境,如小型的家庭物联网设备网络或临时的对等网络。DHCP 适用于需要集中管理 IP 地址的网络环境,如企业网络、校园网络等,能够更有效地管理和分配 IP 地址资源,方便网络管理员进行网络规划和控制。
  • 功能丰富程度
    • DHCP 除了分配 IP 地址外,还可以为客户端提供子网掩码、默认网关、DNS 服务器地址等其他重要的 TCP/IP 配置参数。自动 IP 主要侧重于自动分配一个本地链路可用的 IP 地址,一般不涉及其他复杂的网络配置参数的分配。

1.7. PPP over Ethernet

QNX RTOS 支持以太网上点到点协议(PPPoE),它常被宽带服务提供商所采用。

QNX 对 PPPoE 的支持包含 io-pkt-* 协议栈以及 pppoectl 实用工具,pppoectl 实用工具可用于协商 PPPoE 会话。一旦 PPPoE 会话建立起来,pppd 守护进程就会创建一个点到点协议(PPP)连接。

当你使用 PPPoE 时,无需指定任何配置参数 —— 我们的模块会自动从你的互联网服务提供商(ISP)那里获取相应的配置数据,并为你完成所有设置工作。

如需更多信息,请查阅《实用工具参考手册》中的以下内容:

  • io-pkt:网络管理器。
  • pppoectl:用于显示或设置 PPPoE 接口的参数。

1.8. /etc/autoconnect

自动连接功能会在任何 TCP/IP 应用程序启动时,自动建立与互联网服务提供商(ISP)的连接。例如,假设你想要启动一个拨号上网连接。当你启动网络浏览器时,它会暂停运行,而“/etc/autoconnect”脚本将会自动拨打你的互联网服务提供商的号码进行拨号连接。当点到点协议(PPP)会话建立起来后,浏览器就会恢复运行。

如需更多信息,请查阅《实用工具参考手册》中关于 “/etc/autoconnect” 的条目内容。

相关文章:

2-2-18-14 QNX系统架构之 TCP/IP 网络

阅读前言 本文以QNX系统官方的文档英文原版资料为参考,翻译和逐句校对后,对QNX操作系统的相关概念进行了深度整理,旨在帮助想要了解QNX的读者及开发者可以快速阅读,而不必查看晦涩难懂的英文原文,这些文章将会作为一个…...

RabbitMQ延迟消息的实现

RabbitMQ延迟队列的实现 延迟消息是什么延迟消息的实现死信交换机代码实现 延迟消息插件 延迟消息是什么 延迟消息是将消息发送到MQ中,消费者不会立即收到消息,而是过一段时间之后才会收到消息,进行处理。在一些业务中,可以用到延…...

Docker 安装 中文版 GitLab

Docker 安装系列 安装GitLab、解决服务器内存不足问题、使用域名/IP地址访问项目 1、拉取 [rootTseng ~]# docker pull twang2218/gitlab-ce-zh:latest latest: Pulling from twang2218/gitlab-ce-zh 8ee29e426c26: Pull complete 6e83b260b73b: Pull complete e26b65fd11…...

Ubuntu22.04深度学习环境安装【Anaconda+Pycharm】

anaconda可以提供多个独立的虚拟环境,方便我们学习深度学习(比如复现论文); Pycharm编辑器可以高效的编写python代码,也是一个很不错的工具。 下面就记录下Ubuntu22.04的安装流程: 1.Anaconda安装 下载Ana…...

springboot整合canal

学习链接 Cannal项目地址 SpringBoot整合Canal实现数据同步到ElasticSearch - 原文地址 Spring Boot整合canal实现数据一致性解决方案解析-部署实战 Java:SpringBoot整合Canal实现数据同步 docker环境安装mysql、canal、elasticsearch,基于binlog利…...

8.在 Vue 3 中使用 OpenLayers 加载天地图示例(多种形式)

前言 OpenLayers 是一个强大的开源地图框架,可以轻松实现地图加载与操作。而 Vue 3 则通过 Composition API 提供了更加简洁和灵活的开发体验。本文将介绍如何在 Vue 3 中结合 OpenLayers 实现对天地图的加载,包括矢量地图、卫星地图以及中文和英文标记等…...

如何设置 Java 开发环境

如果你在这里,可能是想学习如何为 Java 开发设置环境。第一步是安装 SDK(软件开发工具包),它是一组由硬件和软件供应商提供的工具和库。 对于 Java,我们使用 JDK(Java 开发工具包)。JDK 是一组…...

MetaGPT 安装

1. 创建环境 conda create -n metagpt python3.10 && conda activate metagpt2. 可编辑方式安装 git clone --depth 1 https://github.com/geekan/MetaGPT.git cd MetaGPT pip install -e .3. 配置 metagpt --init-config运行命令,在C盘位置C:\Users\325…...

石岩湿地公园的停车场收费情况

周末石岩湿地公园停车场【967个】小车停车费封顶14元价格还行,我还记得2020年的时候湿地公园还是10元一天封顶。现在的收费情况也是可以的,尤其是周末停车比工作日停车便宜还是很得民心的哈。 车型 收费标准 小车 工作日 高峰时间8:00~20:00 首小时…...

v3账号密码登录随机图片验证码

安装插件 pnpm i identify --save图形验证码组件 <template><div class"s-canvas"><!-- 图形验证码的宽和高都来自于父组件的传值&#xff0c;若父组件没有传值&#xff0c;那么就按当前子组件的默认值进行渲染 --><canvas id"s-canvas&…...

mysql8 主从复制一直失败

问题描述&#xff1a; 开启同步后从服务器一直失败&#xff0c;报错如下&#xff1a; Last_SQL_Error: Coordinator stopped because there were error(s) in the worker(s). The most recent failure being: Worker 1 failed executing transaction ANONYMOUS at source log …...

Java项目实战II基于微信小程序的消防隐患在线举报系统(开发文档+数据库+源码)

目录 一、前言 二、技术介绍 三、系统实现 四、核心代码 五、源码获取 全栈码农以及毕业设计实战开发&#xff0c;CSDN平台Java领域新星创作者&#xff0c;专注于大学生项目实战开发、讲解和毕业答疑辅导。获取源码联系方式请查看文末 一、前言 随着城市化进程的加快&…...

【第二十四周】从大语言模型到多模态大模型的发展

摘要 大语言模型&#xff08;Large Language Model, LLM&#xff09;是指一类基于深度学习的人工智能系统&#xff0c;它们被设计用来理解和生成自然语言。这些模型通常是在大量的文本数据上进行训练的&#xff0c;通过学习文本中的模式和结构&#xff0c;它们能够执行各种各样…...

深入理解Java的 JIT(即时编译器)

&#x1f9d1; 博主简介&#xff1a;CSDN博客专家&#xff0c;历代文学网&#xff08;PC端可以访问&#xff1a;https://literature.sinhy.com/#/literature?__c1000&#xff0c;移动端可微信小程序搜索“历代文学”&#xff09;总架构师&#xff0c;15年工作经验&#xff0c;…...

数据库技术文档撰写:全方位剖析

在技术的浩瀚海洋中&#xff0c;一份优秀的技术文档宛如精准的航海图。它是知识传承的载体&#xff0c;是团队协作的桥梁&#xff0c;更是产品成功的幕后英雄。然而&#xff0c;打造这样一份出色的技术文档并非易事。你是否在为如何清晰阐释复杂技术而苦恼&#xff1f;是否纠结…...

设计模式之原型模式:深入浅出讲解对象克隆

~犬&#x1f4f0;余~ “我欲贱而贵&#xff0c;愚而智&#xff0c;贫而富&#xff0c;可乎&#xff1f; 曰&#xff1a;其唯学乎” 原型模式概述 在我们的日常生活中&#xff0c;经常会遇到"复制"这样的场景。比如我们在准备文件时&#xff0c;常常会复印一份原件&a…...

centos 查看版本

在 CentOS 中&#xff0c;查看系统版本有多种方法。以下是几种常用的方法&#xff1a; 方法 1&#xff1a;使用 cat 命令查看 /etc/centos-release 文件 cat /etc/centos-release 这个文件包含了 CentOS 的版本信息。例如&#xff0c;输出可能是&#xff1a; CentOS Linux rel…...

如何本地存储中的文件路径

文章目录 1. 概念介绍2. 实现方法3. 示例代码我们在上一章回中介绍了"如何实现本地存储"相关的内容,本章回中将介绍如何实现文件存储.闲话休提,让我们一起Talk Flutter吧。 1. 概念介绍 我们在上一章回中介绍的本地存储只能存储dart语言中基本类型的数值,如果遇到…...

服务器加固

1.服务器密码复杂度 密码最小长度&#xff0c;密码复杂度策略 vim /etc/pam.d/system-auth --------------- #密码配置 #ucredit&#xff1a;大写字母个数&#xff1b;lcredit&#xff1a;小写字母个数&#xff1b;dcredit&#xff1a;数字个数&#xff1b;ocredit&#xff1a;…...

MongoDB change stream实战

什么是 Chang Stream Change Stream指数据的变化事件流&#xff0c;MongoDB从3.6版本开始提供订阅数据变更的功能。 Change Stream 是 MongoDB 用于实现变更追踪的解决方案&#xff0c;类似于关系数据库的触发器&#xff0c;但原理不完全相同&#xff1a; Change Stream 的实…...

TSWIKI知识库软件

TSWIKI 知识库软件介绍 推荐一个适合本地化部署、自托管的知识库软件 TSWIKI介绍 tswiki 是一个适合小团队、个人的知识库、资料管理的软件&#xff0c;所有数据均本地化存储。可以本地化、私有云部署&#xff0c;安装简单。在线预览。 主要功能说明 1、简化的软件依赖和安…...

【Linux课程学习】第十九弹---深入理解进程间通信---匿名管道,命名管道,多匿名管道的BUG

&#x1f381;个人主页&#xff1a;我们的五年 &#x1f50d;系列专栏&#xff1a;Linux课程学习 &#x1f337;追光的人&#xff0c;终会万丈光芒 &#x1f389;欢迎大家点赞&#x1f44d;评论&#x1f4dd;收藏⭐文章 ​ Linux学习笔记&#xff1a; https://blog.csdn.n…...

【C语言】库函数常见的陷阱与缺陷(1):字符串处理函数

目录 一、 strcpy 函数 1.1. 功能与常见用法 1.2. 陷阱与缺陷 1.3. 安全替代 1.4. 代码示例 二、strcat 函数 2.1. 功能与常见用法 2.2. 陷阱与缺陷 2.3. 安全替代 2.4. 代码示例 三、strcmp 函数 3.1. 功能与常见用法 3.2. 陷阱与缺陷 3.3. 安全替代 3.4. 代…...

Qt中的 tableView 设置 二进制 十六进制 序号表头

二 进制序号 因为QTableView的垂直表头并不支持使用委托来自定义。 相反&#xff0c;可以通过将自定义的QWidget作为QHeaderView的标签来实现这一目标。 代码&#xff1a; #include <QApplication> #include <QMainWindow> #include <QVBoxLayout> #include …...

leetCode121.买卖股票的最佳时机

题目&#xff1a; 给定一个数组prices,它的第i个元素prices[i]表示一支给定股票第i天的价格。 你只能选择某一天买入这只股票&#xff0c;并选择在未来的某一个不同的日子卖出该股票。设计一个算法来计算你所能获取的最大利润。 返回你可以从这笔交易中获取的最大利润。如果你…...

基于单片机的自限位电机正反转控制电路

【摘要】 针对减速直流电机正反转和停转控制问题,设计了正反转及自限位控制电路,编制了基于STM8S103单片机的控制电机正反转及自限位的子程序,并应用IAR软件进行仿真,搭建实验装置验证设计效果,实验结果表明所设计控制电路能够良好地控制电机正转、反转和停转,在生活实际…...

为什么使用 Token 而不是 Cookie 来管理用户认证和会话

使用 Token 而不是 Cookie 来管理用户认证和会话的原因主要有以下几点&#xff1a; 跨域问题 (Cross-Domain) Token&#xff1a;通常是存储在客户端的 localStorage 或 sessionStorage 中&#xff0c;不会自动随请求发送到服务器&#xff0c;这使得它在处理跨域请求时更加灵活…...

WIDER FACE数据集转YOLO格式

1. 引出问题 本人最近在做毕设相关内容&#xff0c;第一阶段目标是通过目标检测来统计课堂人数&#xff0c;因此需要对人脸和人头进行目标检测。模型方面没什么好说的无脑用YOLO&#xff0c;数据集方面&#xff0c;人脸部分找到了来自港中文的WIDER FACE数据集。但是解压后发现…...

机器学习概述详解

文章目录 机器学习概述详解一、引言二、机器学习基础1、机器学习定义及应用场景2、监督学习与无监督学习 三、机器学习开发流程四、使用示例1、LeNet网络结构代码示例2、AlexNet网络结构代码示例 五、总结 机器学习概述详解 一、引言 机器学习作为人工智能的一个重要分支&…...

VTK编程指南<三>:基于VTK入门程序解析来理解VTK基础知识

1、VTK入门程序 下面是一个完整的Vtk入门程序&#xff0c;我们基于这个程序来对VTK的基本知识进行一个初步了解。 #include <iostream>#include <vtkAutoInit.h> VTK_MODULE_INIT(vtkRenderingOpenGL2);// VTK was built with vtkRenderingOpenGL2 VTK_MODULE_INI…...

【UE5 C++课程系列笔记】07——使用定时器实现倒计时效果

使用定时器实现如下倒计时效果 效果 步骤 1. 新建一个Actor类&#xff0c;这里命名为“CountDownTimerActor” 2. 在头文件中先定义倒计时时间和更新剩余时间的函数方法 前向声明一个文本渲染组件 3. 在源文件中引入文本渲染组件 创建文本渲染组件并进行一些设置 实现Update…...

基于DDPM的PyTorch简单实现

基于DDPM的PyTorch简单实现 文章目录 基于DDPM的PyTorch简单实现摘要Abstract一、DDPM实现1. 获取数据集2. DDPM类3. 训练算法4. 去噪神经网络5. 实验结果与采样 总结 摘要 本周的学习与实践围绕扩散模型&#xff08;Diffusion Model&#xff09;的基础理论和实现展开&#xf…...

php laravel 学习管理系统(LMS)

Lernen LMS&#xff08;学习管理系统&#xff09;是一个综合性的在线教育平台&#xff0c;旨在为学生和导师提供灵活、高效、便捷的学习体验。该系统不仅帮助学生找到最适合自己的导师&#xff0c;还通过一系列强大的功能&#xff0c;提升了课程安排、学习管理和师生互动的效率…...

【JAVA】Java高级:数据库监控与调优:SQL调优与执行计划的分析

作为Java开发工程师&#xff0c;理解SQL调优和执行计划的分析是至关重要的。这不仅可以帮助我们提高数据库查询的效率&#xff0c;还能减少系统资源的消耗&#xff0c;提升整体应用的性能。 1. SQL调优的重要性 随着数据量的增加和用户请求的增多&#xff0c;数据库的性能问题…...

centos9升级OpenSSH

需求 Centos9系统升级OpenSSH和OpenSSL OpenSSH升级为openssh-9.8p1 OpenSSL默认为OpenSSL-3.2.2&#xff08;根据需求进行升级&#xff09; 将源码包编译为rpm包 查看OpenSSH和OpenSSL版本 ssh -V下载源码包并上传到服务器 openssh最新版本下载地址 wget https://cdn.openb…...

jeccg-boot修改密码

最近在使用jeccg-boot框架&#xff0c;遇到一个需要批量修改用户密码的问题 由于框架使用的是加密盐算法生成的密码 &#xff0c;无法直接通过数据库修改密码 例如将password字段和salt值复制过去&#xff0c;密码是不对的 查看代码发现通过user.getUsername(), user.getPasswo…...

linux 生成 nginx 的https ssl 证书详解

证书生成 1. 生成证书 会提示输入密码&#xff0c;输入两次相同密码即可。 openssl genrsa -des3 -out server.key 20482. 去除密码校验 如果想去除此输密码的步骤&#xff0c;可以执行如下命令&#xff0c;根据使用需求选择。 openssl rsa -in server.key -out server.ke…...

详细介绍vue的递归组件(重要)

递归组件在 Vue 中是一个非常强大的概念&#xff0c;尤其在渲染层级结构&#xff08;如树形结构、嵌套列表、评论系统等&#xff09;时&#xff0c;能够极大地简化代码。 什么是递归组件&#xff1f; 递归组件就是一个组件在其模板中引用自身。这种做法通常用于渲染树形结构或…...

gitlab配置调试minio

官方文档 rails console 调试 查看配置Settings.uploads.object_store加载minio clientrequire fog/awsfog_connection Fog::Storage.new(provider: AWS,aws_access_key_id: 你的MINIO_ACCESS_KEY,aws_secret_access_key: 你的MINIO_SECRET_KEY,region: <S3 region>,e…...

Docker(Nginx) 部署 uniapp

目录 一、准备工作 1.Docker安装nginx 2.安装HBuild X工具 二、HBuild X打包项目 1.在HBuild X导入项目 2.配置manifest.json 3.打包 &#xff08;1&#xff09;点击发行 &#xff08;2&#xff09;填写信息&#xff0c;点击发行 三、nginx部署uniapp 1.生成文件上传…...

Camp4-L2:LMDeploy 量化部署进阶实践

书生浦语大模型实战营第四期&#xff1a;LMDeploy 量化部署进阶实践 教程链接&#xff1a;https://github.com/InternLM/Tutorial/tree/camp4/docs/L2/LMDeploy视频链接&#xff1a;https://www.bilibili.com/video/BV18aUHY3EEG/?vd_sourceb96c7e6e6d1a48e73edafa36a36f1697…...

第二十四周学习周报

目录 摘要Abstract1. 文献阅读1.1 RNN1.2 Deep Recurrent Neural Networks1.3 实验1.4 讨论 2. AI虚拟主播生成总结 摘要 本周的主要任务是阅读了一篇关于循环神经网络的论文&#xff0c;该论文旨在探索将RNN扩展到深度RNN的不同方法。论文通过对RNN结构的理解和分析&#xff…...

深入解析 Android PMS —— APK 安装与解析全流程

文章目录 前言1. PMS 的初始化1.1 SystemServer 启动 PMS1.2 PMS 的入口方法 main1.3 PMS 构造函数1.4 扫描 APK 文件1.5 权限初始化1.6 提供对外服务 2. APK 安装机制2.1. 安装请求的触发2.2 APK 文件解析与验证2.3 签名校验2.4 权限管理2.4.1 权限声明2.4.2 权限校验与分配 2…...

RL仿真库pybullet

1. 介绍 PyBullet是一个基于Bullet Physics引擎的物理仿真Python接口&#xff0c;主要用于机器人仿真模拟。 1.1 主要特点 提供大量预设的机器人模型&#xff0c;例如URDF(统一机器人描述格式)、SDF、MJCF 格式。适用于训练和评估强化学习算法&#xff0c;提供了大量的强化学…...

Vue3组件通信(父传子,子传父,跨组件通信)

本文主要是讲述Vue3在setup语法糖下的组件间通信 Vue组件通信是指在Vue.js中&#xff0c;不同组件之间进行信息交流和共享数据的过程。在前端开发中&#xff0c;组件通信是非常重要的一部分&#xff0c;因为在一个复杂的应用中&#xff0c;不同的组件通常需要相互协作&#xff…...

从失败中学习:如何将错误转化为学习机会

失败是人生的一部分&#xff0c;无论是在个人生活还是职业生涯中&#xff0c;我们都难免会遇到挫折和错误。然而&#xff0c;失败并不意味着终结&#xff0c;而是一个潜在的学习机会。通过正确的态度和方法&#xff0c;我们可以从失败中汲取经验&#xff0c;转化为成长的动力。…...

[0629].第29节:配置中心业务规则与动态刷新

我的后端学习大纲 SpringCloud学习大纲 1、编码实现3377服务&#xff1a; 1.1.建module: 1.2.改pom: 1.3.写YML&#xff1a; 1.Nacos同Consul一样&#xff0c;在项目初始化时&#xff0c;要保证先从配置中心进行配置拉取&#xff0c;拉取配置之后&#xff0c;才能保证项目的正…...

JUC并发编程

进程&#xff1a;系统中正在运行的一个应用程序&#xff0c;程序一旦运行就是进程&#xff0c;是资源分配的最小单元。 线程&#xff1a;系统分配处理器时间资源的基本单元&#xff0c;进程之内独立执行的一个单元执行流&#xff0c;是程序执行的最小单位。 Lock 需要手动上…...

贪心算法解题方法介绍+实操案例——会场安排与月饼售卖问题解析

从贪心算法到实操案例——会场安排与月饼售卖问题解析 前言 贪心算法是一种通过选择局部最优解来尝试构建全局最优解的算法。它简单高效&#xff0c;适用于许多优化问题。本文将详细介绍贪心算法的一般解题步骤&#xff0c;并通过两个实例——月饼售卖问题和会场安排问题——…...

ASP.NET Core API 前后端分离跨域

环境准备 数据库&#xff1a; sqlserver 2022 后端&#xff1a; vs2022 ASP.NET Core API .net 8 前端&#xff1a; Hbuilderx bootstrap 5.3.0 jquery v3.7.1 bootstrap-table 1.23.5 完整项目代码下载地址 功能 实现 单张表 的 增 删 改 查 创建数据库和表 create data…...