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

Linux VLAN 实现原理技术笔记

一、引言

 

VLAN(虚拟局域网)在整车网络架构中起着至关重要的作用,它能够在物理网络基础设施上创建逻辑隔离的网络区域,提高车内网络的安全性、灵活性和性能。Linux 内核通过一系列复杂的机制实现了 VLAN 功能,本技术笔记将从源码分析的角度深入梳理 Linux VLAN 的实现原理,包括其数据结构和数据包的收发流程。

 

二、数据结构

 

(一) struct vlan_group 

 

// 定义 VLAN 组结构体

struct vlan_group {

    // 指向真实的网络设备,如物理网卡对应的设备结构体

    struct net_device *real_dev; 

    // 用于组织该 VLAN 组内的 VLAN 设备的哈希链表头

    struct hlist_head vlan_devices; 

    // 用于 RCU(读 - 拷贝更新)机制的结构体成员,用于并发控制

    struct rcu_head rcu; 

    // 指向 VLAN 组的 RCU 相关数据结构,用于高效的内存管理和并发访问

    struct vlan_group_rcu *vgr; 

};

 

 

(二) struct vlan_dev_info 

 

// 定义 VLAN 设备信息结构体

struct vlan_dev_info {

    // 指向该 VLAN 设备对应的网络设备结构体

    struct net_device *dev; 

    // 指向该 VLAN 设备所属的 VLAN 组结构体

    struct vlan_group *vlan_group; 

    // 该 VLAN 设备的 VLAN ID

    u16 vlan_id; 

    // 标志位,用于表示 VLAN 设备的一些属性或状态

    u16 flags; 

    // 指向该 VLAN 设备对应的真实网络设备

    struct net_device *real_dev; 

    // 用于入站数据包过滤的链表头,可设置过滤规则

    struct list_head ingress_filter; 

    // 用于出站数据包过滤的哈希链表头,可设置过滤规则

    struct hlist_head egress_filter; 

    // 用于 RCU 机制的结构体成员

    struct rcu_head rcu; 

};

 

 

这些数据结构是 Linux 实现 VLAN 功能的基础,通过它们可以有效地组织和管理 VLAN 设备以及 VLAN 组之间的关系。

 

三、接收流程

 

(一)入口函数 netif_receive_skb 

 

// 网络数据包接收的关键入口函数

int netif_receive_skb(struct sk_buff *skb)

{

    //... 其他代码省略

    // 判断数据包的协议是否为 802.1Q(VLAN 协议)或 802.1AD(QinQ 协议)

    if (skb->protocol == htons(ETH_P_8021Q) ||

        skb->protocol == htons(ETH_P_8021AD)) {

        // 如果是 VLAN 数据包,则调用 vlan_skb_recv 函数进行处理

        return vlan_skb_recv(skb, skb->dev);

    }

    //... 其他代码省略

    // 如果不是 VLAN 数据包,则返回接收成功的标识

    return NET_RX_SUCCESS;

}

 

 

(二) vlan_skb_recv 函数

 

// 处理 VLAN 数据包接收的函数

int vlan_skb_recv(struct sk_buff *skb, struct net_device *dev)

{

    struct vlan_group *vg;

    struct vlan_dev_info *vlan;

    u16 vid;

    // 从数据包中获取 VLAN ID

    vid = vlan_get_VID(skb);

    // 通过 RCU 机制获取设备对应的 VLAN 组结构体

    vg = rcu_dereference(dev->vlgrp);

    // 如果没有对应的 VLAN 组,则丢弃该数据包

    if (!vg)

        return NET_RX_DROP;

    // 根据 VLAN ID 在 VLAN 组中查找对应的 VLAN 设备信息结构体

    vlan = vlan_group_get_device(vg, vid);

    // 如果没有找到对应的 VLAN 设备,则丢弃该数据包

    if (!vlan)

        return NET_RX_DROP;

    // 将数据包的接收设备设置为找到的 VLAN 设备

    skb->dev = vlan->dev;

    // 将数据包送入网络栈进行后续的接收处理

    netif_receive_skb_internal(skb);

    // 返回接收成功的标识

    return NET_RX_SUCCESS;

}

 

 

