PARTV-Oracle实例架构-应用和网络架构

news/2024/11/17 16:01:09/文章来源:https://www.cnblogs.com/crispy-bro/p/18436626

16. 应用和网络架构

16.1. Oracle应用架构

在本章的上下文中,应用架构指的是数据库应用程序连接到 Oracle 数据库的计算环境。

16.1.1. 客户端与服务端架构概述

在 Oracle 数据库环境中,数据库应用程序和数据库被分离成客户端/服务器架构:

  • 客户端运行数据库应用程序,例如 SQL*Plus 或 Visual Basic 数据输入程序,它访问数据库信息并与用户交互。
  • 服务器运行 Oracle 数据库软件,并处理所需的功能,以便并发、共享地访问 Oracle 数据库。
    尽管客户端应用程序和数据库可以在同一台计算机上运行,但通常当客户端部分和服务器部分由通过网络连接的不同计算机运行时,可以获得更高的效率。以下部分讨论了 Oracle 数据库客户端/服务器架构的变体。

16.1.1.1. 分布式处理

使用多个主机来处理单个任务被称为分布式处理。前端和后端处理发生在不同的计算机上。在图16-1中,客户端和服务器位于通过Oracle Net服务连接的不同主机上。

图16-2是一个变体,它描绘了一个分布式数据库。在这个例子中,一个主机上的数据库访问位于另一个不同主机上的单独数据库的数据。

注意:本章的剩余部分适用于一台服务器上一个数据库的环境。

16.1.1.2. 客户端/服务器架构的优势

Oracle Database 在分布式处理环境中的客户端/服务器架构提供了以下优势:

  • 客户端应用程序不负责执行数据处理。相反,它们从用户那里请求输入,从服务器请求数据,然后使用客户端工作站或终端(例如,使用图形或电子表格)的显示功能分析和展示这些数据。
  • 客户端应用程序不依赖于数据的物理位置。即使数据被移动或分布到其他数据库服务器上,应用程序仍然可以几乎不需要或不需要修改地继续运行。
  • Oracle Database 利用其底层操作系统的多任务处理和共享内存设施。因此,它为客户端应用程序提供了尽可能高的并发性、数据完整性和性能。
  • 客户端工作站或终端可以针对数据的展示进行优化(例如,提供图形和鼠标支持),而服务器可以针对数据处理和存储进行优化(例如,拥有大量的内存和磁盘空间)。
  • 在网络环境中,您可以使用廉价的客户端工作站有效地访问服务器的远程数据。
  • 随着系统的扩展,数据库可以进行扩展。您可以添加多台服务器将数据库处理负载分布到整个网络中(水平扩展),或者可以将数据库迁移到小型计算机或大型机上以利用更大型系统的性能(垂直扩展)。在任何情况下,数据和应用程序都可以几乎不需要或不需要修改地进行维护,因为Oracle Database在系统之间是可移植的。
  • 在网络环境中,共享数据存储在服务器上,而不是存储在所有计算机上,这使得管理和并发访问更加容易和高效。
  • 在网络环境中,客户端应用程序使用SQL语句向服务器提交数据库请求。收到后,每个SQL语句由服务器处理,服务器将结果返回给客户端。因为只有请求和结果通过网络传输,所以网络流量被最小化。

16.1.2. 多层架构概述

在传统的多层架构环境中,应用服务器为客户端提供数据,并充当客户端和数据库服务器之间的接口。这种架构允许使用应用服务器来:

  • 验证客户端的凭据,如Web浏览器
  • 连接到数据库服务器
  • 执行请求的操作

多层架构的一个例子出现在图16-3中。

16.1.2.1. 客户端

客户端发起对数据库服务器执行操作的请求。客户端可以是Web浏览器或其他最终用户程序。在多层架构中,客户端通过一个或多个应用服务器连接到数据库服务器。

16.1.2.2. 应用服务器

应用服务器为客户端提供数据访问。它充当客户端和一个或多个数据库服务器之间的接口,并托管应用程序。应用服务器允许配置最小软件的瘦客户端访问应用程序,而不需要持续维护客户端计算机。应用服务器还可以为客户端执行一些数据重新格式化,减轻客户端工作站的负载。

应用服务器在代表客户端对数据库服务器执行操作时,会假定客户端的身份。应限制应用服务器的权限,以防止它在客户端操作期间执行不必要和不需要的操作。

