通过 Docker Swarm 集群探究 Overlay 网络跨主机通信原理

news2025/4/4 19:13:06

什么是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:2377

To 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 1000
    link/ether 00:0c:29:68:16:97 brd ff:ff:ff:ff:ff:ff
    altname enp3s0
    inet 192.168.52.203/24 brd 192.168.52.255 scope global noprefixroute ens160
       valid_lft forever preferred_lft forever
    inet6 fe80::20c:29ff:fe68:1697/64 scope link noprefixroute
       valid_lft forever preferred_lft forever
3: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default
    link/ether ee:70:00:b9:06:99 brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
       valid_lft forever preferred_lft forever
4: docker_gwbridge: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
    link/ether fe:d7:43:f4:5e:0a brd ff:ff:ff:ff:ff:ff
    inet 172.18.0.1/16 brd 172.18.255.255 scope global docker_gwbridge
       valid_lft forever preferred_lft forever
    inet6 fe80::fcd7:43ff:fef4:5e0a/64 scope link
       valid_lft forever preferred_lft forever
9: veth2c2d786@if8: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker_gwbridge state UP group default
    link/ether f2:1d:db:39:8c:d7 brd ff:ff:ff:ff:ff:ff link-netnsid 1
    inet6 fe80::f01d:dbff:fe39:8cd7/64 scope link
       valid_lft forever preferred_lft forever
392: veth04de33f@if391: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker_gwbridge state UP group default
    link/ether 5a:ac:6c:6b:55:4f brd ff:ff:ff:ff:ff:ff link-netnsid 4
    inet6 fe80::58ac:6cff:fe6b:554f/64 scope link
       valid_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 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
389: eth0@if390: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1450 qdisc noqueue state UP group default
    link/ether 02:42:0a:00:01:64 brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet 10.0.1.100/24 brd 10.0.1.255 scope global eth0
       valid_lft forever preferred_lft forever
