通过 Docker Swarm 集群探究 Overlay 网络跨主机通信原理
什么是Overlay网络, 用于解决什么问题 ?
Overlay网络通过在现有网络之上创建一个虚拟网络层, 解决不同主机的容器之间相互通信的问题
如果没有Overlay网络,实现跨主机的容器通信通常需要以下方法:
- 端口映射
- 使用宿主机网络模式
这些方法牺牲了容器网络隔离的优势, 并且可能导致端口冲突问题
以下搭建一个简易的Docker Swarm 集群(一主一从), 探究 Overlay 网络下不同节点上的容器间互相通信的原理
搭建一主一从 Docker Swarm 集群
0. 准备环境
准备两台Linux虚拟机(我使用Rocky Linux 9.5), 确保两台机器都安装了 Docker,并且能够通过网络互相访问。
192.168.52.203 swarm-master1
192.168.52.204 swarm-slave1
1. 初始化 Docker Swarm 集群
在主节点 swarm-master1 上初始化 Swarm 集群
docker swarm init --advertise-addr 192.168.52.203
执行成功后, 看到如下输出
Swarm initialized: current node (kc5nui94soxcjxi2pbqml13ig) is now a manager.To add a worker to this swarm, run the following command:docker swarm join --token SWMTKN-1-3t8jt95v04knqr2tvxqd0m1j0dspw3s5hqukcwgkskikulbxgv-bw8rbewoh80240tto2os0dwtv 192.168.52.203:2377To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.
2. 将从节点加入集群
复制上述输出中的 docker swarm join 命令,在从节点 swarm-slave1 上执行该命令:
docker swarm join --token SWMTKN-1-3t8jt95v04knqr2tvxqd0m1j0dspw3s5hqukcwgkskikulbxgv-bw8rbewoh80240tto2os0dwtv 192.168.52.203:2377
成功后, 看到如下提示
This node joined a swarm as a worker.
验证集群状态
# docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION
kc5nui94soxcjxi2pbqml13ig * localhost.localdomain Ready Active Leader 28.0.2
suzfvrhfn2d8g5digv7u05yz4 swarm-slave1 Ready Active 28.0.2
3. 创建overlay网络
在主节点上创建一个 overlay 网络, 用于跨主机容器通信
docker network create -d overlay my-overlay-network
这将创建一个名为 my-overlay-network 的 overlay 网络
4. 每个节点部署一个Rocky Linux容器
在主节点上运行以下命令,在主节点启动一个 Rocky Linux 容器,并将其连接到 my-overlay-network 网络中
docker service create \--name rocky-master \--network my-overlay-network \rockylinux:9.3 \sleep infinity
在主节点上运行以下命令,指定容器运行在从节点上:
docker service create \--name rocky-slave \--constraint 'node.hostname == swarm-slave1' \--network my-overlay-network \rockylinux:9.3 \sleep infinity
检查服务的状态,确保两个容器均已启动并正常运行:
# docker service ls
ID NAME MODE REPLICAS IMAGE PORTS
1cd6vg54735o rocky-master replicated 1/1 rockylinux:9.3
uh605ejlvsui rocky-slave replicated 1/1 rockylinux:9.3# docker service ps rocky-master
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
g45cjkctal9c rocky-master.1 rockylinux:9.3 swarm-master1 Running Running 3 hours ago# docker service ps rocky-slave
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
7kh81mby5ryd rocky-slave.1 rockylinux:9.3 swarm-slave1 Running Running 3 hours ago
5. 验证容器通信
进入主节点的容器,ping从节点容器, 我的从节点容器IP为 10.0.1.104
# ping 10.0.1.104
PING 10.0.1.104 (10.0.1.104) 56(84) bytes of data.
64 bytes from 10.0.1.104: icmp_seq=1 ttl=64 time=0.306 ms
如需清理 Docker Swarm 环境, 使用如下命令:
主节点停止集群
docker swarm leave --force
从节点离开集群
docker swarm leave --force
验证是否退出集群
docker info | grep "Swarm"
如果显示 Swarm: inactive,说明该节点已成功退出 Swarm。
删除服务
docker service rm rocky_service
删除Overlay网络
docker network rm my_overlay_network
探究 Overlay 网络原理
Docker Overlay 网络的工作流程图如下:

数据包发送流程说明:
- 容器1发出ICMP请求报文, 目标地址10.0.1.103, 根据容器1的路由表, 该报文从容器1的eth0发出
- 容器1的eth0是一个veth pair的一端, 另一端位于一个独立的network namespace中(不是宿主机的network namespace), 报文通过veth pair从容器1传送到这个独立的network namespace中的虚拟网卡(veth1)
- 在独立命名空间中, veth1连接到虚拟网桥br0, br0根据MAC地址表, 把报文转发到vxlan0设备
- vxlan0设备对原始以太网帧进行VXLAN封装, 具体过程是:
- 加一个新的外层以太网头部, IP头部, UDP头部, 并添加VXLAN头部
- 设置源IP为主机A的IP(192.168.52.203), 设置目标IP为主机B的IP(192.168.52.204), UDP目标端口设置为4789
- VXLAN头部中设置VNI(VXLAN Network Identifier), 一个24位字段, 用于标识当前的VXLAN网络
- 封装后的VXLAN报文通过主机A的物理网卡ens160发送出去
- 主机B收到VXLAN报文后, 将其传递到独立命名空间中的 vxlan0 设备
- vxlan0对报文进行解封装,恢复原始的以太网帧, 解封后的数据包进入虚拟网桥br0, br0根据MAC地址表, 将报文转发到容器2的veth设备
- 最终, 报文通过veth pair到达容器2的eth0, 容器2处理该ICMP请求并做出响应
VXLAN报文格式

VXLAN报文格式主要是将原始的以太网帧封装进一个UDP数据包中(“MAC in UDP”),包括以下部分:
- 外层以太网头部:包含目标MAC地址、源MAC地址和以太网类型(对于VXLAN通常是0x0800)
- 外层IP头部:指定外部网络中的源IP地址和目标IP地址,用于跨网络传输
- 外层UDP头部:标准UDP头部信息,包括源端口、目的端口(通常为4789)
- VXLAN头部:包含24位的VNI(VXLAN Network Identifier),用于区分不同的租户或逻辑网络
- 原始以太网帧:被封装的数据
对VXLAN报文抓包
用tcpdump抓包抓ens160的VXLAN报文
# tcpdump -i ens160 port 4789 -nn -vv
dropped privs to tcpdump
tcpdump: listening on ens160, link-type EN10MB (Ethernet), snapshot length 262144 bytes
15:29:36.888607 IP (tos 0x0, ttl 64, id 43464, offset 0, flags [none], proto UDP (17), length 134)192.168.52.203.35153 > 192.168.52.204.4789: [bad udp cksum 0xeb6b -> 0x4bbc!] VXLAN, flags [I] (0x08), vni 4097
IP (tos 0x0, ttl 64, id 57583, offset 0, flags [DF], proto ICMP (1), length 84)10.0.1.100 > 10.0.1.103: ICMP echo request, id 20, seq 122, length 64
15:29:36.888820 IP (tos 0x0, ttl 64, id 20056, offset 0, flags [none], proto UDP (17), length 134)192.168.52.204.57523 > 192.168.52.203.4789: [udp sum ok] VXLAN, flags [I] (0x08), vni 4097
IP (tos 0x0, ttl 64, id 3391, offset 0, flags [none], proto ICMP (1), length 84)10.0.1.103 > 10.0.1.100: ICMP echo reply, id 20, seq 122, length 64
导出pcap文件, 再用wireshark分析 (我用的VMware NAT虚拟机, 直接在Windows物理机上用wireshark抓vmnet8的报文也可以)