16.1.2.3. 数据库服务器

数据库服务器提供应用服务器代表客户端请求的数据。数据库执行所有的查询处理。

数据库服务器可以审计应用服务器代表客户端执行的操作以及应用服务器自身执行的操作(见第17-6页的“监控”)。例如,客户端操作可以请求在客户端显示的信息,而应用服务器操作可以请求连接到数据库服务器。

16.1.2.4. 面向服务的架构(SOA)

数据库可以在传统的多层或面向服务的架构(SOA)环境中充当Web服务提供者。SOA是一种依赖于服务的多层架构,这些服务支持通过网络进行计算机之间的交互。这些服务可以被动态地发现,并查询其可用功能和调用序列。SOA服务通常实现为可通过HTTP协议访问的Web服务。它们基于XML标准,如WSDL和SOAP。Oracle数据库的Web服务功能,作为XML DB的一部分实现,必须由数据库管理员(DBA)明确启用。应用程序随后可以通过数据库Web服务实现以下功能:

  • 提交SQL或XQuery查询,并将结果以XML格式接收
  • 调用独立的PL/SQL函数并接收结果(见第8-3页的“PL/SQL子程序”)
  • 调用PL/SQL包函数并接收结果

数据库Web服务为在应用环境添加Web服务提供了一种简单的方法,无需应用服务器。然而,通过诸如Oracle Fusion Middleware这样的应用服务器调用Web服务,在SOA环境中提供了安全性、可扩展性、UDDI注册和可靠的消息传递。然而,由于数据库Web服务与Oracle Fusion Middleware易于集成,它们可能适用于优化SOA解决方案。

16.1.3. 网格架构概述

在Oracle数据库环境中,网格计算是一种计算架构,它能够将大量的服务器和存储资源有效地汇集成一个灵活的、按需分配的计算资源。可以根据企业变化的需求,按需连接和重新组合模块化的硬件和软件组件。

16.2. Oracle网络架构

Oracle Net Services是一套网络组件,提供了在分布式、异构计算环境中的企业级连接解决方案。Oracle Net Services支持从应用程序到数据库实例以及从一个数据库实例到另一个数据库实例的网络会话。

Oracle Net Services提供位置透明性、集中配置和管理以及快速安装和配置。它还允许您最大限度地利用系统资源并提高性能。Oracle数据库共享服务器架构提高了应用程序的可扩展性以及同时连接到数据库的客户端数量。虚拟接口(VI)协议将大部分消息传递负担放在高速网络硬件上,释放了CPU。

Oracle Net Services使用各种网络支持的通信协议或应用程序编程接口(APIs)来提供分布式数据库和分布式处理。建立网络会话后,Oracle Net Services充当客户端应用程序和数据库服务器的数据信使,建立并维护连接并交换消息。Oracle Net Services之所以能够执行这些任务,是因为它存在于网络中的每台计算机上。

16.2.1. Oracle Net服务的工作方式

Oracle数据库协议从Oracle应用程序的接口处获取SQL语句,并通过支持的行业标准高级协议或API将它们打包传输到Oracle数据库。来自Oracle数据库的回复也通过相同的高级通信机制进行打包。这项工作独立于网络操作系统进行。

根据运行Oracle数据库的操作系统不同,数据库服务器的Oracle Net Services软件可能包括驱动软件,并启动一个额外的后台进程。

16.2.2. Oracle Net监听器

Oracle Net监听器,也称为监听器,是一个服务器端进程,它监听传入的客户端连接请求,并管理数据库的流量。当数据库实例启动时,以及在其生命周期中的不同时间点,该实例会联系一个监听器,并为此实例建立一条通信路径。

服务注册使监听器能够确定数据库服务及其服务处理程序是否可用。服务处理程序是一个专用的服务器进程或调度器,充当连接到数据库的连接点。在注册过程中,PMON进程向监听器提供实例名称、数据库服务名称以及服务处理程序的类型和地址。这些信息使监听器能够在客户端请求到达时启动一个服务处理程序。图16-4显示了两个数据库,每个数据库分别位于不同的主机上。数据库环境由两个监听器提供服务,每个监听器分别位于不同的主机上。每个数据库实例中运行的PMON进程与两个监听器通信以注册数据库。

图16-4显示了一个浏览器通过HTTP连接进行连接,以及一个客户端通过监听器进行数据库连接。监听器不需要位于数据库主机上。