在接收流程中,当带有 VLAN 标签的数据包到达网络接口时,首先在 netif_receive_skb 函数中被识别为 VLAN 数据包,然后交由 vlan_skb_recv 函数处理。 vlan_skb_recv 函数会解析数据包中的 VLAN ID,在对应的 VLAN 组中查找匹配的 VLAN 设备,并将数据包的接收设备设置为该 VLAN 设备后,继续进行后续的网络栈处理,就如同该数据包是直接从该 VLAN 设备对应的虚拟接口接收的一样。

 

四、发送流程

 

(一) dev_hard_start_xmit 函数及相关

 

在发送数据包时, dev_hard_start_xmit 函数(在 net/core/dev.c )会被调用,它是网络设备发送数据包的关键函数。对于 VLAN 设备,最终会调用到 vlan_dev_hard_start_xmit 函数。

 

(二) vlan_dev_hard_start_xmit 函数

 

// VLAN 设备发送数据包的函数

int vlan_dev_hard_start_xmit(struct sk_buff *skb, struct net_device *dev)

{

    struct vlan_dev_info *vlan = netdev_priv(dev);

    struct net_device *real_dev = vlan->real_dev;

    u16 vlan_tci = vlan->vlan_id | VLAN_TAG_PRESENT;

    // 将数据包指针向前移动 VLAN 头部长度,为添加 VLAN 标签腾出空间

    skb_push(skb, VLAN_HLEN);

    // 将 VLAN 标签(包含 VLAN ID 等信息)添加到数据包中

    __vlan_put_tag(skb, htons(vlan_tci));

    // 将数据包发送到真实设备的发送队列中进行发送

    return dev_queue_xmit(skb);

}

 

 

在发送流程中,当应用程序通过系统调用将数据包发送到对应的 VLAN 设备(如 eth0.10 这样的 VLAN 接口)时, vlan_dev_hard_start_xmit 函数会被调用。它首先获取 VLAN 设备的配置信息,然后将 VLAN 标签添加到数据包中,最后通过底层的网络设备驱动将带有 VLAN 标签的数据包发送到物理网络中。

 

五、总结

 

Linux 通过精心设计的数据结构 struct vlan_group 和 struct vlan_dev_info ,以及在数据包收发流程中的关键函数 netif_receive_skb 、 vlan_skb_recv 、 dev_hard_start_xmit 和 vlan_dev_hard_start_xmit 等的协同工作,实现了 VLAN 功能。在接收时,能够根据 VLAN 标签将数据包正确地分发到对应的 VLAN 设备;在发送时,能够为数据包添加正确的 VLAN 标签并发送到物理网络。这种实现方式使得 Linux 系统在网络虚拟化和 VLAN 应用场景中具有很强的适应性和扩展性,为构建复杂的企业网络和云计算网络环境提供了坚实的基础。同时,由于涉及到内核代码和网络协议栈的底层操作,对于开发者来说,深入理解这些原理有助于进行网络性能优化、故障排查以及定制化的网络功能开发等工作。

相关文章:

Linux VLAN 实现原理技术笔记

一、引言 VLAN(虚拟局域网)在整车网络架构中起着至关重要的作用,它能够在物理网络基础设施上创建逻辑隔离的网络区域,提高车内网络的安全性、灵活性和性能。Linux 内核通过一系列复杂的机制实现了 VLAN 功能,本技术笔记…...

【Git】:分支管理

目录 理解分支 创建分支 切换分支 合并分支 删除分支 合并冲突 分支管理策略 快进合并 正常合并 bug 分支 总结 理解分支 在版本控制系统中,分支是一条独立的开发线路。它允许开发者从一个主要的代码基线(例如master分支)分离出来…...

Java中的运算符“instanceof“详解

在Java中,instanceof运算符用于检查一个对象是否是某个特定类的实例,或者是否实现了某个特定接口。它返回一个布尔值(true或false),用于在运行时进行类型检查。这在处理多态性时尤其有用,可以帮助我们确定对…...

Profinet转Modbus TCP西门子SINAMICS G120变频器与施耐德M580通讯案例

一. 案例背景 在复杂的工业自动化场景中,企业常常会采用不同品牌的设备来构建生产系统。西门子SINAMICS G120变频器以其高性能、高精度的速度和转矩控制功能,在电机驱动领域应用广泛。施耐德M580可编程逻辑控制器则以强大的逻辑控制和数据处理能力著称&a…...

机器学习实战笔记39-43树模型基础

目前最常用的是CART树: 评价标准:每次划分后子节点的纯度(即是否标签都为0/1),分为信息熵、基尼系数(越小则纯度越高)和分类误差 找划分节点的方法:CART树无需区分连续和离散变量&am…...