分析过程
查看主机A的网卡和路由表
# ip addr
2: ens160: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000link/ether 00:0c:29:68:16:97 brd ff:ff:ff:ff:ff:ffaltname enp3s0inet 192.168.52.203/24 brd 192.168.52.255 scope global noprefixroute ens160valid_lft forever preferred_lft foreverinet6 fe80::20c:29ff:fe68:1697/64 scope link noprefixroutevalid_lft forever preferred_lft forever
3: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group defaultlink/ether ee:70:00:b9:06:99 brd ff:ff:ff:ff:ff:ffinet 172.17.0.1/16 brd 172.17.255.255 scope global docker0valid_lft forever preferred_lft forever
4: docker_gwbridge: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group defaultlink/ether fe:d7:43:f4:5e:0a brd ff:ff:ff:ff:ff:ffinet 172.18.0.1/16 brd 172.18.255.255 scope global docker_gwbridgevalid_lft forever preferred_lft foreverinet6 fe80::fcd7:43ff:fef4:5e0a/64 scope linkvalid_lft forever preferred_lft forever
9: veth2c2d786@if8: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker_gwbridge state UP group defaultlink/ether f2:1d:db:39:8c:d7 brd ff:ff:ff:ff:ff:ff link-netnsid 1inet6 fe80::f01d:dbff:fe39:8cd7/64 scope linkvalid_lft forever preferred_lft forever
392: veth04de33f@if391: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker_gwbridge state UP group defaultlink/ether 5a:ac:6c:6b:55:4f brd ff:ff:ff:ff:ff:ff link-netnsid 4inet6 fe80::58ac:6cff:fe6b:554f/64 scope linkvalid_lft forever preferred_lft forever# route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 192.168.52.2 0.0.0.0 UG 100 0 0 ens160
172.17.0.0 0.0.0.0 255.255.0.0 U 0 0 0 docker0
172.18.0.0 0.0.0.0 255.255.0.0 U 0 0 0 docker_gwbridge
192.168.52.0 0.0.0.0 255.255.255.0 U 100 0 0 ens160
进入容器1, 查看容器1的网卡和路由表
# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00inet 127.0.0.1/8 scope host lovalid_lft forever preferred_lft foreverinet6 ::1/128 scope hostvalid_lft forever preferred_lft forever
389: eth0@if390: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1450 qdisc noqueue state UP group defaultlink/ether 02:42:0a:00:01:64 brd ff:ff:ff:ff:ff:ff link-netnsid 0inet 10.0.1.100/24 brd 10.0.1.255 scope global eth0valid_lft forever preferred_lft forever
391: eth1@if392: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group defaultlink/ether 5e:70:90:ab:28:6c brd ff:ff:ff:ff:ff:ff link-netnsid 1inet 172.18.0.3/16 brd 172.18.255.255 scope global eth1valid_lft forever preferred_lft forever# route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 172.18.0.1 0.0.0.0 UG 0 0 0 eth1
10.0.1.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0
172.18.0.0 0.0.0.0 255.255.0.0 U 0 0 0 eth1
容器中ping 10.0.1.103, 查路由表, 数据包从eth0发出, 接下来查询veth pair另一端
在宿主机/var/run/docker/netns/下找到容器eth0另一端的veth所在的网络命名空间
# nsenter --net=/var/run/docker/netns/1-tic6vjs8d3 ip link show
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: br0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1450 qdisc noqueue state UP mode DEFAULT group defaultlink/ether 06:12:52:c7:42:88 brd ff:ff:ff:ff:ff:ff
386: vxlan0@if386: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1450 qdisc noqueue master br0 state UNKNOWN mode DEFAULT group defaultlink/ether 06:12:52:c7:42:88 brd ff:ff:ff:ff:ff:ff link-netnsid 0
388: veth0@if387: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1450 qdisc noqueue master br0 state UP mode DEFAULT group defaultlink/ether 1e:09:a3:80:62:d9 brd ff:ff:ff:ff:ff:ff link-netnsid 1
390: veth1@if389: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1450 qdisc noqueue master br0 state UP mode DEFAULT group defaultlink/ether 9a:7c:73:4e:a6:32 brd ff:ff:ff:ff:ff:ff link-netnsid 2
使用nsenter进入这个namespace, 查看网卡和路由表
sudo nsenter --net=/var/run/docker/netns/1-tic6vjs8d3 bash
# ifconfig
br0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1450inet 10.0.1.1 netmask 255.255.255.0 broadcast 10.0.1.255ether 06:12:52:c7:42:88 txqueuelen 0 (Ethernet)RX packets 16 bytes 448 (448.0 B)RX errors 0 dropped 0 overruns 0 frame 0TX packets 2 bytes 108 (108.0 B)TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536inet 127.0.0.1 netmask 255.0.0.0inet6 ::1 prefixlen 128 scopeid 0x10<host>loop txqueuelen 1000 (Local Loopback)RX packets 0 bytes 0 (0.0 B)RX errors 0 dropped 0 overruns 0 frame 0TX packets 0 bytes 0 (0.0 B)TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0veth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1450ether 1e:09:a3:80:62:d9 txqueuelen 0 (Ethernet)RX packets 64 bytes 5656 (5.5 KiB)RX errors 0 dropped 0 overruns 0 frame 0TX packets 74 bytes 6188 (6.0 KiB)TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0veth1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1450ether 9a:7c:73:4e:a6:32 txqueuelen 0 (Ethernet)RX packets 273 bytes 25298 (24.7 KiB)RX errors 0 dropped 0 overruns 0 frame 0TX packets 266 bytes 25004 (24.4 KiB)TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0vxlan0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1450ether 06:12:52:c7:42:88 txqueuelen 0 (Ethernet)RX packets 194 bytes 16296 (15.9 KiB)RX errors 0 dropped 0 overruns 0 frame 0TX packets 194 bytes 16296 (15.9 KiB)TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0# route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
10.0.1.0 0.0.0.0 255.255.255.0 U 0 0 0 br0
- 这里的veth1和容器的eth0是一对veth pair, veth1收到ICMP报文, 查路由表, 把数据包转发给br0网桥
- br0网桥根据MAC地址表, 把数据包转发给vxlan0
- vxlan0将原始以太网帧封装进一个UDP报文(端口号4789), 把目的IP替换变成主机B的IP, 源IP变成主机A的IP, 将封装后数据包发送到宿主机的物理网卡ens160
容器network namespace | vxlan0所在的network namespace | 宿主机A的network namespace
容器eth0 -> veth1 -> br0 -> vxlan0 -> ens160
参考
【1】 Docker跨主机Overlay网络动手实验
【2】 vxlan的原理与实验
相关文章:
通过 Docker Swarm 集群探究 Overlay 网络跨主机通信原理
什么是Overlay网络, 用于解决什么问题 ? Overlay网络通过在现有网络之上创建一个虚拟网络层, 解决不同主机的容器之间相互通信的问题 如果没有Overlay网络,实现跨主机的容器通信通常需要以下方法: 端口映射使用宿主机网络模式 这些方法牺牲了容器网络…...
HarmonyOS NEXT开发进阶(十四):HarmonyOS应用开发者基础认证试题集汇总及答案解析
文章目录 一、前言二、判断题(134道)三、单选题(210道)四、多选题(123道)五、拓展阅读 一、前言 鸿蒙原生技能学习阶段,通过官方认证的资格十分有必要,在项目实战前掌握基础开发理论…...
linux shell 删除空行(remove empty lines)
命令行 grep -v ^$ file sed /^$/d file 或 sed -n /./p file awk /./ {print} file 或 awk {if($0!" ") print} tr -s "n"vim交互 %s/^n//g...
MSVC编译遇到C2059、C2143、C2059、C2365、C2059等错误的解决方案
MSVC编译时,遇到如下错误: c:\program files (x86)\windows kits\10\include\10.0.18362.0\um\msxml.h(1842): error C2059: 语法错误:“常数” [D:\jenkins_home\workspace\xxx.vcxproj] c:\program files (x86)\windows kits\10\include\10.0.18362.0…...
AI重塑云基础设施,亚马逊云科技打造AI定制版IaaS“样板房”
AI正在彻底重塑云基础设施。 IDC最新《2025年IDC MarketScape:全球公有云基础设施即服务(IaaS)报告》显示,AI正在通过多种方式重塑云基础设施,公有云IaaS有望继续保持快速增长,预计2025年全球IaaS的整体规…...
Linux系统之systemctl管理服务及编译安装配置文件安装实现systemctl管理服务
目录 一.systemctl 管理服务 1.systemctl管理 2.设置服务卡机自启动或开机不启动 二.编译安装配置文件编写使得可以使用systemctl管理 1、编写配置文件原因 2、添加配置文件实现systemctl管理服务 一.systemctl 管理服务 1.systemctl管理 基本格式: systemc…...
【NLP 52、多模态相关知识】
生活应该是美好而温柔的,你也是 —— 25.4.1 一、模态 modalities 常见: 文本、图像、音频、视频、表格数据等 罕见: 3D模型、图数据、气味、神经信号等 二、多模态 1、Input and output are of different modalities (eg: tex…...
【树莓派Pico FreeRTOS】-软件定时器(Software Timers)
软件定时器(Software Timers) 文章目录 软件定时器(Software Timers)1、硬件准备2、软件准备3、FreeRTOS的软件定时器介绍3.1 触发一次定时器(Oneshort Timer)3.2 重复定时器RP2040 由 Raspberry Pi 设计,具有双核 Arm Cortex-M0+ 处理器和 264KB 内部 RAM,并支持高达 16MB 的…...
My first day in QT programming
My first QT code this->setWindowTitle("HelloWorld"); //设置窗口名称 this->resize(400, 300); //设置窗口大小 QPushButton* btn new QPushButton; //新建按钮组件 btn->setParent(this); //为按钮指定父对象 …...
MySQL分组的时候遇到ONLY_FULL_GROUP_BY报错和解决
一、ONLY_FULL_GROUP_BY 错误的根本原因 MySQL 5.7 及以上版本默认启用了 sql_modeonly_full_group_by 严格模式。该模式强制要求: SELECT 中的非聚合字段必须出现在 GROUP BY 子句中;所有非聚合字段需通过聚合函数(如 MAX、MIN、SUM&#…...
Element Plus 常用组件
2025/4/1 向全栈工程师迈进!!! 常见Element Plus组件的使用,其文章中“本次我使用到的按钮如下”是我自己做项目时候用到的,记录以加强记忆。阅读时可以跳过。 一、Button按钮 1.1基础按钮 在element plus中提供的按…...
2025年优化算法:真菌生长优化算法(Fungal Growth Optimizer,FGO)
真菌生长优化算法(Fungal Growth Optimizer,FGO) 是发表在中科院一区期刊“ARTIFICIAL INTELLIGENCE REVIEW”(IF:6.7)的2025年3月智能优化算法 01.引言 Fungal Growth Optimizer (FGO) 是一种基于真菌生长行为的元启发式优化算法…...
人工智能之数学基础:矩阵分解之LU分解
本文重点 LU分解是线性代数中一种重要的矩阵分解方法,它将一个方阵分解为一个下三角矩阵(L)和一个上三角矩阵(U)的乘积。这种分解方法在数值线性代数中有着广泛的应用,特别是在求解线性方程组、计算矩阵的行列式、求逆矩阵等方面。 LU分解的基本概念 设A是一个nn的方阵…...
阿里通义千问发布全模态开源大模型Qwen2.5-Omni-7B
Qwen2.5-Omni 是一个端到端的多模态模型,旨在感知多种模态,包括文本、图像、音频和视频,同时以流式方式生成文本和自然语音响应。汇聚各领域最先进的机器学习模型,提供模型探索体验、推理、训练、部署和应用的一站式服务。https:/…...
23 种设计模式中的解释器模式
给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子。 这种模式通常用于需要解释执行某种语言的场景,如正则表达式、SQL解析等。 解释器模式的核心组件。 抽象表达式(Ab…...
AquaMoon and Chess_CodeForces - 1545B
由110变成011,由011变成110,“11”的组合和0可以交换位置 如果是1110 或者是 1110 的情况,红色的“11”与0换位置,变成1011,可以看成蓝色的“11”到了0的后面,蓝色“11”和0的相对位置改变了,而…...
软考-数据库系统工程师第四版pdf
软考-数据库系统工程师第四版pdf git中的文件相对没有那么清楚,网盘的有高清版 github下载 这里我给出仓库地址 链接: https://github.com/yaodada123/ruankao-pdf https://github.com/yaodada123/ruankao-pdf gitee下载 https://gitee.com/yao-hengchao/ruank…...
淘天集团Java开放岗暑期实习笔试(2025年4月2日)
摘要: 除3道笔试题外,还有10道单选、5道不定项、2道Java单选、1道Java不定项选择题,笔试时长100分组,整体难度很大。三道算法题本人全部没有AC(惭愧),事后总结至此。 第一道算法题,…...
关于 数据库 UNION 和 UNION ALL 的使用,以及 分库分表环境下多表数据组合后的排序和分页问题的解决方案 的详细说明,并以表格总结关键内容
以下是关于 数据库 UNION 和 UNION ALL 的使用,以及 分库分表环境下多表数据组合后的排序和分页问题的解决方案 的详细说明,并以表格总结关键内容: 1. UNION 和 UNION ALL 的核心区别 1.1 定义与语法 UNION 功能:合并两个或多个 …...
【接口重复请求】axios通过AbortController解决页面切换过快,接口重复请求问题
处理网络请求时,我们经常会遇到需要中途取消请求的情况,比如用户在两个tab之间反复横跳的场景,如果每个接口都从头请求到结束,那必然会造成很大的服务压力。 AbortController是一个Web API,它提供了一个信号对象&…...
论文阅读:基于增强通用深度图像水印的混合篡改定位技术 OmniGuard
一、论文信息 论文名称:OmniGuard: Hybrid Manipulation Localization via Augmented Versatile Deep Image Watermarking作者团队:北京大学发表会议:CVPR2025论文链接:https://arxiv.org/pdf/2412.01615二、动机与贡献 动机: 随着生成式 AI 的快速发展,其在图像编辑领…...
Flutter极速接入IM聊天功能并支持鸿蒙
Flutter极速接入IM聊天功能并支持鸿蒙 如果你们也是Flutter项目,想快速接入聊天,包括聊天的UI界面,强烈推荐这一家。因为我们已经完成了集成,使用非常稳定,集成也非常快捷方便。 而且,就在今天,…...
深挖 DeepSeek 隐藏玩法·智能炼金术2.0版本
前引:屏幕前的你还在AI智能搜索框这样搜索吗?“这道题怎么写”“苹果为什么红”“怎么不被发现翘课” ,。看到此篇文章的小伙伴们!请准备好你的思维魔杖,开启【霍格沃茨模式】,看我如何更新秘密的【知识炼金…...
C语言数组知识点
一、数组的基本概念 1.定义 数组是相同数据类型元素的集合,通过连续内存存储,支持高效访问。 核心特点: 元素类型相同 内存连续分配 通过下标访问(从 0 开始) 2.分类 一维数组:线性结构(如…...
【新手初学】SQL注入getshell
一、引入 木马介绍: 木马其实就是一段程序,这个程序运行到目标主机上时,主要可以对目标进行远程控制、盗取信息等功能,一般不会破坏目标主机,当然,这也看黑客是否想要搞破坏。 木马类型: 按照功…...
DAY 34 leetcode 349--哈希表.两个数组的交集
题号349 我尝试硬解失败 /*class Solution {public int[] intersection(int[] nums1, int[] nums2) {int n1nums1.length;int n2nums2.length;int sizeMath.min(n1,n2);int []arrnew int[size];int count0;for(int i0;i<n1;i){outerloop:for(int j0;j<n2;j){if(nums1[i…...
Qt常用宏定义判断大全
Qt 提供了一系列预定义宏用于判断 Qt 版本、操作系统平台、编译器特性等。这些宏在跨平台开发中非常有用。 1. Qt 版本判断宏 // 检查Qt版本 #if QT_VERSION > QT_VERSION_CHECK(5, 15, 0)// Qt 5.15.0及以上版本特有代码 #endif// 常用版本判断 #if QT_VERSION > QT_V…...
tsconfig.json:error TS6306: Referenced project ‘/tsconfig.node.json‘
这是TypeScript配置文件中的错误。具体有两个问题: 错误TS6306:引用的项目/tsconfig.node.json必须设置"composite": true错误TS6310:引用的项目tsconfig.node.json不能禁用emit 要解决这些问题,需要修改tsconfig.nod…...
14-SpringBoot3入门-MyBatis-Plus之CRUD
1、整合 13-SpringBoot3入门-整合MyBatis-Plus-CSDN博客 2、表 3、crud package com.sgu;import com.sgu.mapper.UserMapper; import com.sgu.pojo.User; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.spri…...
前端面试常考算法题目详解
根据2025年最新前端面试趋势,结合腾讯、阿里等大厂真题,我为你整理了以下高频算法题型及JS实现方案: 一、数组/字符串处理 1. 两数之和(哈希表法) 问题:找出数组中两数之和等于目标值的索引 const twoSu…...