客户端通过监听器建立连接的基本步骤如下:

  1. 客户端进程或另一个数据库请求连接。
  2. 监听器选择一个适当的服务处理程序来处理客户端请求,并将请求转发给该处理程序。
  3. 客户端进程直接连接到服务处理程序。监听器不再参与通信。

16.2.2.1. 服务名

在网络服务的背景下,服务是由一个或多个数据库实例组成的集合。服务名称是用于客户端连接的逻辑表示。

当客户端连接到监听器时,它会请求连接到一个服务。当数据库实例启动时,它会将自己注册到监听器上,提供一个或多个通过名称识别的服务。因此,监听器在客户端和实例之间充当中介,并将连接请求路由到正确的位置。

单个服务,如监听器所知,可以识别一个或多个数据库实例。同时,单个数据库实例也可以向监听器注册一个或多个服务。连接到服务的客户端不需要指定它们需要哪个实例。

图16-5显示了一个与两个服务相关联的单实例数据库:book.example.com和soft.example.com。这些服务允许同一个数据库被不同的客户端以不同的方式识别。数据库管理员可以限制或保留系统资源,允许更好地分配资源给请求这些服务之一的客户端。

16.2.2.2. 服务注册

服务注册是一个功能,通过该功能,PMON进程动态地将实例信息注册到监听器,这使得监听器能够将客户端连接请求转发给适当的服务处理程序。PMON向监听器提供以下信息:

  • 数据库提供的数据库服务名称
  • 与服务关联的数据库实例名称及其当前和最大负载
  • 可用于实例的服务处理程序(调度器和专用服务器),包括它们的类型、协议地址以及当前和最大负载

服务注册是动态的,不需要在listener.ora文件中进行配置。动态注册减少了多个数据库或实例的管理开销。

初始化参数SERVICE_NAMES列出了实例所属的服务。在启动时,每个实例会向属于同一服务的其他实例的监听器注册。在数据库操作期间,每个服务的实例会将关于CPU使用情况和当前连接计数的信息传递给同一服务的所有监听器。这种通信使得动态负载均衡和连接故障转移成为可能。

16.2.3. 专用服务器架构

在专用服务器架构中,代表每个客户端进程创建的服务器进程被称为专用服务器进程(或影子进程)。如图16-6所示,这个服务器进程与客户端进程是分开的,并且仅代表其执行操作。

在专用服务器架构中,客户端进程和服务器进程之间存在一对一的比例关系。即使用户没有主动发起数据库请求,专用服务器进程也会保持存在——尽管它是不活跃的,并且在某些操作系统上可以被分页出去。

图16-6显示了在联网计算机上运行的用户和服务器进程。然而,如果相同的计算机同时运行客户端应用程序和数据库代码,但主机操作系统无法在单个进程中维护这两个程序的分离,也会使用专用服务器架构。Linux就是这样的一个操作系统。

在专用服务器架构中,用户和服务器进程使用不同的机制进行通信:

  • 如果客户端进程和专用服务器进程在相同的计算机上运行,那么程序接口使用主机操作系统的进程间通信机制来执行其工作。
  • 如果客户端进程和专用服务器进程在不同的计算机上运行,那么程序接口提供通信机制(如网络软件和Oracle Net服务)在程序之间进行通信。

未充分利用的专用服务器有时会导致操作系统资源的低效使用。考虑一个具有专用服务器进程的订单输入系统。客户下订单时,店员将订单输入数据库。在大部分交易过程中,店员在与客户交谈,而专门用于店员客户端进程的服务器进程处于空闲状态。在大部分交易过程中不需要服务器进程,如果系统管理了太多进程,系统可能会变慢,影响到其他正在输入订单的店员。对于这类应用程序,共享服务器架构可能更可取。

16.2.4. 共享服务器架构

在共享服务器架构中,调度器将多个传入的网络会话请求导向一组共享服务器进程,从而消除了每个连接都需要一个专用服务器进程的需求。来自池中的空闲共享服务器进程会从公共队列中获取请求。

共享服务器的潜在好处包括:

  • 减少操作系统上的进程数量:少量的共享服务器可以执行与许多专用服务器相同的处理量。
  • 减少实例PGA内存:每个专用或共享服务器都有一个PGA。服务器进程数量减少意味着PGA数量减少,进程管理也更少。
  • 提高应用程序的可扩展性和同时连接到数据库的客户端数量。
  • 当客户端连接和断开连接的速率很高时,可能比专用服务器更快。

