PROGRAM PAGE (80h-10h) 命令详解PROGRAM PAGE (80h-10h) 命令允许主机将数据输入到缓存寄存器，并将数据从缓存寄存器传输至指定的块（Block）和页（Page）地址 LUN的闪存阵列中。执行条件：仅当LUN处于就绪状态（RDY=1, ARDY=1）时，该命令才会被接受。TLC编程要求：必须严格遵循下页（Lower Page）→上页（Upper Page）→ 额外页（eXtra Page）的顺序进行编程：发送 PROGRAM PAGE (80h-10h) 输入下页数据 → 等待 tPBSY发送 PROGRAM PAGE (80h-10h) 输入上页数据 → 等待 tPBSY发送 PROGRAM PAGE (80h-10h) 输入额外页数据 → 等待 tPROGPROGRAM PAGE (80h-10h)PROGRAM PAGE MULTI-PLANE (80h-11h)PROGRAM PAGE CACHE (80h-15h)[80h-11h] → [地址/数据输入] → [80h-15h] → [数据输入] → [10h确认] READ PAGE(00h-30h) 命令详解​从NAND闪存阵列中读取​​单页数据​​至缓存寄存器，并​​启用该缓存寄存器的数据输出​​。执行条件：LUN 需处于就绪状态（RDY=1, ARDY=1）。To read a page from the NAND Flash array, issue 00h to the command register, then write the required address cycles to the address register, and conclude with 30h command. The selected die (LUN) will go busy (RDY = 0, ARDY = 0) for tR as data is transferred.可以看到分析仪上READ PAGE的信号是：00h → [6地址周期] → 30hErase Operations擦除操作是NAND闪存管理的关键环节，用于将指定块（Block）的所有存储单元重置为"1"状态，为后续编程操作做准备。擦除操作以块为最小单位执行，无法单独擦除单个页（Page）。单块擦除操作（ERASE BLOCK 60h-D0h）​可以看到分析仪上ERASE BLOCK的信号是：60h → [4地址周期] → D0hERASE BLOCK (60h-D0h)：60h:此时cle拉高，发送60h命令；00h，00h，02h，00h：接着cle拉低，ale拉高，发送4个 address (00，00，02，00)；D0h:此时cle拉高，发送D0命令，从 60h 到 D0h 表示单块擦除操作；在这个过程中，CE处于拉低的状态；多平面擦除操作（ERASE BLOCK MULTI-PLANE 60h-D1h）​[60h-D1h] → [平面A地址] → [60h-D1h] → [平面B地址] → 60h-D0h
04_20210916_b47r_fortis_512gb_nand_datasheet_Ver.L.pdfGeneral DescriptionI/Os transfer commands, address, and data: DQxfive control signals: CE#, CLE, ALE, WE#, and RE#.control hardware write protection: WP#monitor device status: R/B#bidirectional data strobe: DQSSignalTypeDescriptionALEInputAddress latch enable: Loads an address from DQx into the address register.CE#InputChip enable: Enables or disables one or more die (LUNs) in a target.CLEInputCommand latch enable: Loads a command from DQx into the command register.DQxI/OData inputs/outputs: The bidirectional I/Os transfer address, data, and command information.DQS, DQS_tI/OData strobe: Provides a synchronous reference for data input and output.DQS_cI/OData strobe complement: Provides a complementary signal to the data strobe signal optionally used for reference for data input and output.RE#, RE_tInputRead enable: RE# transfers serial data from the NAND Flash to the host system.RE_cInputRead enable complement: Provides a complementary signal to the read enable signal optionally used for reference for data output.WE#InputWrite enable: WE# transfers commands, addresses.WP#InputWrite protect: Enables or disables array PROGRAM and ERASE operations.R/B#OutputReady/busy: An open-drain, active-low output that requires an external pull-up resistor. This signal indicates target array activity.VccSupplyVcc: Core power supplyVccqSupplyVccq: I/O power supplyVppSupplyVpp: The VPP signal is an optional external high voltage power supply to the device. This high voltage power supply may be used to enhance operations (for example, improved power efficiency). If VPP will not be utilized by a host system, that VPP signal location is then defined as a DNU signal location.VssSupplyVss: Core ground connectionVssqSupplyVssq: I/O ground connectionVrefqSupplyVrefq: Reference voltageZQ-Reference pin for ZQ calibration: This is used on ZQ calibration. The ZQ signal shall be connected to Vss through RZQ resistor.NC-No connect: NCs are not internally connected. They can be driven or left unconnected.DNU-Do not use: DNUs must be left unconnected.RFU-Reserved for future use: RFUs must be left unconnected.Notes: 1. See Device and Array Organization and Signal Assignment sections for detailed signal connections.See Bus Operation – NV-DDR3 Interface for detailed signal descriptions.ArchitectureBus Operation – NV-DDR3 InterfaceDifferential SignalingWarmup CyclesWarmup Cycle RestrictionsOn-Die TerminationSelf-Termination On-Die TerminationConceptCopyback operations: Copyback操作是指将一个页的数据直接拷贝到同一块内的另一个页，无需先将数据读取到外部主存储器的缓冲区，可减少数据传输时间，提高编程效率和系统整体性能。
SSD 基本工作原理SSD 硬件组成部分SSD（Soild State Drive） 的硬件包括几大部分：主控、闪存、缓存芯片DRAM、PCB、接口。SSD 主要有三大功能模块组成前端接口和相关的协议模块；中间的FTL（Flash Translation Layer）模块；后端和闪存通信模块；SSD前端负责和主机直接通信，接受主机发送来的命令和数据，命令经SSD处理后（FTL模块），最终交由前端将命令状态或数据返回给主机。SSD的写和读操作主机通过接口发送写命令给SSD，SSD接收到命令后执行，并接受主机将要写入的数据。数据一般会先缓存在SSD内部的RAM中，FTL为每个逻辑数据块分配一个闪存地址，当数据凑到一定数量后，FTL（FTL主要完成逻辑数据到闪存空间的映射）发送写入闪存请求给后端，后端根据写请求，把缓存里的数据写到对应的NAND内存空间。当主机发来读命令时，SSD能根据需要读取的逻辑数据块查找映射表（逻辑地址到物理地址转换的映射表），获取这些逻辑数据在闪存空间的位置，后端便能从闪存上把对应数据读到SSD内部缓存空间，然后前端负责把这些数据返回给主机。SSD 指标工作温度范围： 0~70℃，非工作温度范围：-50~90℃性能指标：IOPS（读写性能）、吞吐量（顺序读写）、响应时间/延时Endurance：(for example: 200GB SSD)10 DWPD（Drive Writes Per Day）for 5 yearsTBW（Terabytes Written）: 10 * 200 GB * 365 * 5 ≈ 3600 TB数据可靠性：​​UBER​​：Uncorrectable Bit Error Rate，不可修复的错误比特率，在闪存应用中，指已经经过纠错码纠错，但仍无法纠正所有错误，与预期数据相较下的纠码失败率。​​RBER​​：Raw Bit Error Rate，原始的错误比特率，从闪存内读出，尚未经过纠错码纠错，与预期数据相较下的误码率。MTBF​​：Mean Time Between Failure，平均无故障工作时间，是衡量一个的可靠性指标。功耗：Max active、Active、Idle、Standby、Sleep、DevSleep最大功耗与发热控制：SSD 最大功耗是 ASIC 主控 和 闪存模块。当SSD温度传感器侦测到温度达到阈值，如70℃时，固件会启动降温算法模块，限制闪存后端并发写的个数。当温度下降到阈值70℃以下后，SSD固件会重新恢复到正常的后端写并发个数。SSD系统兼容性：BIOS和OS的兼容性（从测试角度）OS、CPU、BIOS、应用程序电信号和硬件兼容性容错处理在主机端发生错误的条件下，SSD即使不能正常和主机交互数据，也至少要保证不变砖。从设计角度考虑加入容错模块、加大系统兼容性测试的覆盖面，这些都是提高SSD系统兼容性的手段和方法。BIOS 和 SSD 交互SSD 上电加载后，主机 BIOS 开始自检，主机中的 BIOS 作为第一层软件和 SSD 进行交互的步骤如下：和SSD发生连接，SATA 和 PCIe 走不同的底层链路连接，协商（negotiate）到正确的速度上，自此主机端和 SSD 连接成功；发出识别 SSD 的命令（如 SATA Identify）来读取 SSD 的基本信息，基本信息包括产品型号（part number）、FW 版本号、产品版本号等，BIOS 会验证信息的格式和数据的正确性；读取 SSD 的其他信息，如 SMART（Self-Monitoring, Analysis, and Reporting Technology），直到 BIOS 找到硬盘上的主引导记录 MBR（Master Boot Record），加载 MBR；MBR 开始读取硬盘分区表 DPT（Disk Partition Table），找到活动分区中的分区引导记录 PBR （Partition Boot Record），并且把控制权交给PBR；SSD 通过数据读写功能来完成 OS 加载。SSD Driver 关键技术ID管理纠错算法逻辑物理映射磨损平衡（wear-Leveling）垃圾回收（Garbage Collection）缓存策略掉段保护（Sudden Power Off Recovery, SPOR）NAND 体系架构Cache Registers: 供资料暂存或测试程式用，其读取跟写入速度都很快，断电后资料会遗失。Data Registers: 用來暂存要放到page或从page取出的資料。​​NAND 闪存接口（如 ALE/CLE）​​：NAND 闪存的接口是​​并行总线​​（如 8 位 I/O），用于控制闪存芯片的操作（读/写/擦除）。​​ALE（Address Latch Enable）​​：锁存地址信息。CLE（Command Latch Enable）​​：锁存命令信息。​其他控制信号​​：WE#（写使能）、RE#（读使能）、CE#（片选）等。DQs: 数据选通，为数据输入/输出提供同步参考时钟DQs_t: 数据选通互补信号，NV-DDR2/DDR3接口中用于数据同步的互补参考信号ENi: 枚举输入，支持CE#引脚减少功能，菊花链中前一个NAND设备的ENo输出ENo: 枚举输出，连接至菊花链中下一个NAND设备的ENi引脚R/B#：就绪/忙，开漏输出（低电平有效），需外接上拉电阻，指示阵列活动状态VCC： 核心电源VCCQ： I/O电源VPP：可选高压电源，用于增强操作（如提升能效）VSS：核心地VSSQ：I/O地VREFQ：参考电压，用于NV-DDR2/DDR3接口ZQ：需通过RZQ电阻接地NC：无连接，内部未连接，可悬空或驱动DNU：请勿使用，必须悬空RFU：保留未来使用，必须悬空数据线​​：通常为 8 位并行 I/O 总线（非差分信号），复用传输数据、地址和命令。PCIe 是 SSD ​​与主机通信​​的高速串行接口，而 ALE/CLE 是 SSD ​​主控与 NAND 闪存芯片通信​​的并行控制信号。LUN （Logical Unit Number，逻辑单元号）在SSD中，LUN通常对应NAND闪存芯片的Die（晶圆）或Plane（平面），是主控管理闪存操作的最小逻辑单元。Asynchronous Interface Mode Selection
ROS2 的基础概念ROS是什么？ROS： Robot Operating SystemROS本质上其实就是用于快速搭建机器人的软件库(核心是通信)和工具集。追求的是：稳定、安全和实时的通信能力！ROS2 系统架构可分为5层：操作系统层、DDS实现层、DDS接口层、ROS2客户端层、应用层。操作系统层：为 ROS2 提供了硬件驱动。DDS实现层：数据分布服务（Data Distribution Service），DDS基于实时发布订阅协议（Real-time Publish-Subscribe, RTPS）来实现数据分布。DDS接口层：定义了RMW（ROS Middleware Interface， ROS中间件接口），再由不同DDS进行实现，为ROS2客户端层提供统一的调用接口。ROS2客户端层：提供了ROS2客户端库（ROS2 Client Library，RCL），使用这些库提供的不同接口，可以完成对ROS2可信功能的调用，如话题、服务、参数和动作。应用层：所有基于RCL开发的程序都属于应用层。rclpy 是 ROS 2 中用于 Python 编程的客户端库，它是 ROS Client Library for Python 的缩写，提供了与 ROS 2 系统交互的功能，包括创建节点、发布和订阅消息、调用和提供服务等。rosidl 是 ROS Interface Definition Language 的缩写，是 ROS 2 中用于定义和生成消息（msg）、服务（srv）和动作（action）接口的工具和格式。ROS2 四大核心通信机制话题（Topic）、服务（Service）、参数（Parameter）、动作（Action）话题通信：是指一种发布——订阅通信模式，即发布者将消息发布（Publish）到某个话题上，订阅者订阅（Subscribe）话题即可获取消息，数据是单向传输的。服务通信：服务通信是双向的，可以分为服务端和客户端，客户端发送请求（Request）到服务端，服务端处理并回复结果（Response）。参数通信：用于机器人的参数（Parameter）设定和读取。动作通信：与服务通信相似，但是服务端可以反馈处理进度并可以随时取消，通常用于复杂的机器人行为。
webshttps://docs.ros.org/https://fishros.com/d2lros2/hello-worldROS2 INSTALLsource /opt/ros/rolling/setup.zshExample 1:ros2 run demo_nodes_py listenerros2 run demo_nodes_cpp talkerExample 2:ros2 run turtlesim turtlesim_noderos2 run turtlesim turtle_teleop_keyrqtsome questionshttps://raw.githubusercontent.com ping不通。sudo sed -i 's/^#DNS=/DNS=8.8.8.8 1.1.1.1/' /etc/systemd/resolved.conf sudo systemctl restart systemd-resolved echo "185.199.108.133 raw.githubusercontent.com" | sudo tee -a /etc/hosts curl -v https://raw.githubusercontent.com
计算机网络学习的核心内容就是网络协议的学习。网络协议是为计算机网络中进行数据交换而建立的规则、标准或者说是约定的集合。因为不同用户的数据终端可能采取的字符集是不同的，两者需要进行通信，必须要在一定的标准上进行。1. 网络层次划分为了使不同计算机厂家生产的计算机能够相互通信，以便在更大的范围内建立计算机网络，国际标准化组织（ISO）在1978年提出了"开放系统互联参考模型"，即著名的OSI/RM模型（Open System Interconnection/Reference Model）。它将计算机网络体系结构的通信协议划分为七层，自下而上依次为：物理层（Physics Layer）、数据链路层（Data Link Layer）、网络层（Network Layer）、传输层（Transport Layer）、会话层（Session Layer）、表示层（Presentation Layer）、应用层（Application Layer）。其中第四层完成数据传送服务，上面三层面向用户。除了标准的OSI七层模型以外，常见的网络层次划分还有TCP/IP四层协议以及TCP/IP五层协议，它们之间的对应关系如下图所示：2. OSI七层网络模型TCP/IP协议毫无疑问是互联网的基础协议，没有它就根本不可能上网，任何和互联网有关的操作都离不开TCP/IP协议。不管是OSI七层模型还是TCP/IP的四层、五层模型，每一层中都要自己的专属协议，完成自己相应的工作以及与上下层级之间进行沟通。由于OSI七层模型为网络的标准层次划分，所以我们以OSI七层模型为例从下向上进行一一介绍。1）物理层（Physical Layer）激活、维持、关闭通信端点之间的机械特性、电气特性、功能特性以及过程特性。该层为上层协议提供了一个传输数据的可靠的物理媒体。简单的说，物理层确保原始的数据可在各种物理媒体上传输。物理层记住两个重要的设备名称，中继器（Repeater，也叫放大器）和集线器。2）数据链路层（Data Link Layer）数据链路层在物理层提供的服务的基础上向网络层提供服务，其最基本的服务是将源自网络层来的数据可靠地传输到相邻节点的目标机网络层。为达到这一目的，数据链路必须具备一系列相应的功能，主要有：如何将数据组合成数据块，在数据链路层中称这种数据块为帧（frame），帧是数据链路层的传送单位；如何控制帧在物理信道上的传输，包括如何处理传输差错，如何调节发送速率以使与接收方相匹配；以及在两个网络实体之间提供数据链路通路的建立、维持和释放的管理。数据链路层在不可靠的物理介质上提供可靠的传输。该层的作用包括：物理地址寻址、数据的成帧、流量控制、数据的检错、重发等。有关数据链路层的重要知识点：1> 数据链路层为网络层提供可靠的数据传输； 2> 基本数据单位为帧； 3> 主要的协议：以太网协议； 3> TSN协议：扩展了以太网协议，使其具备高精度的时间同步、低延迟的可靠数据传输能力、流量控制等，IEEE 802.1AS(gPTP), IEEE 802.1Qav(CBS), IEEE 802.1Qbv(TAS) 4> 两个重要设备名称：网桥和交换机。3）网络层（Network Layer）网络层的目的是实现两个端系统之间的数据透明传送，具体功能包括寻址和路由选择、连接的建立、保持和终止等。它提供的服务使传输层不需要了解网络中的数据传输和交换技术。如果您想用尽量少的词来记住网络层，那就是"路径选择、路由及逻辑寻址"。网络层中涉及众多的协议，其中包括最重要的协议，也是TCP/IP的核心协议——IP协议。IP协议非常简单，仅仅提供不可靠、无连接的传送服务。IP协议的主要功能有：无连接数据报传输、数据报路由选择和差错控制。与IP协议配套使用实现其功能的还有地址解析协议ARP、逆地址解析协议RARP、因特网报文协议ICMP、因特网组管理协议IGMP。具体的协议我们会在接下来的部分进行总结，有关网络层的重点为： 1> 网络层负责对子网间的数据包进行路由选择、转发。此外，网络层还可以实现拥塞控制、网际互连等功能； 2> 基本数据单位为IP数据报； 3> 包含的主要协议： IP协议（Internet Protocol，因特网互联协议）; ICMP协议（Internet Control Message Protocol，因特网控制报文协议）; ARP协议（Address Resolution Protocol，地址解析协议）; RARP协议（Reverse Address Resolution Protocol，逆地址解析协议）。 4> 重要的设备：路由器。1. IP协议（Internet Protocol，因特网互联协议）主要作用：IP 协议是网络层协议，用于在计算机网络中进行数据包的路由和转发。它定义了数据包的格式，以及数据从源设备到目标设备如何传输。IP 协议提供了 无连接 和 不可靠 的数据传输服务，这意味着它并不保证数据包的到达，也不维护传输的状态。功能：地址寻址：每个设备都有一个唯一的 IP 地址，IP 协议负责基于目标 IP 地址找到正确的路由来转发数据包。分段和重组：当数据包的大小超过最大传输单元（MTU）时，IP 协议将其分割成更小的片段，并在目标设备处重新组合。类型：IPv4：32 位地址，表示为四个十进制数，如 192.168.1.1。IPv6：128 位地址，解决了 IPv4 地址短缺问题，表示为八组十六进制数。2. ICMP协议（Internet Control Message Protocol，因特网控制报文协议）主要作用：ICMP 协议是网络层协议，主要用于 诊断和错误报告，它帮助网络设备报告错误、传输状态和其他网络诊断信息。ICMP 常见用于 ping 命令 和 Traceroute 等工具，检查主机是否可达，以及网络中间节点的状态。功能：错误报告：当路由器或目标设备无法到达时，会发送 ICMP 错误消息。例如，如果路由器无法找到目标地址，ICMP 会生成 “目标不可达” 消息。诊断工具：通过 ICMP，可以使用工具（如 ping）检查网络连接的状态，以及确定数据包从源到目的地的延迟。常见消息类型：Echo Request / Echo Reply：用于 ping 命令。Destination Unreachable：目标不可达。Time Exceeded：超时，通常出现在 Traceroute 中。*3. ARP协议（Address Resolution Protocol，地址解析协议）主要作用：ARP 协议是(OSI)数据链路层协议(OSI，在TCP/IP中属于网络层协议)，用于在 局域网（LAN）中将 IP 地址 转换为 MAC 地址，因为以太网设备（如路由器、交换机）通常使用 MAC 地址 进行数据链路层通信。ARP 允许设备查找其他设备的物理地址，从而使其能够通过网络发送数据包。功能：IP 到 MAC 地址的映射：当设备需要将数据包发送到局域网内的另一个设备时，它必须知道目标设备的 MAC 地址。设备使用 ARP 查询网络中的其他设备，以获得它们的 MAC 地址。ARP 缓存：设备将 ARP 查询的结果存储在缓存中，以减少网络上的查询次数。过程：发送 ARP 请求，查询目标 IP 地址的对应 MAC 地址。目标设备接收到请求后，将其 MAC 地址回复给源设备。源设备将目标 MAC 地址保存到 ARP 缓存中，以便未来使用。4. RARP协议（Reverse Address Resolution Protocol，逆地址解析协议）主要作用：RARP 协议是(OSI)数据链路层协议(在TCP/IP中属于网络层协议)，主要用于 通过 MAC 地址获取 IP 地址，与 ARP 恰好相反。RARP 通常用于 无硬盘的计算机（如早期的终端） 或 嵌入式设备，这些设备只知道自己的 MAC 地址，但需要获取一个 IP 地址以便进行网络通信。功能：通过 MAC 地址请求 IP 地址：设备发送 RARP 请求到网络中，询问哪个设备拥有某个特定的 MAC 地址。响应设备会返回相应的 IP 地址。使用场景：RARP 一度用于网络启动协议（如 PXE）中，但由于其局限性，后来被 DHCP（动态主机配置协议）替代。RARP 需要维护一个静态的 IP 地址映射表，这对网络管理和规模扩展不方便。总结IP协议：为网络中的设备提供地址和路由功能，确保数据从源设备传输到目标设备。ICMP协议：提供网络诊断和错误报告功能，帮助检测和分析网络问题。ARP协议：将 IP 地址映射到物理地址（MAC 地址），使得局域网内的设备能够进行通信。RARP协议：通过 MAC 地址查找 IP 地址，曾用于无硬盘计算机或嵌入式设备，现在已经被 DHCP 协议取代。4）传输层（Transport Layer）第一个端到端，即主机到主机的层次。传输层负责将上层数据分段并提供端到端的、可靠的或不可靠的传输。此外，传输层还要处理端到端的差错控制和流量控制问题。 传输层的任务是根据通信子网的特性，最佳的利用网络资源，为两个端系统的会话层之间，提供建立、维护和取消传输连接的功能，负责端到端的可靠数据传输。在这一层，信息传送的协议数据单元称为段或报文。 网络层只是根据网络地址将源结点发出的数据包传送到目的结点，而传输层则负责将数据可靠地传送到相应的端口。 有关网络层的重点：1> 传输层负责将上层数据分段并提供端到端的、可靠的或不可靠的传输以及端到端的差错控制和流量控制问题；2> 包含的主要协议：TCP协议（Transmission Control Protocol，传输控制协议）、UDP协议（User Datagram Protocol，用户数据报协议）；3> 重要设备：网关。5）会话层会话层管理主机之间的会话进程，即负责建立、管理、终止进程之间的会话。会话层还利用在数据中插入校验点来实现数据的同步。6）表示层表示层对上层数据或信息进行变换以保证一个主机应用层信息可以被另一个主机的应用程序理解。表示层的数据转换包括数据的加密、压缩、格式转换等。7）应用层为操作系统或网络应用程序提供访问网络服务的接口。会话层、表示层和应用层重点：1> 数据传输基本单位为报文；2> 包含的主要协议：FTP（文件传送协议）、Telnet（远程登录协议）、DNS（域名解析协议）、SMTP（邮件传送协议），POP3协议（邮局协议），HTTP协议（Hyper Text Transfer Protocol）。3. IP地址1）网络地址IP地址由网络号（包括子网号）和主机号组成，网络地址的主机号为全0，网络地址代表着整个网络。2）广播地址广播地址通常称为直接广播地址，是为了区分受限广播地址。广播地址与网络地址的主机号正好相反，广播地址中，主机号为全1。当向某个网络的广播地址发送消息时，该网络内的所有主机都能收到该广播消息。3）组播地址D类地址就是组播地址。先回忆下A，B，C，D类地址吧：A类地址以0开头，第一个字节作为网络号，地址范围为：0.0.0.0~127.255.255.255；B类地址以10开头，前两个字节作为网络号，地址范围是：128.0.0.0~191.255.255.255;C类地址以110开头，前三个字节作为网络号，地址范围是：192.0.0.0~223.255.255.255。D类地址以1110开头，地址范围是224.0.0.0~239.255.255.255，D类地址作为组播地址（一对多的通信）；E类地址以1111开头，地址范围是240.0.0.0~255.255.255.255，E类地址为保留地址，供以后使用。注：只有A,B,C有网络号和主机号之分，D类地址和E类地址没有划分网络号和主机号。4）255.255.255.255255.255.255.255指的是受限广播地址。受限广播地址与一般广播地址（直接广播地址）的区别在于，受限广播地址只能用于本地网络，路由器不会转发以受限广播地址为目的地址的分组；一般广播地址既可在本地广播，也可跨网段广播。例如：主机192.168.1.1/30上的直接广播数据包后，另外一个网段192.168.1.5/30也能收到该数据报；若发送受限广播数据报，则不能收到。注：一般的广播地址（直接广播地址）能够通过某些路由器（当然不是所有的路由器），而受限的广播地址不能通过路由器。5）0.0.0.00.0.0.0常用于寻找自己的IP地址，例如在我们的RARP，BOOTP和DHCP协议中，若某个未知IP地址的无盘机想要知道自己的IP地址，它就以255.255.255.255为目的地址，向本地范围（具体而言是被各个路由器屏蔽的范围内）的服务器发送IP请求分组。6）回环地址127.0.0.0/8被用作回环地址，回环地址表示本机的地址，常用于对本机的测试，用的最多的是127.0.0.1。7）A、B、C类私有地址私有地址(private address)也叫专用地址，它们不会在全球使用，只具有本地意义。A类私有地址：10.0.0.0/8，范围是：10.0.0.0~10.255.255.255B类私有地址：172.16.0.0/12，范围是：172.16.0.0~172.31.255.255C类私有地址：192.168.0.0/16，范围是：192.168.0.0~192.168.255.2554. 子网掩码及网络划分随着互连网应用的不断扩大，原先的IPv4的弊端也逐渐暴露出来，即网络号占位太多，而主机号位太少，所以其能提供的主机地址也越来越稀缺，目前除了使用NAT在企业内部利用保留地址自行分配以外，通常都对一个高类别的IP地址进行再划分，以形成多个子网，提供给不同规模的用户群使用。这里主要是为了在网络分段情况下有效地利用IP地址，通过对主机号的高位部分取作为子网号，从通常的网络位界限中扩展或压缩子网掩码，用来创建某类地址的更多子网。但创建更多的子网时，在每个子网上的可用主机地址数目会比原先减少。什么是子网掩码？子网掩码是标志两个IP地址是否同属于一个子网的，也是32位二进制地址，其每一个为1代表该位是网络位，为0代表主机位。它和IP地址一样也是使用点式十进制来表示的。如果两个IP地址在子网掩码的按位与的计算下所得结果相同，即表明它们共属于同一子网中。在计算子网掩码时，我们要注意IP地址中的保留地址，即" 0"地址和广播地址，它们是指主机地址或网络地址全为" 0"或" 1"时的IP地址，它们代表着本网络地址和广播地址，一般是不能被计算在内的。子网掩码的计算：对于无须再划分成子网的IP地址来说，其子网掩码非常简单，即按照其定义即可写出：如某B类IP地址为 10.12.3.0，无须再分割子网，则该IP地址的子网掩码255.255.0.0。如果它是一个C类地址，则其子网掩码为 255.255.255.0。其它类推，不再详述。下面我们关键要介绍的是一个IP地址，还需要将其高位主机位再作为划分出的子网网络号，剩下的是每个子网的主机号，这时该如何进行每个子网的掩码计算。下面总结一下有关子网掩码和网络划分常见的面试考题： 1）利用子网数来计算在求子网掩码之前必须先搞清楚要划分的子网数目，以及每个子网内的所需主机数目。(1) 将子网数目转化为二进制来表示;如欲将B类IP地址168.195.0.0划分成27个子网：27=11011；(2) 取得该二进制的位数，为N；该二进制为五位数，N = 5(3) 取得该IP地址的类子网掩码，将其主机地址部分的的前N位置1即得出该IP地址划分子网的子网掩码。将B类地址的子网掩码255.255.0.0的主机地址前5位置 1，得到 255.255.248.02）利用主机数来计算如欲将B类IP地址168.195.0.0划分成若干子网，每个子网内有主机700台：(1) 将主机数目转化为二进制来表示；700\=1010111100(2) 如果主机数小于或等于254（注意去掉保留的两个IP地址），则取得该主机的二进制位数，为N，这里肯定 N<8。如果大于254，则 N>8，这就是说主机地址将占据不止8位；该二进制为十位数，N=10；(3) 使用255.255.255.255来将该类IP地址的主机地址位数全部置1，然后从后向前的将N位全部置为 0，即为子网掩码值。将该B类地址的子网掩码255.255.0.0的主机地址全部置1，得到255.255.255.255，然后再从后向前将后 10位置0,即为：11111111.11111111.11111100.00000000，即255.255.252.0。这就是该欲划分成主机为700台的B类IP地址 168.195.0.0的子网掩码。3）还有一种题型，要你根据每个网络的主机数量进行子网地址的规划和计算子网掩码。这也可按上述原则进行计算。比如一个子网有10台主机，那么对于这个子网需要的IP地址是：10＋1＋1＋1＝13注意：加的1是指这个网络连接时所需的网关地址、网络地址和广播地址。因为13小于16（16等于2的4次方），所以主机位为4位。而256－16＝240，所以该子网掩码为255.255.255.240。如果一个子网有14台主机，则主机号为N=5。不少人常犯的错误是：依然分配具有16个地址空间的子网，而忘记了给网关分配地址。这样就错误了，因为14＋1＋1＋1＝17，17大于16，所以我们只能分配具有32个地址（32等于2的5次方）空间的子网。这时子网掩码为：255.255.255.224。5. ARP/RARP协议地址解析协议，即ARP（Address Resolution Protocol），是根据IP地址获取物理地址的一个TCP/IP协议。主机发送信息时将包含目标IP地址的ARP请求广播到网络上的所有主机，并接收返回消息，以此确定目标的物理地址；收到返回消息后将该IP地址和物理地址存入本机ARP缓存中并保留一定时间，下次请求时直接查询ARP缓存以节约资源。地址解析协议是建立在网络中各个主机互相信任的基础上的，网络上的主机可以自主发送ARP应答消息，其他主机收到应答报文时不会检测该报文的真实性就会将其记入本机ARP缓存；由此攻击者就可以向某一主机发送伪ARP应答报文，使其发送的信息无法到达预期的主机或到达错误的主机，这就构成了一个ARP欺骗。ARP命令可用于查询本机ARP缓存中IP地址和MAC地址的对应关系、添加或删除静态对应关系等。ARP工作流程举例：主机A的IP地址为192.168.1.1，MAC地址为0A-11-22-33-44-01；主机B的IP地址为192.168.1.2，MAC地址为0A-11-22-33-44-02；当主机A要与主机B通信时，地址解析协议可以将主机B的IP地址（192.168.1.2）解析成主机B的MAC地址，以下为工作流程：（1）根据主机A上的路由表内容，IP确定用于访问主机B的转发IP地址是192.168.1.2。然后A主机在自己的本地ARP缓存中检查主机B的匹配MAC地址。（2）如果主机A在ARP缓存中没有找到映射，它将询问192.168.1.2的硬件地址，从而将ARP请求帧广播到本地网络上的所有主机。源主机A的IP地址和MAC地址都包括在ARP请求中。本地网络上的每台主机都接收到ARP请求并且检查是否与自己的IP地址匹配。如果主机发现请求的IP地址与自己的IP地址不匹配，它将丢弃ARP请求。（3）主机B确定ARP请求中的IP地址与自己的IP地址匹配，则将主机A的IP地址和MAC地址映射添加到本地ARP缓存中。（4）主机B将包含其MAC地址的ARP回复消息直接发送回主机A。（5）当主机A收到从主机B发来的ARP回复消息时，会用主机B的IP和MAC地址映射更新ARP缓存。本机缓存是有生存期的，生存期结束后，将再次重复上面的过程。主机B的MAC地址一旦确定，主机A就能向主机B发送IP通信了。逆地址解析协议，即RARP，功能和ARP协议相对，其将局域网中某个主机的物理地址转换为IP地址比如局域网中有一台主机只知道物理地址而不知道IP地址，那么可以通过RARP协议发出征求自身IP地址的广播请求，然后由RARP服务器负责回答。RARP协议工作流程：（1）给主机发送一个本地的RARP广播，在此广播包中，声明自己的MAC地址并且请求任何收到此请求的RARP服务器分配一个IP地址；（2）本地网段上的RARP服务器收到此请求后，检查其RARP列表，查找该MAC地址对应的IP地址；（3）如果存在，RARP服务器就给源主机发送一个响应数据包并将此IP地址提供给对方主机使用；（4）如果不存在，RARP服务器对此不做任何的响应；6. 路由选择协议常见的路由选择协议有：RIP协议、OSPF协议。RIP协议 ：底层是贝尔曼福特算法，它选择路由的度量标准（metric)是跳数，最大跳数是15跳，如果大于15跳，它就会丢弃数据包。OSPF协议 ：Open Shortest Path First开放式最短路径优先，底层是迪杰斯特拉算法，是链路状态路由选择协议，它选择路由的度量标准是带宽，延迟。7. TCP/IP协议TCP/IP协议是Internet最基本的协议、Internet国际互联网络的基础，由网络层的IP协议和传输层的TCP协议组成。通俗而言：TCP负责发现传输的问题，一有问题就发出信号，要求重新传输，直到所有数据安全正确地传输到目的地。而IP是给因特网的每一台联网设备规定一个地址。IP层接收由更低层（网络接口层例如以太网设备驱动程序）发来的数据包，并把该数据包发送到更高层---TCP或UDP层；相反，IP层也把从TCP或UDP层接收来的数据包传送到更低层。IP数据包是不可靠的，因为IP并没有做任何事情来确认数据包是否按顺序发送的或者有没有被破坏，IP数据包中含有发送它的主机的地址（源地址）和接收它的主机的地址（目的地址）。TCP是面向连接的通信协议，通过三次握手建立连接，通讯完成时要拆除连接，由于TCP是面向连接的所以只能用于端到端的通讯。TCP提供的是一种可靠的数据流服务，采用"带重传的肯定确认"技术来实现传输的可靠性。TCP还采用一种称为"滑动窗口"的方式进行流量控制，所谓窗口实际表示接收能力，用以限制发送方的发送速度。TCP报文首部格式：TCP协议的三次握手和四次挥手： 注：seq:"sequance"序列号；ack:"acknowledge"确认号；SYN:"synchronize"请求同步标志；；ACK:"acknowledge"确认标志"；FIN："Finally"结束标志。TCP连接建立过程：首先Client端发送连接请求报文，Server段接受连接后回复ACK报文，并为这次连接分配资源。Client端接收到ACK报文后也向Server段发生ACK报文，并分配资源，这样TCP连接就建立了。TCP连接断开过程：假设Client端发起中断连接请求，也就是发送FIN报文。Server端接到FIN报文后，意思是说"我Client端没有数据要发给你了"，但是如果你还有数据没有发送完成，则不必急着关闭Socket，可以继续发送数据。所以你先发送ACK，"告诉Client端，你的请求我收到了，但是我还没准备好，请继续你等我的消息"。这个时候Client端就进入FIN\_WAIT状态，继续等待Server端的FIN报文。当Server端确定数据已发送完成，则向Client端发送FIN报文，"告诉Client端，好了，我这边数据发完了，准备好关闭连接了"。Client端收到FIN报文后，"就知道可以关闭连接了，但是他还是不相信网络，怕Server端不知道要关闭，所以发送ACK后进入TIME\_WAIT状态，如果Server端没有收到ACK则可以重传。"，Server端收到ACK后，"就知道可以断开连接了"。Client端等待了2MSL后依然没有收到回复，则证明Server端已正常关闭，那好，我Client端也可以关闭连接了。Ok，TCP连接就这样关闭了！为什么要三次握手？在只有两次"握手"的情形下，假设Client想跟Server建立连接，但是却因为中途连接请求的数据报丢失了，故Client端不得不重新发送一遍；这个时候Server端仅收到一个连接请求，因此可以正常的建立连接。但是，有时候Client端重新发送请求不是因为数据报丢失了，而是有可能数据传输过程因为网络并发量很大在某结点被阻塞了，这种情形下Server端将先后收到2次请求，并持续等待两个Client请求向他发送数据...问题就在这里，Cient端实际上只有一次请求，而Server端却有2个响应，极端的情况可能由于Client端多次重新发送请求数据而导致Server端最后建立了N多个响应在等待，因而造成极大的资源浪费！所以，"三次握手"很有必要！为什么要四次挥手？试想一下，假如现在你是客户端你想断开跟Server的所有连接该怎么做？第一步，你自己先停止向Server端发送数据，并等待Server的回复。但事情还没有完，虽然你自身不往Server发送数据了，但是因为你们之前已经建立好平等的连接了，所以此时他也有主动权向你发送数据；故Server端还得终止主动向你发送数据，并等待你的确认。其实，说白了就是保证双方的一个合约的完整执行！使用TCP的协议：FTP（文件传输协议）、Telnet（远程登录协议）、SMTP（简单邮件传输协议）、POP3（和SMTP相对，用于接收邮件）、HTTP协议等。8. UDP协议UDP用户数据报协议，是面向无连接的通讯协议，UDP数据包括目的端口号和源端口号信息，由于通讯不需要连接，所以可以实现广播发送。UDP通讯时不需要接收方确认，属于不可靠的传输，可能会出现丢包现象，实际应用中要求程序员编程验证。UDP与TCP位于同一层，但它不管数据包的顺序、错误或重发。因此，UDP不被应用于那些使用虚电路的面向连接的服务，UDP主要用于那些面向查询---应答的服务，例如NFS。相对于FTP或Telnet，这些服务需要交换的信息量较小。每个UDP报文分UDP报头和UDP数据区两部分。报头由四个16位长（2字节）字段组成，分别说明该报文的源端口、目的端口、报文长度以及校验值。UDP报头由4个域组成，其中每个域各占用2个字节，具体如下：（1）源端口号；（2）目标端口号；（3）数据报长度；（4）校验值。使用UDP协议包括：TFTP（简单文件传输协议）、SNMP（简单网络管理协议）、DNS（域名解析协议）、NFS、BOOTP。TCP 与 UDP 的区别：TCP是面向连接的，可靠的字节流服务；UDP是面向无连接的，不可靠的数据报服务。9. DNS协议DNS是域名系统(DomainNameSystem)的缩写，该系统用于命名组织到域层次结构中的计算机和网络服务，可以简单地理解为将URL转换为IP地址。域名是由圆点分开一串单词或缩写组成的，每一个域名都对应一个惟一的IP地址，在Internet上域名与IP地址之间是一一对应的，DNS就是进行域名解析的服务器。DNS命名用于Internet等TCP/IP网络中，通过用户友好的名称查找计算机和服务。10. NAT协议 NAT网络地址转换(Network Address Translation)属接入广域网(WAN)技术，是一种将私有（保留）地址转化为合法IP地址的转换技术，它被广泛应用于各种类型Internet接入方式和各种类型的网络中。原因很简单，NAT不仅完美地解决了lP地址不足的问题，而且还能够有效地避免来自网络外部的攻击，隐藏并保护网络内部的计算机。11. DHCP协议DHCP动态主机设置协议（Dynamic Host Configuration Protocol）是一个局域网的网络协议，使用UDP协议工作，主要有两个用途：给内部网络或网络服务供应商自动分配IP地址，给用户或者内部网络管理员作为对所有计算机作中央管理的手段。12. HTTP协议超文本传输协议（HTTP，HyperText Transfer Protocol)是互联网上应用最为广泛的一种网络协议。所有的WWW文件都必须遵守这个标准。 HTTP 协议包括哪些请求？GET：请求读取由URL所标志的信息。POST：给服务器添加信息（如注释）。PUT：在给定的URL下存储一个文档。DELETE：删除给定的URL所标志的资源。 HTTP 中， POST 与 GET 的区别1）Get是从服务器上获取数据，Post是向服务器传送数据。2）Get是把参数数据队列加到提交表单的Action属性所指向的URL中，值和表单内各个字段一一对应，在URL中可以看到。3）Get传送的数据量小，不能大于2KB；Post传送的数据量较大，一般被默认为不受限制。4）根据HTTP规范，GET用于信息获取，而且应该是安全的和幂等的。I. 所谓 安全的 意味着该操作用于获取信息而非修改信息。换句话说，GET请求一般不应产生副作用。就是说，它仅仅是获取资源信息，就像数据库查询一样，不会修改，增加数据，不会影响资源的状态。II. 幂等 的意味着对同一URL的多个请求应该返回同样的结果。13. 一个举例在浏览器中输入 http://www.baidu.com/ 后执行的全部过程。现在假设如果我们在客户端（客户端）浏览器中输入 http://www.baidu.com， 而 baidu.com 为要访问的服务器（服务器），下面详细分析客户端为了访问服务器而执行的一系列关于协议的操作：1）客户端浏览器通过DNS解析到www.baidu.com的IP地址220.181.27.48，通过这个IP地址找到客户端到服务器的路径。客户端浏览器发起一个HTTP会话到220.161.27.48，然后通过TCP进行封装数据包，输入到网络层。2）在客户端的传输层，把HTTP会话请求分成报文段，添加源和目的端口，如服务器使用80端口监听客户端的请求，客户端由系统随机选择一个端口如5000，与服务器进行交换，服务器把相应的请求返回给客户端的5000端口。然后使用IP层的IP地址查找目的端。3）客户端的网络层不用关系应用层或者传输层的东西，主要做的是通过查找路由表确定如何到达服务器，期间可能经过多个路由器，这些都是由路由器来完成的工作，不作过多的描述，无非就是通过查找路由表决定通过那个路径到达服务器。4）客户端的链路层，包通过链路层发送到路由器，通过邻居协议查找给定IP地址的MAC地址，然后发送ARP请求查找目的地址，如果得到回应后就可以使用ARP的请求应答交换的IP数据包现在就可以传输了，然后发送IP数据包到达服务器的地址。1. 原文链接
关系数据库理论的基础知识一、数据库、数据库技术、数据库系统、数据库管理系统的概念；数据库系统的体系结构二、数据模型与数据视图三、关系代数、关系演算及关系模型四、结构化查询语言 SQL五、数据库的完整性与安全性，事务管理、并发控制、故障恢复，数据库的备份与恢复六、数据库的设计，数据依赖的概念及关系模式的规范化理论七、数据库应用开发工具，常见数据库系统产品的名称、特点，Microsoft SQL Server 数据库的使用一、数据库基础概念数据库（Database） 数据库是一个有组织的、可以长期存储和管理的相关数据集合。数据以一定的结构存储，支持数据的插入、查询、更新和删除等操作。数据库技术（Database Technology） 数据库技术是指用于组织、管理和操作数据库的方法和工具，包括数据库设计、存储管理、数据处理、查询优化等。数据库系统（Database System, DBS） 数据库系统由数据库、数据库管理系统（DBMS）、硬件、软件及用户组成。它是支持数据存储、管理和访问的完整系统。数据库管理系统（Database Management System, DBMS） 数据库管理系统是用于创建、管理和操作数据库的软件。例如：MySQL、Oracle、Microsoft SQL Server 等。数据库系统的体系结构数据库系统通常采用 三层体系结构：外部模式（用户视图） 定义用户如何查看和使用数据库。概念模式（逻辑视图） 定义数据库的逻辑结构，独立于具体的存储方式。内部模式（物理视图） 定义数据在存储设备上的物理组织。二、数据模型与数据视图数据模型 数据模型是数据组织和描述的方式，主要包括：层次模型：用树形结构组织数据。网状模型：用图结构组织数据。关系模型：用二维表表示数据。面向对象模型：结合对象和数据库技术。数据视图 数据视图是用户或应用程序与数据库交互的接口，提供数据的部分或特定视角。三、关系代数、关系演算及关系模型关系模型 数据以表格形式表示，每张表称为一个关系。表由行（元组）和列（属性）组成。关系代数 提供操作关系的基本方法，包括：集合操作：并、交、差。专用操作：选择、投影、连接、分组等。关系演算 描述查询条件的逻辑公式，有两种形式：元组关系演算。域关系演算。四、结构化查询语言 SQLSQL 的组成数据定义语言（DDL）：创建和修改数据库对象，如 CREATE、ALTER、DROP。数据操作语言（DML）：插入、更新、删除数据，如 INSERT、UPDATE、DELETE。数据查询语言（DQL）：查询数据，如 SELECT。数据控制语言（DCL）：控制权限，如 GRANT、REVOKE。SQL 的特点易于学习和使用。独立于具体的 DBMS。支持复杂查询和事务处理。五、数据库的完整性与安全性完整性 确保数据库数据的准确性和一致性：实体完整性：主键不能为 NULL 或重复。参照完整性：外键引用必须合法。用户定义完整性：自定义约束，如 CHECK。安全性 保护数据不被未授权访问或篡改：认证：通过用户名和密码验证用户身份。授权：定义用户对数据库的操作权限。加密：保护敏感数据。事务管理、并发控制与故障恢复事务管理：事务是操作的逻辑单元，具有 ACID 特性（原子性、一致性、隔离性、持久性）。并发控制：使用锁机制、防止数据不一致。故障恢复：通过日志和备份恢复数据。数据库的备份与恢复备份：定期保存数据库的副本。恢复：使用备份和日志重建数据库。六、数据库设计数据库设计步骤需求分析。概念设计（如 E-R 图）。逻辑设计（如关系模式）。物理设计（如索引、存储分区）。数据依赖与规范化理论数据依赖：描述属性之间的逻辑关系。函数依赖、部分依赖、传递依赖等。规范化：消除冗余，分为 1NF、2NF、3NF、BCNF 等。七、数据库应用开发工具与常见数据库系统常见数据库系统MySQL：开源、轻量、高效。Oracle：高性能，支持复杂业务。Microsoft SQL Server：强大的集成和数据分析能力。PostgreSQL：支持高级功能和扩展性。MongoDB：NoSQL，适合非关系型数据。数据库应用开发工具图形化管理工具：MySQL Workbench。phpMyAdmin。编程语言接口：Python：pymysql、sqlalchemy。Java：JDBC。Microsoft SQL Server 使用提供强大的 T-SQL 语言支持。集成开发工具：SQL Server Management Studio（SSMS）。normalhttps://www.runoob.com/sql/sql-having.htmlselect - 从数据库中提取数据update - 更新数据库中的数据delete - 从数据库中删除数据insert into - 向数据库中插入新数据create database - 创建新数据库alter database - 修改数据库create table - 创建新表alter table - 变更（改变）数据库表drop table - 删除表create index - 创建索引（搜索键）drop index - 删除索引having, group by, select distinct, join ... on ..., order by ... asc|desc select column_name(s) from table_name where condition order by column_name [ASC|DESC]; insert into table_name values (values1, values2, null, null, ...); update table_name set column1 = values1, column2 = values2, ... where condition; delete from table_name where condition; create table table_name ( column1 date_type constraint, # for example: book_name varchar primary key, column2 date_type constraint, column3 date_type constraint, column4 date_type constraint, ); alter table table_name add column_name data_type; alter table table_name drop column column_name; drop table table_name; create index index_name on table_name (column_name); drop index index_name on table_name; select column_name(s) from table_name where condition; select column_name(s) from table_name order by column_name [ASC|DESC]; select column_name(s), aggregate_function(column_name) # count(), sum(), avg() from table_name where condition group by column_name(s); select column_name(s), aggregate_function(column_name) from table_name group by column_name(s) having condition; # having 用于分组后的结果查询 select column_name(s) from table_name1 join table_name2 # join 用于将两个或多个表的记录结合起来 on table_name1.column_name = table_name2.column_name; select distinct column_name(s) from table_name;superlimitlike, regexp, in, betweenasjoin ... on ...union, union allgroup by ... having ...# select ... limit number; select * from websites where country='CN' limit 2; # select ... where column_name like pattern; # % _ select * from websites where url like 'https%'; select * from websites where name like 'g__gle'; # select ... where column_name regexp pattern; # [char] [a-g] [^char] ^start .* end$ #^：表示匹配字符串的开始。 #[gs]：表示第一个字符可以是 g 或 s。 #[^c]: not c #.*：表示中间可以有任意数量的字符（包括零个）。 select * from websites where name regexp '^[gs].*e$'; # select ... where column in (value1, value2, ...); select * from websites where name in ('google', 'facebook'); # select ... where column between value1 and value2 select * from access_log where date between '2016-01-01 00:00:00' and '2016-05-15 23:59:59'; # ... column_name(s) as alias_name ... select name as n, country as c from websites; select w.name, w.url, a.count, a.date from websites as w, access_log as a where w.id=a.site_id; # SQL join 用于把来自两个或多个表的行结合起来。 select w.id, w.name, a.count, a.date from websites as w join access_log as a on w.id = a.site_d; # SQL UNION 操作符合并两个或多个 SELECT 语句的结果。 select country from apps union select country from websites; select country, name from websites where country='CN' union all select country, app_name from apps where country='CN' order by country; # create table_name (name type(size) ) create table Persons ( PersonID int, LastName varchar(255), FirstName varchar(255), Address varchar(255), City varchar(255) ); create table Orders ( OrderID INT NOT NULL primary key, OrderNumber INT NOT NULL, CustomerID INT, foreign key (CustomerID) references Customers(CustomerID) ); # 通过使用 DROP 语句，可以轻松地删除索引、表和数据库。 drop index name; drop table name; drop database name; # ALTER TABLE 语句用于在已有的表中添加、删除或修改列。 alter table table_name modify column column_name datatype; alter table Persons add DateOfBirth date; alter table Persons modify column DateOfBirth year; alter table Persons drop column DateOfBirth # auto_increment CREATE TABLE Persons ( ID int NOT NULL AUTO_INCREMENT, LastName varchar(255) NOT NULL, FirstName varchar(255), Address varchar(255), City varchar(255), PRIMARY KEY (ID) ) # SQL views: 在 SQL 中，视图是基于 SQL 语句的结果集的可视化的表。 # create view ... as ... CREATE VIEW view_name AS SELECT column1, column2, ... FROM table_name WHERE condition; -- 创建包含高工资员工信息的视图 CREATE VIEW high_salary_employees AS SELECT employee_id, first_name, last_name, salary FROM employees WHERE salary > 50000; # 更新视图的实质是通过更新视图所基于的表中的数据，然后视图会反映这些变化。 -- 步骤 1: 更新 employees 表中的数据 UPDATE employees SET salary = 60000 WHERE employee_id = 1001; -- 步骤 2: 查询更新后的高工资员工视图 SELECT * FROM high_salary_employees; -- 删除视图 drop view high_salary_employees; # SQL 通用数据类型 # character(n) # 固定字长 # varchar(n) # 可变字长 # boolean # int # float # date # YYYY-MM-DD # time # hh:mm:ss # timestamp # YYYY-MM-DD hh:mm:ss # SQL Aggregate 函数 # AVG() - 返回平均值 # COUNT() - 返回行数 # MAX() - 返回最大值 # MIN() - 返回最小值 # SUM() - 返回总和 select avg(count) as count_average from access_log; select site_id, count from access_log where count > (select avg(count) from access_log); select count(count) as nums from access_log where site_id=3; select count(distinct site_id) as nums from access_log; # distinct 不同的 select max(count) as max_count from access_log; # max, min, sum # GROUP BY 语句用于结合聚合函数，根据一个或多个列对结果集进行分组。 # 统计 access_log 各个 site_id 的访问量： select site_id, sum(access_log.count) as nums from access_log group by site_id; # SQL GROUP BY 多表连接 # 统计有记录的网站的记录数量 select websites.name, count(access_log.site_id) as nums from access_log join websites on access_log.site_id = websites.id group by websites.name; # 在 SQL 中增加 HAVING 子句原因是，WHERE 关键字无法与聚合函数一起使用。 # HAVING 子句可以让我们筛选分组后的各组数据。 select websites.name, count(access_log.site_id) as nums from access_log join websites on access_log.site_id = websites.id where date between '2016-05-14 00:00:00' and '2016-05-15 23:59:59' group by websites.name having websites.name regexp '^[FG].*e$'; -- where 和having之后都是筛选条件，但是有区别的： -- 1.where在group by前， having在group by 之后 -- 2.聚合函数（avg、sum、max、min、count），不能作为条件放在where之后，但可以放在having之后 select ... from ... join ... on ... where ... # 不能使用avg, sum, max, min, count 聚合函数 group by ... having ... # 可以使用avg, sum, max, min, count 聚合函数 Sample图书(书号，书名,作者,出版社,出版日期) 读者(读者号,姓名,性别,年龄,电话) 借阅(读者号,书号,借出日期,还书日期)(1)向读者关系中新增一个读者记录(‘1009','Tom',男',29),电话字段为空；insert into 读者(读者号,姓名,性别,年龄) values(‘1009','Tom',男',29);(2)将读者号为'1009’的读者电话修改为‘0123456789’update 读者 set 电话='0123456789' where 读者号='1009';(3)查询 2019 年出版的图书书名和作者,并按出版日期降序排列；select 书名,作者 from 图书 where 出版日期 between '2019-01-01' and '2019-12-31' order by 出版日期 desc;(4)查询借阅过红楼梦的读者姓名；select 读者.姓名 from 读者 join 借阅 on 读者.读者号 = 借阅.读者号 join 图书 on 借阅.书号 = 图书.书号 where 图书.书名 = '红楼梦';(5)统计被借阅次数超过 100 次的图书书号和借阅次数。select 书号,count(*) as 借阅次数 from 借阅 group by 书号 having count(*)>100;32.从数据库中删除已经存在的表 t,可用的命令是:drop table t37.数据库系统提供授权功能是为了保障数据库的安全性38.E-R 模型的基本成分是:实体-联系E-R 模型（实体-联系模型）的基本成分是：1. 实体（Entity）：表示现实世界的对象（如学生、图书）。 2. 联系（Relationship）：表示实体之间的关系（如借阅关系）。 3. 属性（Attribute）：描述实体或联系的特征（如姓名、书号）。 40.在数据库设计中,将 E-R 图转换成关系数据模型的过程属于:逻辑设计阶段44.DB、DBMS 和 DBS 三者之间的关系是:DBS 包括 DB 和 DBMS45.数据库管理系统与操作系统、应用软件的层次关系从核心到外围依次是OS、DBMS、应用软件2.数据库关系模型的完整性的束包括：A.数据安全性约束B.实体完整性约束C.参照完整性约束D.联系完整性约束E.用户自定义完整性约束BCE数据库完整性约束包括：1. 实体完整性（Entity Integrity）：确保每个实体有唯一标识（如主键）。 2. 参照完整性（Referential Integrity）：确保外键引用的实体存在。 3. 用户自定义完整性（User-Defined Integrity）：用户定义的特定规则。A. 数据安全性约束：是数据库安全性的一部分，而非完整性约束。D. 联系完整性约束：并不存在这种约束类型。
基于欧几里得距离的相似度计算和基于余弦角度的相似度计算
基于欧几里得距离的相似度计算欧几里得距离是指在多维空间中两个点之间的直线距离。在相似度计算中，欧几里得距离可以用来衡量两个向量之间的差异。具体来说，如果我们有两个向量A和B，它们在n维空间中的坐标分别为(a1, a2,..., an)和(b1, b2,..., bn)，那么它们之间的欧几里得距离可以通过以下公式计算：$d(A, B) = \sqrt{\sum_{i=1}^{n} (a_i - b_i)^2}$欧几里得距离越小，说明两个向量越接近，即它们的相似度越高。在实际应用中，欧几里得距离常用于各种机器学习算法中，如K近邻算法（KNN）、聚类算法（如K-Means）等，以及在推荐系统中计算用户或项目之间的相似度。基于余弦角度的相似度计算余弦相似度是通过计算两个向量之间的夹角余弦值来衡量它们的相似性。具体公式为：$\cos(A, B) = \frac{A \cdot B}{\|A\| \|B\|}$其中，A·B是向量A和B的点积，||A||和||B||分别是向量A和B的欧几里得范数（即向量的长度）。余弦相似度的值范围从-1到1，其中1表示两个向量方向完全相同，0表示正交（即无相似性），-1表示两个向量方向完全相反。余弦相似度适用于文本分析和推荐系统等场景，因为它关注的是方向而不是大小，常用于评估文档或用户偏好的相似性。两种方法的比较欧几里得相似度：以目标之间的绝对距离作为衡量标准，注重目标之间的差异，与目标在空间中的位置直接相关。适用于需要关注目标之间具体差异的情况。余弦相似度：以目标之间的夹角大小作为衡量标准，更注重目标在方向趋势上的区分，对特定坐标不敏感。适用于需要关注目标整体趋势和方向的情况。在实际应用中，选择哪种方法取决于具体的应用场景和数据特点。例如，在处理文本数据时，余弦相似度可能更合适，因为文本的长度和规模可能不同，但方向上的相似性更有意义。而在处理地理坐标或物理距离等场景时，欧几里得距离可能更直观和适用。
标准差和方差的定义标准差（Standard Deviation）和方差（Variance）是统计学中用来衡量一组数据离散程度的重要指标。方差是各个数据与其算术平均数的离差平方和的平均数，而标准差是方差的算术平方根。标准差和方差的计算公式总体标准差和方差：总体方差（Population Variance）的计算公式为： $\sigma^2 = \frac{1}{N} \sum_{i=1}^{N} (x_i - \mu)^2$ 其中，$\sigma^2$ 是总体方差，$N$ 是数据的总数，$x_i$ 是第 $i$ 个数据点，$\mu$ 是数据的平均值。总体标准差（Population Standard Deviation）的计算公式为： $\sigma = \sqrt{\frac{1}{N} \sum_{i=1}^{N} (x_i - \mu)^2}$ 其中，$\sigma$ 是总体标准差。样本标准差和方差：样本方差（Sample Variance）的计算公式为： $s^2 = \frac{1}{n-1} \sum_{i=1}^{n} (x_i - \bar{x})^2$ 其中，$s^2$ 是样本方差，$n$ 是样本数据的总数，$x_i$ 是第 $i$ 个样本数据点，$\bar{x}$ 是样本数据的平均值。样本标准差（Sample Standard Deviation）的计算公式为： $s = \sqrt{\frac{1}{n-1} \sum_{i=1}^{n} (x_i - \bar{x})^2}$ 其中，$s$ 是样本标准差。计算步骤计算平均值：首先，计算数据集的平均值。对于总体数据，平均值为 $\mu$ ；对于样本数据，平均值为 $\bar{x}$ 。计算离差平方和：对于每个数据点，计算其与平均值的差，并将差平方。计算方差：将所有离差平方和相加，并除以数据点的总数（对于总体方差）或总数减1（对于样本方差）。计算标准差：对方差取算术平方根，得到标准差。示例假设有一组数据：$3, 5, 7, 9, 11$ 。计算平均值： $\bar{x} = \frac{3+5+7+9+11}{5} = 7$计算离差平方和： $(3-7)^2 + (5-7)^2 + (7-7)^2 + (9-7)^2 + (11-7)^2 = 16 + 4 + 0 + 4 + 16 = 40$计算方差： $s^2 = \frac{40}{5-1} = 10$计算标准差： $s = \sqrt{10} \approx 3.16$注意事项在计算样本方差和标准差时，使用 $n-1$ 作为除数，这是因为样本数据的自由度为 $n-1$ ，使用 $n-1$ 可以得到总体方差的无偏估计量。标准差和方差的计算可以使用统计软件或计算器来完成，以减少计算错误的可能性。import numpy as np mydata = [200, 165, 184.5, 116, 270] print(np.std(mydata)) print(np.var(mydata))总体标准差和样本标准差有什么区别？总体标准差和样本标准差是统计学中用于衡量数据离散程度的两个重要指标，它们在计算方法和应用场景上有所不同。计算方法总体标准差：当我们能够获取总体中的所有数据时，总体标准差的计算公式为： $\sigma = \sqrt{\frac{\sum_{i=1}^{N}(x_i - \mu)^2}{N}}$ 其中，$\sigma$ 是总体标准差，$x_i$ 是总体中的每个数据点，$\mu$ 是总体的均值，$N$ 是总体的数据个数。样本标准差：在实际应用中，我们往往只能获取总体的一个样本，样本标准差的计算公式为： $s = \sqrt{\frac{\sum_{i=1}^{n}(x_i - \bar{x})^2}{n-1}}$ 其中，$s$ 是样本标准差，$x_i$ 是样本中的每个数据点，$\bar{x}$ 是样本的均值，$n$ 是样本的数据个数。应用场景总体标准差：适用于总体数据已知的情况，例如在对一个班级的所有学生成绩进行分析时，如果能够获取到所有学生的成绩，就可以计算总体标准差来衡量成绩的离散程度。样本标准差：适用于总体数据未知，需要通过抽样来估计总体情况的场景。例如，要了解一个大型城市居民的收入水平，由于无法获取所有居民的收入数据，只能抽取一部分居民作为样本，计算样本标准差来估计总体居民收入的离散程度。区别总结计算方法：总体标准差在计算时使用总体均值和总体数据个数 $N$ 作为分母。样本标准差在计算时使用样本均值和样本数据个数减1（即 $n-1$ ）作为分母。应用场景：总体标准差用于描述总体数据的离散程度。样本标准差用于通过样本数据来估计总体数据的离散程度。在实际应用中，样本标准差更为常用，因为在大多数情况下，我们无法获取总体的全部数据，只能通过抽样来进行统计分析。为什么在计算样本标准差的时候，样本数据个数要减1？在计算样本标准差时，样本数据个数减1（即使用n-1作为分母）的原因与统计学中的自由度概念和无偏估计的需求有关。自由度的概念自由度指的是在统计计算中，能够自由变化的数据点数量。在计算样本均值时，我们利用了样本中的所有数据点来得出样本均值，这意味着样本中的一个数据点被“用掉”了一个自由度。例如，假设我们有一个样本集{x1, x2, x3}，其样本均值为x̄。如果已知x1、x2和x̄的值，那么x3的值可以由样本均值和其他两个数据点确定，具体公式为：x3 = 3x̄ - x1 - x2。这表明，当我们计算样本均值时，样本中只有两个数据点（x1和x2）是自由变化的，而第三个数据点x3被样本均值所“限制”，即它的值不再是独立的。在样本方差计算中的影响由于样本均值用掉了一个自由度，所以在计算样本方差时，实际的自由度是n-1，而不是n。这意味着在样本方差的计算中，只有n-1个独立的数据点可以用来估计总体方差。无偏估计的需求在计算样本方差时，我们用的是样本均值，而不是总体均值。由于样本均值是根据样本数据计算得出的，它更贴近样本数据。因此，计算出来的离差平方和通常小于用总体均值计算的离差平方和。这会导致对总体方差的低估。为了校正这种低估，我们需要将分母从n调整为n-1。这种校正被称为贝塞尔校正（Bessel's Correction），目的是使样本方差成为总体方差的无偏估计。通过使用n-1作为分母，我们可以更好地估计总体标准差，从而提高统计分析的准确性。这样做的原因在于，当我们使用样本数据来估计总体参数时，我们需要考虑到样本数据的离散程度和波动情况，而使用n-1可以更好地反映样本数据的特征，从而更准确地估计总体标准差。
CUDA-F-4-1-内存模型概述CUDA GPU上的内存设备有：寄存器 (Registers)共享内存 (Shared Memory)本地内存 (Local Memory)常量内存 (Constant Memory)纹理内存 (Texture Memory)全局内存 (Global Memory)OpenCL的内存模型：Global MemoryConstant MemoryLocal MemoryPrivate MemoryCUDA中每个线程都有自己的私有的本地内存；线程块有自己的共享内存，对线程块内所有线程可见；所有线程都能访问读取常量内存和纹理内存，但是不能写，因为他们是只读的；全局内存，常量内存和纹理内存空间有不同的用途。对于一个应用来说，全局内存，常量内存和纹理内存有相同的生命周期。存储器片上/片外缓存存取范围生命周期寄存器片上n/aR/W一个线程线程本地片外1.0以上有R/W一个线程线程共享片上n/aR/W块内所有线程块常量片外YesR所有线程+主机主机配置纹理片外YesR所有线程+主机主机配置全局片外1.0以上有R/W所有线程+主机主机配置