391: eth1@if392: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
    link/ether 5e:70:90:ab:28:6c brd ff:ff:ff:ff:ff:ff link-netnsid 1
    inet 172.18.0.3/16 brd 172.18.255.255 scope global eth1
       valid_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 1000
    link/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 default
    link/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 default
    link/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 default
    link/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 default
    link/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 1450
        inet 10.0.1.1  netmask 255.255.255.0  broadcast 10.0.1.255
        ether 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 0
        TX packets 2  bytes 108 (108.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        inet6 ::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 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

veth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1450
        ether 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 0
        TX packets 74  bytes 6188 (6.0 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

veth1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1450
        ether 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 0
        TX packets 266  bytes 25004 (24.4 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

vxlan0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1450
        ether 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 0
        TX 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的原理与实验

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

HarmonyOS NEXT开发进阶(十四):HarmonyOS应用开发者基础认证试题集汇总及答案解析

文章目录 一、前言二、判断题&#xff08;134道&#xff09;三、单选题&#xff08;210道&#xff09;四、多选题&#xff08;123道&#xff09;五、拓展阅读 一、前言 鸿蒙原生技能学习阶段&#xff0c;通过官方认证的资格十分有必要&#xff0c;在项目实战前掌握基础开发理论…

MSVC编译遇到C2059、C2143、C2059、C2365、C2059等错误的解决方案

MSVC编译时&#xff0c;遇到如下错误&#xff1a; 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&#xff1a;全球公有云基础设施即服务&#xff08;IaaS&#xff09;报告》显示&#xff0c;AI正在通过多种方式重塑云基础设施&#xff0c;公有云IaaS有望继续保持快速增长&#xff0c;预计2025年全球IaaS的整体规…

Linux系统之systemctl管理服务及编译安装配置文件安装实现systemctl管理服务

目录 一.systemctl 管理服务 1.systemctl管理 2.设置服务卡机自启动或开机不启动 二.编译安装配置文件编写使得可以使用systemctl管理 1、编写配置文件原因 2、添加配置文件实现systemctl管理服务 一.systemctl 管理服务 1.systemctl管理 基本格式&#xff1a; systemc…

【NLP 52、多模态相关知识】

生活应该是美好而温柔的&#xff0c;你也是 —— 25.4.1 一、模态 modalities 常见&#xff1a; 文本、图像、音频、视频、表格数据等 罕见&#xff1a; 3D模型、图数据、气味、神经信号等 二、多模态 1、Input and output are of different modalities (eg&#xff1a; tex…

Element Plus 常用组件

2025/4/1 向全栈工程师迈进&#xff01;&#xff01;&#xff01; 常见Element Plus组件的使用&#xff0c;其文章中“本次我使用到的按钮如下”是我自己做项目时候用到的&#xff0c;记录以加强记忆。阅读时可以跳过。 一、Button按钮 1.1基础按钮 在element plus中提供的按…

2025年优化算法:真菌生长优化算法(Fungal Growth Optimizer,FGO)

真菌生长优化算法(Fungal Growth Optimizer&#xff0c;FGO) 是发表在中科院一区期刊“ARTIFICIAL INTELLIGENCE REVIEW”&#xff08;IF&#xff1a;6.7&#xff09;的2025年3月智能优化算法 01.引言 Fungal Growth Optimizer (FGO) 是一种基于真菌生长行为的元启发式优化算法…

阿里通义千问发布全模态开源大模型Qwen2.5-Omni-7B

Qwen2.5-Omni 是一个端到端的多模态模型&#xff0c;旨在感知多种模态&#xff0c;包括文本、图像、音频和视频&#xff0c;同时以流式方式生成文本和自然语音响应。汇聚各领域最先进的机器学习模型&#xff0c;提供模型探索体验、推理、训练、部署和应用的一站式服务。https:/…

论文阅读:基于增强通用深度图像水印的混合篡改定位技术 OmniGuard

一、论文信息 论文名称:OmniGuard: Hybrid Manipulation Localization via Augmented Versatile Deep Image Watermarking作者团队:北京大学发表会议:CVPR2025论文链接:https://arxiv.org/pdf/2412.01615二、动机与贡献 动机: 随着生成式 AI 的快速发展,其在图像编辑领…

深挖 DeepSeek 隐藏玩法·智能炼金术2.0版本

前引&#xff1a;屏幕前的你还在AI智能搜索框这样搜索吗&#xff1f;“这道题怎么写”“苹果为什么红”“怎么不被发现翘课” &#xff0c;。看到此篇文章的小伙伴们&#xff01;请准备好你的思维魔杖&#xff0c;开启【霍格沃茨模式】&#xff0c;看我如何更新秘密的【知识炼金…

【新手初学】SQL注入getshell

一、引入 木马介绍&#xff1a; 木马其实就是一段程序&#xff0c;这个程序运行到目标主机上时&#xff0c;主要可以对目标进行远程控制、盗取信息等功能&#xff0c;一般不会破坏目标主机&#xff0c;当然&#xff0c;这也看黑客是否想要搞破坏。 木马类型&#xff1a; 按照功…

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…

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…

三轴云台之相机技术篇

一、结构设计 三轴云台通常由空间上三个互相垂直的框架构成&#xff0c;包括内框&#xff08;俯仰框&#xff09;、中框&#xff08;方位框&#xff09;和外框&#xff08;横滚框&#xff09;。这些框架分别负责控制相机的俯仰运动、方位运动和横滚运动&#xff0c;从而实现对目…

Bugku-再也没有纯白的灵魂

下载文件发现是兽音先用https://roar.iiilab.com/加密flag 得到“~呜嗷嗷嗷嗷呜啊嗷啊呜呜嗷呜呜~嗷嗷~啊嗷啊呜嗷嗷~嗷~嗷~呜呜嗷呜啊啊”&#xff0c;与密文对比对比发现字段少个啊&#xff0c;并且B对应嗷&#xff0c;U对应呜&#xff0c;G对应啊&#xff0c;K对应~补充啊后…

多模态大语言模型arxiv论文略读(一)

Does Transliteration Help Multilingual Language Modeling? ➡️ 论文标题&#xff1a;Does Transliteration Help Multilingual Language Modeling? ➡️ 论文作者&#xff1a;Ibraheem Muhammad Moosa, Mahmud Elahi Akhter, Ashfia Binte Habib ➡️ 研究机构: Pennsyl…

单元测试原则之——不要模拟不属于你的类型

在单元测试中,不要模拟不属于你的类型(Don’t mock types you don’t own)是一个重要的原则。这是因为外部库或框架的类型(如第三方依赖)可能会在未来的版本中发生变化,而你的模拟可能无法反映这些变化,从而导致测试失效。 以下是一个基于Java Mockito 的示例,展示如何…

算法与数据结构面试题

算法与数据结构面试题 加油&#xff01; 考查数据结构本身 什么是数据结构 简单地说&#xff0c;数据结构是以某种特定的布局方式存储数据的容器。这种“布局方式”决定了数据结构对于某些操作是高效的&#xff0c;而对于其他操作则是低效的。首先我们需要理解各种数据结构&a…

边缘检测技术现状初探2:多尺度与形态学方法

一、多尺度边缘检测方法 多尺度边缘检测通过在不同分辨率/平滑度下分析图像&#xff0c;实现&#xff1a; 粗尺度&#xff08;大σ值&#xff09;&#xff1a;抑制噪声&#xff0c;提取主体轮廓细尺度&#xff08;小σ值&#xff09;&#xff1a;保留细节&#xff0c;检测微观…

【AI News | 20250402】每日AI进展

AI Repos 1、Dolphin 由数据海洋AI与清华大学联合研发的Dolphin多任务语音识别模型正式亮相。该模型覆盖东亚、南亚、东南亚及中东地区40余种语言&#xff0c;并支持22种汉语方言&#xff0c;训练数据量超21万小时&#xff08;含自有及开源数据&#xff09;&#xff0c;具备语…