共享服务器有几个缺点,包括在某些情况下响应时间较慢、功能支持不完全以及设置和调整的复杂性增加。一般准则是,只有在数据库的并发连接数超过操作系统可以处理的数量时,才使用共享服务器。

共享服务器架构中需要以下进程:

  • 一个网络监听器,将客户端进程连接到调度器或专用服务器(监听器是Oracle Net服务的一部分,不是Oracle数据库的一部分)。

注意:要使用共享服务器,客户端进程必须通过Oracle Net服务连接,即使该进程与Oracle数据库实例在同一台计算机上运行。

  • 一个或多个调度进程(Dnnn)
  • 一个或多个共享服务器进程

需要注意的是,数据库可以同时支持共享服务器和专用服务器连接。例如,一个客户端可以使用专用服务器连接,而另一个客户端可以使用共享服务器连接到同一个数据库。

16.2.4.1. 调度器请求和响应队列

用户的请求是用户SQL语句中的一部分,是一个单一的API调用。当用户发起调用时,会发生以下动作:

  1. 调度器将请求放入请求队列,随后可用的共享服务器进程会从中提取请求。请求队列位于SGA中,并且对一个实例的所有调度进程是公共的(参见第14-21页的“Large Pool”)。

  2. 共享服务器进程会检查公共请求队列中的新请求,并按照先进先出的原则提取新请求。

  3. 一个共享服务器进程从队列中提取一个请求,并执行所有必要的数据库调用以完成这个请求。

    • 每个数据库调用可以由不同的服务器进程处理。因此,解析查询的请求、获取第一行、获取下一行以及关闭结果集的请求可能分别由不同的共享服务器处理。
  4. 服务器进程完成请求后,它会将响应放入调用调度器的响应队列。每个调度器都有自己的响应队列。

  5. 调度器将完成的请求返回给适当的客户端进程。

例如,在订单输入系统中,每个店员的客户端进程连接到一个调度器。店员发出的每个请求都被发送到这个调度器,调度器将请求放入队列。下一个可用的共享服务器提取请求,提供服务,并将响应放入响应队列。当一个请求完成时,店员仍然连接到调度器,但处理请求的共享服务器被释放并可用于其他请求。当一个店员与客户交谈时,另一个店员可以使用同一个共享服务器进程。

图16-7显示了客户端进程如何通过API与调度器通信,以及调度器如何将用户请求传达给共享服务器进程。

调度器进程(Dnnn)允许客户端进程共享有限数量的服务器进程。你可以为单个数据库实例创建多个调度器进程。调度器进程的最佳数量取决于操作系统的限制和每个进程的连接数。

注意:每个连接到调度器的客户端进程都必须使用Oracle Net服务,即使这两个进程在同一台主机上运行。

调度器进程建立通信的方式如下:

  1. 当一个实例启动时,网络监听器进程打开并建立一个通信路径,用户通过它连接到Oracle数据库。

  2. 每个调度器进程给监听器进程一个地址,调度器在这个地址上监听连接请求。对于数据库客户端将要使用的每种网络协议,至少必须配置并启动一个调度器进程。

  3. 当客户端进程发出连接请求时,监听器决定客户端进程是否应该使用共享服务器进程:

    • 如果监听器确定需要一个共享服务器进程,那么监听器返回负载最轻的调度器进程的地址,客户端进程直接连接到调度器。
    • 如果进程无法与调度器通信,或者客户端进程请求一个专用服务器,那么监听器创建一个专用服务器并建立适当的连接。

共享服务器进程(Snnn)在共享服务器配置中为多个客户端请求提供服务。共享服务器进程和专用服务器进程提供相同的功能,除了共享服务器进程不与特定客户端进程关联。相反,共享服务器进程为共享服务器配置中的任何客户端请求提供服务。

共享服务器进程的PGA不包含UGA数据,这些数据必须对所有共享服务器进程可访问(参见第14-4页的“程序全局区域概述”)。共享服务器PGA仅包含进程特定数据。

所有与会话相关的信息都包含在SGA中。每个共享服务器进程必须能够访问所有会话的数据空间,以便任何服务器都可以处理来自任何会话的请求。在SGA中为每个会话的数据空间分配了空间。