`uni.setClipboardData` 是 uni-app 提供的一个 API 设置系统剪贴板的内容

uni.setClipboardData是uni-app提供的一个API,用于设置系统剪贴板的内容。 使用说明: 使用此API可以将指定的文本内容复制到系统剪贴板,使用户能够在其他应用或页面中粘贴这些内容。 uni.setClipboardData({data: , // 需要复制的内容 suc…...

Android opengl 绘制矩形,宽高相同,不能显示为正方形,是怎么回事

在Android上使用OpenGL绘制矩形(或尝试显示为正方形)时,如果结果显示为不是正方形,可能有几个原因。以下是一些常见的因素及解决方法: 视口(Viewport)设置不当: OpenGL的视口定义了…...

网络安全开源组件

本文只是针对开源项目进行收集,如果后期在工作中碰到其他开源项目将进行更新。欢迎大家在评论区留言,您在工作碰到的开源项目。 祝您工作顺利,鹏程万里! 一、FW(防火墙) 1.1 pfSense pfSense项目是一个免费…...

【C++初阶】第5课—模版初阶

文章目录 1. 函数模版1.1 函数模版格式1.2 函数模版原理1.3 函数模版的实例化1.4 模版参数的匹配原则 2. 类模版 1. 函数模版 在讲函数模版之前先看一个例子 为了实现泛型编程,C提出了函数模版的概念函数模版与类型无关,在使用时被参数化,根据…...

【力扣热题100】[Java版] 刷题笔记-3. 无重复字符的最长子串

题目:3. 无重复字符的最长子串 给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。 解题思路 根据题目,只需要返回无重复字符串的最长子串的长度,所以我们不需要知道知道字符串内容是什么,在整个字符串 s 中&…...

无人机数据处理系统:原理与核心系统

一、数据处理系统的运行原理 数据获取:无人机在飞行过程中,通过搭载的传感器(如相机、激光雷达等)采集到各种类型的数据,例如图像、点云等。这些数据是后续处理和分析的基础。 数据传输:采集到的数据会通…...

Hadoop分布式文件系统(二)

目录 1. 引言1. Hadoop文件操作命令2. 部分常用的Hadoop FS Shell命令2.1 ls列出文件2.2 mkdir创建目录2.3 put上传文件2.4 cat查看文件2.5 get复制文件2.6 rm删除文件 3. Hadoop系统管理命令4. HDFS Java API 示例参考 1. 引言 大多数HDFS Shell命令的行为和对应的Unix Shell命…...

PortSwigger 原型污染

一、什么是原型污染 原型污染是一种 JavaScript 漏洞,它使攻击者能够向全局对象原型添加任意属性,然后这些属性可能被用户定义的对象继承。 二、JavaScript 原型和继承基础 1、原型 JavaScript 中的每个对象都链接到某种类型的另一个对象,称…...

雪花算法详解:分布式系统中高效唯一的ID生成方案

文章目录 原理与结构工作流程优势局限性应对高并发的方法适用场景 雪花算法(Snowflake Algorithm)是由Twitter开发的一种分布式全局唯一ID生成方案,旨在解决在分布式系统中快速、无冲突地生成唯一标识符的问题。它通过巧妙的设计,…...

[Redis#7] set | 命令 | 集合 | 用户画像 | UV

目录 1. 特点 2. 常用命令 2.1 普通命令 2.2 集合间操作 2.3. 命令小结 3.内部编码 4. 应用场景 1. 构造用户画像 2. 计算用户之间的共同好友 3. 统计 UV 1. 特点 集合类型也是保存多个字符串类型的元素的,和 list 类型不同的是: 无序性&…...

中介者模式 (Mediator Pattern)

文章目录 中介者模式 (Mediator Pattern)原理优点缺点示例代码场景描述1. 定义中介者接口2. 实现具体中介者3. 定义同事类接口4. 实现具体同事类5. 客户端代码输出结果 UML 类图使用场景小结 中介者模式 (Mediator Pattern) 中介者模式是一种 行为型设计模式,用来降…...

PVE 软路由单网口——VLAN 实践

从VLAN交换机出发,到PVE的Linux Bridge 、Linux VLAN,再到iKuai等软路由软件的设置,尽可能的了解VLAN设置细节,避免踩坑。 本文使用的快速切换CIDR的脚本 PVE 调试之“一键设置网络连接的以太网的CIDR“——“.PS1 脚本” 默认…...

搭建一个基于Web的文档管理系统,用于存储、共享和协作编辑文档

搭建一个基于Web的文档管理系统,用于存储、共享和协作编辑文档 本项目采用以下架构: NFS服务器: 负责存储文档资料。Web服务器: 负责提供文档访问和编辑功能。SELinux: 负责权限控制,确保文档安全。Git服务器: 负责存储文档版本历史&#x…...

【QT】控件8

1.QDial 通过调节旋钮位置来控制窗口的不透明度&#xff1a; void Widget::on_dial_valueChanged(int value) {qDebug()<<value;this->setWindowOpacity((double)value/100); }效果演示&#xff1a; 2.Date/Time Edit 计算两个日期的差值 ui界面设计 计算按钮按下…...

asyncio.to_thread 详解及示例代码

asyncio.to_thread 详解及示例代码 1. asyncio.to_thread() 简介函数签名返回值 2. 示例代码示例 1: 执行阻塞的 I/O 操作示例 2: 执行阻塞的 CPU 密集型操作 3. 注意事项4. 总结 在异步编程中&#xff0c;asyncio 是 Python 中用于编写异步代码的标准库。然而&#xff0c;有时…...

MYSQL字段变更

修改字段长度 ALTER TABLE tqt_sp_prod.t_receipt_order_head MODIFY COLUMN CUS_CONTRACT_CD VARCHAR(50) COMMENT 客户合同编号;添加varchar类型字段 AFTER 此处指在loc_cd字段后面 ALTER TABLE m_product ADD COLUMN FIXED_ASSET_NUM VARCHAR(100) DEFAULT NULL COMME…...

【通俗理解】步长和学习率在神经网络中是一回事吗?

【通俗理解】步长和学习率在神经网络中是一回事吗&#xff1f; 【核心结论】 步长&#xff08;Step Size&#xff09;和学习率&#xff08;Learning Rate, LR&#xff09;在神经网络中并不是同一个概念&#xff0c;但它们都关乎模型训练过程中的参数更新。 【通俗解释&#x…...

力扣-位运算-8【算法学习day.48】

前言 ###我做这类文章一个重要的目的还是给正在学习的大家提供方向和记录学习过程&#xff08;例如想要掌握基础用法&#xff0c;该刷哪些题&#xff1f;&#xff09;我的解析也不会做的非常详细&#xff0c;只会提供思路和一些关键点&#xff0c;力扣上的大佬们的题解质量是非…...

C++ 字符串中数字识别

【问题描述】 输入一个字符串&#xff0c;含有数字和非数字字符&#xff0c;如“sumabc234;while(abc700)tab{ass346;bssabc267;}”&#xff0c;将其中连续的数字作为一个整数&#xff0c;依次存放到一个数组nums中。例如&#xff0c;234放在nums[0]&#xff0c;700放在nums[1…...

计算机毕业设计Python+卷积神经网络股票预测系统 股票推荐系统 股票可视化 股票数据分析 量化交易系统 股票爬虫 股票K线图 大数据毕业设计 AI

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 作者简介&#xff1a;Java领…...

jvm-49-linux 服务器 cpu 使用率升高应该如何排查分析?

拓展阅读 JVM FULL GC 生产问题 I-多线程通用实现 JVM FULL GC 生产问题 II-如何定位内存泄露&#xff1f; 线程通用实现 JVM FULL GC 生产问题 III-多线程执行队列的封装实现&#xff0c;进一步抽象 jvisualvm java 性能分析工具 jvm-44-jvm 内存性能分析工具 Eclipse Me…...

FPGA存在的意义:为什么adc连续采样需要fpga来做,而不会直接用iic来实现

FPGA存在的意义&#xff1a;为什么adc连续采样需要fpga来做&#xff0c;而不会直接用iic来实现 原因ADS111x连续采样实现连续采样功能说明iic读取adc的数据速率 VS adc连续采样的速率adc连续采样的速率iic读取adc的数据速率结论分析 FPGA读取adc数据问题一&#xff1a;读取adc数…...

Web开发基础学习——HTML, CSS, JavaScript 的区别和联系

Web开发基础学习系列文章目录 第一章 基础知识学习之HTML, CSS, JavaScript 的区别和联系 文章目录 Web开发基础学习系列文章目录前言一、定义说白了&#xff0c;就是HTML负责网页的内容&#xff0c;CSS负责网页的格式&#xff0c;JS负责网页的交互。 二、 功能三、联系四、示…...

通义灵码走进北京大学创新课堂丨阿里云云原生 10 月产品月报

云原生月度动态 云原生是企业数字创新的最短路径。 《阿里云云原生每月动态》&#xff0c;从趋势热点、产品新功能、服务客户、开源与开发者动态等方面&#xff0c;为企业提供数字化的路径与指南。 趋势热点 &#x1f947; 通义灵码走进北京大学创新课堂&#xff0c;与 400…...

Facebook Messenger背后的技术架构:即时通讯的实现之道

Facebook Messenger&#xff0c;作为全球最受欢迎的即时通讯应用之一&#xff0c;每天承载着数十亿的消息交换。其背后支撑这一流畅通讯体验的技术架构&#xff0c;融合了大量先进的技术和创新的解决方案。本文将从技术角度&#xff0c;深入探讨Facebook Messenger如何实现即时…...

前端css实例

前端css实例 一、带条纹的表格 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>条纹样式的表格<…...

电阻改善信号完整性

1.为什么电路端接电阻能改善信号完整性 由于电信号在PCB上传输&#xff0c;因此在PCB设计中可以把PCB走线认为是信号的通道&#xff0c;当该通道的 物理结构&#xff08;线宽&#xff0c;线到参考面的距离等&#xff09;发生变化&#xff0c;特别是有一些突变时&#xff0c;都会…...

如何选择合适的主键id?

目录标题 MySQL主键一定是自增的吗&#xff1f;自增id、uuid、雪花算法 谁更合适&#xff1f;详细聊聊 UUID详细聊聊 雪花算法 在数据库设计中&#xff0c;选择合适的主键对于数据表的性能和数据完整性都非常重要。接下来&#xff0c;让我们探讨一下自增id、uuid和雪花算法&…...

OpenMP出现Stack Overflow及其疑问

今天对着《OpenMP核心技术指南》练习OpenMP&#xff0c;其中一个案例: #include <stdio.h> #include <math.h> #include <omp.h>#define ITER 100000000void main() {int i;double A[ITER];for (i 0; i < ITER; i)A[i] 2.0 * i;#pragma omp parallel{/…...

vscode查找函数调用

在 VS Code 中&#xff0c;要查找 C 语言函数的调用列表&#xff0c;有以下几种方法可以使用&#xff0c;具体取决于项目的规模和你的需求&#xff1a; 方法 1: 使用全局查找功能 步骤&#xff1a; 打开全局查找&#xff1a; 按 CtrlShiftF (Windows/Linux) 或 CmdShiftF (Ma…...

网络安全-网络安全审计

网络安全审计是为了确保网络系统的安全性和完整性&#xff0c;防范潜在的网络攻击和数据泄露风险。 审计步骤&#xff1a; 1.确定审计目标&#xff1a;明确审计的目的和范围&#xff0c;例如审计网络设备、服务器、应用程序或数据库等。 2.收集信息&#xff1a;收集审计范围…...

刷LeetCode hot100--1.哈希表

哈希表--查找一个元素在不在数组/map/set中 目前用到的数据结构&#xff1a; std::unordered_set哈希表无序否否O(1)O(1) std::unordered_map哈希表key无序key不可重复key不可修改O(1)O(1) 1. 两数之和 - 力扣&#xff08;LeetCode&#xff09; 30min 几个问题 1.原来想…...

鸿蒙生态崛起的机遇有什么

鸿蒙生态系统的崛起为各个领域带来了多个机遇&#xff0c;主要体现在以下几个方面&#xff1a; 智能设备的互联互通&#xff1a;鸿蒙系统旨在实现不同设备之间的无缝连接&#xff0c;为物联网&#xff08;IoT&#xff09;设备的发展提供了良好的基础。这将推动智能家居、智慧城…...

写入json和读取json文件

/// <summary> ///写入文件 /// </summary> /// <param name"Stns"></param> /// <returns></returns> public ActionResult WriteJsonFile(string Stns) { strin…...

【Java基础入门篇】前言

Java基础入门篇 本系列内容主要针对Java基础知识&#xff0c;总共包含四大部分内容&#xff1a; 变量、数据类型和运算符控制语句和递归算法面向对象和JVM底层分析数组和排序 学习需要具备&#xff1a; IDEA编译器 JDK1.8版本 写在前面 在Java入门的最开始&#xff0c;我们需…...

LangChain——管道提示词 缓存

管道提示词 管道提示词可以将多个提示组合在一起。当我们想要使用部分提示时&#xff0c;这会很有用。这里可以通过PipelinePrompt来完成。 PipelinePrompt由两部分组成&#xff1a; 最终提示&#xff1a;返回的最终提示&#xff1b;管道提示&#xff1a;元组列表&#xff0c…...

LangGPT社区创始人云中江树:用热爱与坚持点燃实战营课堂

书生大模型实战营第 4 期正在火热进行中&#xff0c;在这里&#xff0c;我们见证了众多同学的成长与进步。今天&#xff0c;让我们一起走进第 4 期导师、结构化提示词 LangGPT 社区创始人云中江树的故事。他的故事不仅是对知识改变命运的生动诠释&#xff0c;更是一段关于热爱与…...

Admin.NET框架使用宝塔面板部署步骤

文章目录 Admin.NET框架使用宝塔面板部署步骤&#x1f381;框架介绍部署步骤1.Centos7 部署宝塔面板2.部署Admin.NET后端3.部署前端Web4.访问前端页面 Admin.NET框架使用宝塔面板部署步骤 &#x1f381;框架介绍 Admin.NET 是基于 .NET6 (Furion/SqlSugar) 实现的通用权限开发…...

18:(标准库)DMA二:DMA+串口收发数据

DMA串口收发数据 1、DMA串口发送数据2、DMA中断串口接收定长数据包3、串口空闲中断DMA接收不定长数据包4、串口空闲中断DMA接收不定长数据包DMA发送数据包 1、DMA串口发送数据 当串口的波特率大于115200时&#xff0c;可以通过DMA1进行数据搬运&#xff0c;以防止数据的丢失。如…...

Unity 导出 xcode 工程 并给 Info.plist 文件添加字段

Unity 导出 xcode 工程 并给 Info.plist 文件添加字段 在 Editor 文件夹下新建 xxx.cs 脚本 实现静态方法 [PostProcessBuild]public static void OnPostprocessBuild(BuildTarget target, string pathToBuiltProject){// Unity 导出 Xcode 工程自动调用这个方法 }例子 一 us…...

打造高质量技术文档的关键要素(结合MATLAB)

在技术的浩瀚海洋中&#xff0c;一份优秀的技术文档宛如精准的航海图。它不仅是知识传承的载体&#xff0c;也是团队协作的桥梁&#xff0c;更是产品成功的幕后英雄。打造出色的技术文档并非易事&#xff0c;以下将从多个方向探讨如何做到这一点。 文章目录 方向一&#xff1a;…...

C语言-数组

数组的创建 数组结构式 数组类型 数组名称 数组大小 内容 列如 char Arr[3]{1,2,3} int Arr[3]{1,2,3} 注意&#xff1a;在C99之前&#xff0c;【】中需要一个常量才可以 数组的初始化 初始化就是给它赋值&#xff0c;初始化分为完全初始化和非完全初始化 完全初始化…...

hhdb数据库介绍(10-19)

监控 智能物理拓扑 物理拓扑图主要以服务器为视角展示集群组件与服务器的所属关系&#xff0c;同时可查看服务器资源的使用情况以及各集群组件服务运行状态。使用前需保证为集群服务器配置了可用的SSH连接信息&#xff0c;否则只能查看当前服务器与集群组件的所属关系&#x…...

AI开发:生成式对抗网络入门 模型训练和图像生成 -Python 机器学习

阶段1&#xff1a;GAN是个啥&#xff1f; 生成式对抗网络&#xff08;Generative Adversarial Networks, GAN&#xff09;&#xff0c;名字听着就有点“对抗”的意思&#xff0c;没错&#xff01;它其实是两个神经网络互相斗智斗勇的游戏&#xff1a; 生成器&#xff08;Gene…...

68 mysql 的 临键锁

前言 我们这里来说的就是 我们在 mysql 这边常见的 一种锁, 行临键锁 虽然 在平时我们用到的不是很多, 我们这里 主要是 讲一下 它的主要的触发的场景 行临键锁 等价于 行锁 间隙锁, 行间隙锁是一个 左开右开的区间, 行临键锁 是一个左开右闭的区间 但是 它 和 行锁的差异…...