16.2.4.2. 共享服务器的受限操作

某些管理活动在连接到调度器进程时无法执行,包括关闭或启动实例和介质恢复。这些活动通常在具有管理员权限的连接下执行。在配置了共享服务器的系统中,要使用管理员权限连接,你必须指定你想要使用专用服务器进程。

16.2.5. 数据库驻留连接池

数据库本地连接池(DRCP)为典型的Web应用程序场景提供了专用服务器的连接池。Web应用程序通常建立数据库连接,短暂使用连接,然后释放它。通过DRCP,数据库可以扩展到数万个同时连接。

DRCP提供以下优势:

  • 补充了中间层连接池,这些连接池在中间层进程中的线程之间共享连接。
  • 允许跨多个中间层进程共享数据库连接。这些中间层进程可能属于同一个或不同的中间层主机。
  • 显著减少了支持许多客户端连接所需的关键数据库资源。例如,DRCP减少了数据库所需的内存,并提高了数据库和中间层的可扩展性。可用服务器池还降低了重新创建客户端连接的成本。
  • 为多进程、单线程应用程序服务器(如PHP和Apache)提供了连接池,这些服务器无法进行中间层连接池。

DRCP使用池化服务器,这相当于专用服务器进程(不是共享服务器进程)和数据库会话的组合。池化服务器模型避免了为每个需要服务器的短暂连接分配专用服务器的开销。

从数据库本地连接池获取连接的客户端连接到一个名为连接代理的Oracle后台进程。连接代理实现了池功能,并将池化服务器多路复用到来自客户端进程的传入连接。

如图16-8所示,当客户端需要数据库访问时,连接代理从池中取出一个服务器进程并将其交给客户端。客户端直接连接到服务器进程,直到请求被服务。服务器完成后,服务器进程被释放回池中。客户端的连接恢复到代理。

在DRCP中,释放资源会保留会话状态,但不再与连接(服务器进程)关联。与共享服务器不同,这个会话将其UGA存储在PGA中,而不是SGA中。客户端可以在检测到活动时透明地重新建立连接。

16.3. 程序接口

程序接口是数据库应用程序和Oracle数据库之间的软件层。程序接口执行以下功能:

  • 提供安全屏障,防止客户端进程破坏性地访问SGA
  • 充当通信机制,格式化信息请求,传递数据,并捕获并返回错误
  • 转换和翻译数据,特别是在不同类型的计算机之间或转换为外部用户程序数据类型

Oracle代码作为服务器,代表应用程序(客户端)执行数据库任务,如从数据块中提取行。程序接口由Oracle数据库软件和操作系统特定软件提供的多个部分组成。

16.3.1. 程序接口结构

程序接口由以下几部分组成:

  • Oracle调用接口(OCI)Oracle运行时库(SQLLIB)
  • 程序接口的客户或用户端
  • 各种Oracle Net服务驱动程序(特定于协议的通信软件)
  • 操作系统通信软件
  • 程序接口的服务器或Oracle数据库端(也称为OPI)

程序接口的用户端和Oracle数据库端运行Oracle软件,驱动程序也是如此。

16.3.2. 程序接口驱动程序

驱动程序是传输数据的软件,通常通过网络传输。它们执行诸如连接、断开连接、发出错误信号和测试错误等操作。驱动程序特定于通信协议。总是有一个默认的驱动程序。你可以安装多个驱动程序,如异步或DECnet驱动程序,并选择一个作为默认驱动程序,但允许用户在连接时指定其他驱动程序。不同的进程可以使用不同的驱动程序。一个进程可以同时连接到单个数据库或使用不同的Oracle Net服务驱动程序连接到多个数据库。

16.3.3. 操作系统的通信软件

连接用户端到程序接口的Oracle数据库端的最低级别软件是通信软件,由主机操作系统提供。DECnet、TCP/IP、LU6.2和ASYNC是一些例子。通信软件可以由Oracle提供,但通常需要单独从硬件供应商或第三方软件供应商处购买。

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

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

相关文章

AB plc设备数据 转profinet IO项目案例

VFBOX协议转换网关支持各种PLC,DLT645,modbus,HJ212,opc ua,opc da,IEC104,IEC61850,EthernetIP,Profinet IO,CCLink,EtherCAT,bacnet,DNP3目录 1 案例说明 1 2 VFBOX网关工作原理 1 3 准备工作 2 4 网关采集AB PLC数据 2 5 用PROFINET IO协议转发数据 4 6 案例总…

代码生成器实践总结

最近,又用我的脚本管理,写了一个代码生成器。 用在一个.net core Web MVC项目中,想要把原来的一些Area,拷贝替换表名。 业务上来说是:把推广模块,单独复制出一个推广-外部渠道的模块。专门给公司外部的推广人员用,但是不影响原来的功能。 本质结构代码生成器 = 模板 + 替…

【管理】销售管理到底应该怎么管?

销售是个数字游戏,销售管理的最终目的就是完成销售业绩。有人说销售管理是门艺术,有人说销售管理是科学。销售是一门艺术,但是可以通过科学的方式将这些艺术固化很多人对销售管理的认识存在很多不同,我们尝试用最为平时的语言总结一下销售管理到底应该管什么?到底怎么管?…

ES6箭头函数的使用

使用箭头函数的目的:引入箭头函数目的是更加更加简短的函数写法并且不绑定this,箭头函数的语法比函数表达式更加简洁 使用场景:箭头函数更加适用于哪些本来需要匿名函数的地方 定义语法:const fn = () => {}使用方式一:括号里面加形参// 箭头函数const fn = (x) => …

方法引用

方法引用 方法: 就是以前学过的方法. 引用: 就是把已有的方法拿过来用. 如何用: 当做函数式接口抽象方法的方法体. 总结: 方法引用就是把已经有的方法拿过来用, 当做函数式接口中抽象方法的方法体. 方法引用的条件:引用处必须是函数式接口.被引用的方法必须是已经存在的.被引用…

一次搞定30天账单,花了十分钟记账

一次搞定30天账单,花了十分钟记账 丑话在前:早出晚归忙奔波,挣钱如针挑土,花钱如水冲沙。挣一毛花十分,一分一厘不容易,开源节流铁公鸡。本教程适用于有复式记账基础的个人,由企业财务系统精简编制的模板,苹果设备 iphone\macbook 请使用 numbers 应用,或使用网页登录…

15 json常见操作与案例 序列化 反序列化

json:本质是一个特定结构的字符串 意义 :打通不同编程语言之间进行相互通信 时的数据格式问题。序列化(python数据类型 转换成 JSON格式化字符串)# python数据类型 转换成 JSON格式化字符串 序列化 import json # python数据类型 info = {"code": 1000, &quo…

16 JSON 爬虫【反序列化】豆瓣

# 没有安装 requests模块 ,需要安装此模块 pip3 install requests import json import requestsres=requests.get(url=https://movie.douban.com/j/search_subjects?type=tv&tag=%E7%83%AD%E9%97%A8&page_limit=50&page_start=0,headers={User-Agent:Mozilla/5.…

19 导入模块成员冲突 总结

成员和冲突 #如果导入的方法存在冲突时,进行取别名 import db as d1 from utils.db import db as d2 #也支持下面的方法导入 from utils.db import x1,x3,x3 from utils.db import * #此方式不推荐 def run():d1.f1()d1.f2()d2.xxx() if __name__ == "__main__":run…

一站式解决方案:10款PM工程项目管理软件深度解析

市面上主流的 10 款PM工程项目管理系统推荐:PingCode、Worktile、飞书、金和项目管理、致远协同办公、Asana、Trello、JIRA、Basecamp、Monday.com。在现代企业管理中,项目的复杂性常常让人感到无从应对,错失进度和预算控制的情况屡见不鲜。选择合适的PM工程项目管理系统,不…

09 模块导入规则 寻找模块 常见问题

模块导入规则 在python内部导入模块时,必须要遵循他的规则,必须去指定的目录中找py文件。 寻找模块一般就三个位置优先在当前运行脚本的同级目录 【一般问题比较多】python的安装目录 【内置模块】python的安装目录+site-packages 【第三方模块】…

WiFi基础(五):802.11帧结构与WiFi控制帧、管理帧、数据帧

802.11 无线 WiFi 有 数据帧,管理帧、控制帧 三种类型帧。这些帧由 9 个部分组成:Frame Control,Duration ID,Address1,Address2,Address3,Seq-ctl,Address4,Frame Body,FCS。需要注意的是,有些组成部分在有些帧里并不是必须的。liwen01 2024.09.22 前言 前面介绍了…