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

了解 k8s 网络基础知识

了解

Docker 网络模式

在使用 Docker run 创建 Docker 容器时,可以使用 --net 选项指定容器的网络模式,Docker 可以有4种网络模式。

  1. host 模式。–net=host 指定和宿主机共用一个 NetWork Namespace,容器中的网络环境(ip 地址、路由等)和宿主机的网络环境一致。
  2. none 模式。使用 --net=none 指定关闭网络功能。
  3. bridge 模式。–net=bridge 指定默认设置,容器使用独立的 Network Namespace,并连接到 Docker0 虚拟网桥,通过 iptables nat 表配置和宿主机进行通信。
  4. container 模式,–net=container:NAME_or_ID 指定新创建的容器和已经存在的一个容器共享一个 Network Namespace,而不是和宿主机共享。新创建的容器不会创建自己的网卡、配置IP,而是和一个指定的容器共享IP、端口范围等等。

Flannel 支持三种后端实现,分别是:VXLAN、host-gw、UDP。

理解容器 “跨主通信” 的原理,从 Flannel 插件讲起

第一种:UDP 模式

Flannel 的 UDP 模式,该模式是 Flannel 最原始使用解决容器跨主机网络的实现方法之一。

栗子:

  • 宿主机 Node 1 上有一个容器 container-1,它的 IP 地址是 100.96.1.2,对应的 docker0 网桥的地址是:100.96.1.1/24。
  • 宿主机 Node 2 上有一个容器 container-2,它的 IP 地址是 100.96.2.3,对应的 docker0 网桥的地址是:100.96.2.1/24。

现在的任务,就是让 container-1 访问 container-2。

flanneld 在收到 container-1 发给 container-2 的 IP 包之后,就会把这个 IP 包直接封装在一个 UDP 包里,然后发送给 Node 2。不难理解,这个 UDP 包的源地址,就是 flanneld 所在的 Node 1 的地址,而目的地址,则是 container-2 所在的宿主机 Node 2 的地址。

第二种:VXLAN 模式(虚拟可扩展局域网)

Agenda

k8s NetWork Components

  • Pod NetWorking within and between nodes
  • Service abstractions (service registraton & discovery)
  • DNS
  • Ingress (L7 HTTP routing)
  • NetWork Policies access control (Application “Firewall”)

二层网络:假如两个 Pod 的IP 地址分为为 10.170.2.2 和 10.170.2.3 它们的网断都是相同的,叫 二层网络通信。

三层网络:两个 Pod 的IP 地址分为为 10.170.2.2 和 10.170.3.2 不同网断或者说跨网卡通信的叫三层

假设两个 Pod 的IP 地址分为为 10.170.2.2 和 10.170.3.2 ,网段不同但是属于一个网卡,怎么解决它们之间通信呢,可以使用 VXLAN 的解决方案,他可以在三层网络作二层传输。

k8s Network Model

  • All Pods can reach all other Pods, without NAT 。Implementaions :
    • Flat
    • Overlays(e.g:VXLAN)
    • Routing(e.g:BGP)
  • All Nodes can reach all other Nodes,without NAT
  • IPAM-IP Address Management

Services : Problem

services 将一组 Pod 抽象成一个 Service,后面做个负载均衡

让 Pod 能够 ping 外网解决 DNS

Ingress

和 Service 区别:

  • Service 是 4 层网络模型,只能提供到 (IP + 端口)OSI
  • Ingress 是 7 层网络模型,HTTP 代理和路由

/etc/cni/net.d 该目录是k8s使用那种网络插件

k8s CNI Introduction

k8s CNI Canal Lab Demo

K8s 与 Linux 网络

Linux Namespace 机制

Linux namespace 实现了 6 项资源隔离,基本上涵盖了一个小型操作系统的运行要素,包括主机名、用户权限、文件系统、网络、进程号、进程间通信。

namespace系统调用参数隔离内容内核版本
UTSCLONE_NEWUTS主机名和域名2.6.19
IPCCLONE_NEWIPC信号量、消息队列和共享内存2.6.19
PIDCLONE_NEWPID进程编号2.6.24
NetworkCLONE_NEWNET网络设备、网络栈、端口等2.6.29
MountCLONE_NEWNS挂载点(文件系统)2.4.19
UserCLONE_NEWUSER用户和用户组3.8

在这里插入图片描述

Docker 网络模式

在使用 Docker run 创建 Docker 容器时,可以使用 --net 选项指定容器的网络模式,Docker 可以有4种网络模式。

  1. host 模式。–net=host 指定和宿主机共用一个 NetWork Namespace,容器中的网络环境(ip 地址、路由等)和宿主机的网络环境一致。
  2. none 模式。使用 --net=none 指定关闭网络功能。
  3. bridge 模式。–net=bridge 指定默认设置,容器使用独立的 Network Namespace,并连接到 Docker0 虚拟网桥,通过 iptables nat 表配置和宿主机进行通信。
  4. container 模式,–net=container:NAME_or_ID 指定新创建的容器和已经存在的一个容器共享一个 Network Namespace,而不是和宿主机共享。新创建的容器不会创建自己的网卡、配置IP,而是和一个指定的容器共享IP、端口范围等等。

Overlay 网络

Overlay 网络时建立在实际物理网络(Underlay网络)之上的虚拟网络。underlay 网络和 设备都是真正存在的实体,而 Overlay网络时依赖 Underlay网络虚拟出来的。

比如两个设备之间通过TCP或UDP通信,那么这就是underlay网络。但在TCP或UDP协议上可以承载应用数据,如果应用数据承载了IP协议,那么这个 Overlay网络是三层网络;而如果应用数据承载了数据链路层协议,那么这个 overlay网络时二层网络。

在这里插入图片描述

这个装置如何实现呢?在Linux里有个隧道技术

  • linux tun:在三层网络之上构建三层网络,Overlay网络通信协议位于IP层及以上。(IP、tcp/udp、ftp/http)overlay网络中不支持arp协议。
  • linux vxlan:在三层网络(tcp/ip)之上构建二层网络。overlay 网络通信协议位于数据链路层及以上。overlay网络支持arp协议(Ethernetll,ip,tcp/udp,ftp/http等)

iptables

  • filter:过滤数据包,实现软件防火墙的功能
  • nat:网络地址转换(改变源IP、 目的IP、 源端口、目的端口)
  • mangle:修改数据包的服务类型、TTL、 并且可以配置路由实现Q0S内核模块
  • raw:决定数据包是否被状态跟踪机制处理

iptables链的匹配原则:
从序列号为1的开始匹配,直到匹配到第一条合适的规则并执行, 后续规则即使能够匹配也不再执行,所以将经常会被匹配到的规则放在表前面。

iptables 五链

在这里插入图片描述

容器技术之网络

容器隔离技术:

  • namespace,也即每个 namespace 中的应用看到的是不同的 IP 地址、用户空间、程号等。
  • cgroup,也即明明整台机器有很多的 CPU、内存,而一个应用只能用其中的一部分。

1、单机下,Linux 容器网络(网桥模式)

Docker 项目会默认在宿主机上创建一个名叫 docker0 的网桥,凡是连接在 docker0 网桥上的容器,就可以通过它来进行通信。可是,我们又该如何把这些容器“连接”到 docker0 网桥上呢?这时候,我们就需要使用一种名叫 Veth Pair 的虚拟设备了。

同一个宿主机上的不同容器通过 docker0 网桥进行通信的流程:

在这里插入图片描述

当你遇到容器连不通“外网”的时候,你都应该先试试 docker0 网桥能不能 ping 通,然后查看一下跟 docker0 和 Veth Pair 设备相关的 iptables 规则是不是有异常,往往就能够找到问题的答案了。

2、容器“跨主机通信”问题

如果在另外一台宿主机(比如:10.168.0.3)上,也有一个 Docker 容器。那么,我们的 在另一台宿主机上的容器之间又该如何访问它呢?

容器的“跨主通信”问题

在 Docker 的默认配置下,一台宿主机上的 docker0 网桥,和其他宿主机上的 docker0 网桥,没有任何关联,它们互相之间也没办法连通。所以,连接在这些网桥上的容器,自然也没办法进行通信了。

构建这种容器网络的核心在于:我们需要在已有的宿主机网络上,再通过软件构建一个覆盖在已有宿主机网络之上的、可以把所有容器连通在一起的虚拟网络。所以,这种技术就被称为:Overlay Network(覆盖网络)。

从 Flannel 说起,目前 Flannel 支持三种后端实现,分别是:VXLAN、host-gw、UDP;

2.1、Flannel UDP 模式

当 IP 包从容器经过 docker0 出现在宿主机,然后又根据路由表进入 flannel0 设备后,宿主机上的 flanneld 进程(Flannel 项目在每个宿主机上的主进程),就会收到这个 IP 包。然后,flanneld 看到了这个 IP 包的目的地址,是 100.96.2.3,就把它发送给了 Node 2 宿主机。

flanneld 又是如何知道这个 IP 地址对应的容器,是运行在 Node 2 上的呢?子网(Subnet)

事实上,在由 Flannel 管理的容器网络里,一台宿主机上的所有容器,都属于该宿主机被分配的一个“子网”。在我们的例子中:

  • Node 1 的子网是 100.96.1.0/24,container-1 的 IP 地址是 100.96.1.2;
  • Node 2 的子网是 100.96.2.0/24,container-2 的 IP 地址是 100.96.2.3。

所以,flanneld 进程在处理由 flannel0 传入的 IP 包时,就可以根据目的 IP 的地址(比如 100.96.2.3),匹配到对应的子网(比如 100.96.2.0/24),从 Etcd 中找到这个子网对应的宿主机的 IP 地址是 10.168.0.3

而接下来 flanneld 的工作就非常简单了:flanneld 会直接把这个 IP 包发送给它所管理的 TUN 设备,即 flannel0 设备。根据我前面讲解的 TUN 设备的原理,这正是一个从用户态向内核态的流动方向(Flannel 进程向 TUN 设备发送数据包),所以 Linux 内核网络栈就会负责处理这个 IP 包,具体的处理方法,就是通过本机的路由表来寻找这个 IP 包的下一步流向。

docker0 网桥会扮演二层交换机的角色,将数据包发送给正确的端口,进而通过 Veth Pair 设备进入到 container-2 的 Network Namespace 里。

2.2、Virtual Extensible LAN(虚拟可扩展局域网)

VXLAN 是 Linux 内核本身就支持的一种网络虚似化技术。所以说,VXLAN 可以完全在内核态实现上述封装和解封装的工作,从而通过与前面相似的“隧道”机制,构建出覆盖网络(Overlay Network)。

2.3、CNI 插件工作原理

CNI 插件的工作原理:

当 kubelet 组件需要创建 Pod 的时候,它第一个创建的一定是 Infra 容器。所以在这一步,dockershim 就会先调用 Docker API 创建并启动 Infra 容器,紧接着执行一个叫作 SetUpPod 的方法。这个方法的作用就是:为 CNI 插件准备参数,然后调用 CNI 插件为 Infra 容器配置网络。

容器与容器之间要“通”,容器与宿主机之间也要“通”。并且,Kubernetes 要求这个“通”,还必须是直接基于容器和宿主机的 IP 地址来进行的。

2.4、host-gw

工作原理:

在这里插入图片描述

假设现在,Node 1 上的 Infra-container-1,要访问 Node 2 上的 Infra-container-2。

当你设置 Flannel 使用 host-gw 模式之后,flanneld 会在宿主机上创建这样一条规则,以 Node 1 为例:

可以看到,host-gw 模式的工作原理,其实就是将每个 Flannel 子网(Flannel Subnet,比如:10.244.1.0/24)的“下一跳”,设置成了该子网对应的宿主机的 IP 地址。

不难看出,host-gw 模式能够正常工作的核心,就在于 IP 包在封装成帧发送出去的时候,会使用路由表里的“下一跳”来设置目的 MAC 地址。这样,它就会经过二层网络到达目的宿主机。

Flannel host-gw 模式必须要求集群宿主机之间是二层连通的。

2.5、Calico 插件

实际上,Calico 项目提供的网络解决方案,与 Flannel 的 host-gw 模式,几乎是完全一样的。也就是说,Calico 也会在每台宿主机上,添加一个格式如下所示的路由规则:

<目的容器IP地址段> via <网关的IP地址> dev eth0

其中,网关的 IP 地址,正是目的容器所在宿主机的 IP 地址。三层网络方案得以正常工作的核心,是为每个容器的 IP 地址,找到它所对应的、“下一跳”的网关。

不过,不同于 Flannel 通过 Etcd 和宿主机上的 flanneld 来维护路由信息的做法,Calico 项目使用了一个“BGP”来自动地在整个集群中分发路由信息。BGP 的全称是 Border Gateway Protocol,即:边界网关协议。

Calico 项目的架构就非常容易理解了。它由三个部分组成:

  • Calico 的 CNI 插件。这是 Calico 与 Kubernetes 对接的部分。
  • Felix。它是一个 DaemonSet,负责在宿主机上插入路由规则(即:写入 Linux 内核的 FIB 转发信息库),以及维护 Calico 所需的网络设备等工作。
  • BIRD。它就是 BGP 的客户端,专门负责在集群里分发路由规则信息。

3、Cilium

在 5.10 内核以后,Cilium 新增了 eBPF Host-Routing 功能,该功能更加速了 eBPF 数据面性能,新增了 bpf_redirect_peer 和 bpf_redirect_neigh 两个 redirect 方式,bpf_redirect_peer 可以理解成 bpf_redirect 的升级版,其将数据包直接送到 veth pair Pod 里面接口 eth0 上,而不经过宿主机的 lxc 接口,这样实现的好处是少进入一次 cpu backlog queue 队列,该特性引入后,路由模式下,Pod -> Pod 性能接近 Node -> Node 性能,同时 Cilium 数据面路径发生了较大的变化。

文档链接:https://www.yuque.com/wei.luo/cni/vwtmwz

文档地址:https://www.yuque.com/wei.luo/cni/qubifn

文档地址:20210903-eBPF XDP TC介绍

  • eBPF Documentation
  • http://arthurchiao.art/blog/cilium-life-of-a-packet-pod-to-service-zh/

相关文章:

了解 k8s 网络基础知识

了解 Docker 网络模式 在使用 Docker run 创建 Docker 容器时&#xff0c;可以使用 --net 选项指定容器的网络模式&#xff0c;Docker 可以有4种网络模式。 host 模式。–nethost 指定和宿主机共用一个 NetWork Namespace&#xff0c;容器中的网络环境&#xff08;ip 地址、路…...

用户信息界面按钮禁用+发送消息功能

用户信息界面按钮禁用发送消息功能 前言 那么在上一集我们就完成了个人信息窗口所有的内容的修改&#xff0c;那么我们就需要进一步来看我们别的用户的信息界面的窗口。 需求分析 在之前的我们也讲了用户信息界面窗口一共有下图几种组件。 用户头像、用户id、用户昵称、用户…...

接近开关传感器-PCB线图电感式传感器【衰减系数1】

设计和工作原理 衰减系数为1的传感器是在电感式接近开关的基础上装备了特殊的振荡器。传感器内部有两个耦合空心线圈&#xff0c;能够保证根据不同的金属特性作合适的检测调整。无需考虑目标物是不同的金属&#xff0c;因为传感器能在同一感应距离下检测所有金属。 衰减系数为…...

C/C++流星雨

系列文章 序号直达链接1C/C爱心代码2C/C跳动的爱心3C/C李峋同款跳动的爱心代码4C/C满屏飘字表白代码5C/C大雪纷飞代码6C/C烟花代码7C/C黑客帝国同款字母雨8C/C樱花树代码9C/C奥特曼代码10C/C精美圣诞树11C/C俄罗斯方块12C/C贪吃蛇13C/C孤单又灿烂的神-鬼怪14C/C闪烁的爱心15C/C…...

计算机网络:传输层、应用层、网络安全、视频/音频/无线网络、下一代因特网

目录 &#xff08;五&#xff09;传输层 1&#xff0e;传输层寻址与端口 2&#xff0e;无连接服务与面向连接服务 3. 传输连接的建立与释放 4. UDP 的优点 5. UDP 和 TCP 报文段报头格式 6. TCP 的流量控制 7&#xff0e;TCP 的拥塞控制 8. TCP 传送连接的管理 &#…...

[漏洞挖掘与防护] 05.CVE-2018-12613:phpMyAdmin 4.8.1后台文件包含缺陷复现及防御措施

这是作者新开的一个专栏——“漏洞挖掘与防护”,前期会复现各种经典和最新漏洞,并总结防护技巧;后期尝试从零学习漏洞挖掘技术,包括Web漏洞和二进制及IOT相关漏洞,以及Fuzzing技术。新的征程,新的开启,漫漫长征路,偏向虎山行。享受过程,感谢您的陪伴,一起加油~ 欢迎关…...

GroundingDINO微调训练_训练日志解释

文章目录 1. 训练日志1. Epoch 和 Iteration2. Learning Rate&#xff08;学习率&#xff09;3. ETA&#xff08;预计剩余时间&#xff09;4. Time 和 Data Time5. Memory6. Gradient Norm&#xff08;梯度范数&#xff09;7. Loss&#xff08;损失&#xff09;8. Individual L…...

【0362】Postgres内核 XLogReaderState readBuf 有完整 XLOG page header 信息 ? ( 7 )

上一篇: 【0361】Postgres内核 page_read 读取所请求数据长度(至少 short page header)( 6 ) 文章目录 1. 检查 page_read 返回值 readLen2. 根据 readBuf 计算 XLogPageHeader 大小2.1 验证 XLOG Page header2.2 更新 XLogReaderState 读取状态信息1. 检查 page_read 返回…...

H5接入Steam 获取用户数据案例 使用 OpenID 登录绑定公司APP账户 steam公开用户信息获取 steam webapi文档使用

官方文档地址 1.注册 Steam API Key&#xff1a; 你需要一个 Steam Web API Key&#xff0c;可以在 Steam API Key 页面 获取。https://steamcommunity.com/dev/apikey 这里开发做demo用自己steam账户的就好&#xff0c;后续上线要用公司的账户 2.使用 OpenID 登录&#xff…...

pytorch多GPU训练教程

pytorch多GPU训练教程 文章目录 pytorch多GPU训练教程1. Torch 的两种并行化模型封装1.1 DataParallel1.2 DistributedDataParallel 2. 多GPU训练的三种架构组织方式2.2 数据不拆分&#xff0c;模型拆分&#xff08;Model Parallelism&#xff09;2.3 数据拆分&#xff0c;模型…...

力扣--LCR 178.训练计划VI

题目 教学过程中&#xff0c;教练示范一次&#xff0c;学员跟做三次。该过程被混乱剪辑后&#xff0c;记录于数组 actions&#xff0c;其中 actions[i] 表示做出该动作的人员编号。请返回教练的编号。 示例 1&#xff1a; 输入&#xff1a;actions [5, 7, 5, 5] 输出&#…...

Linux 网络接口配置

在 Linux 中,网络接口配置文件用于控制系统中的软件网络接口,并通过接口实现对网络设备的控制。当系统启动时,系统通过这些接口配置文件决定启动哪些接口,以及如此对这些接口进行配置. 在 Linux 中,网络接口配置文件用于控制系统中的软件网络接口,并通过这些接口实现对网络…...

【从零开始入门unity游戏开发之——C#篇01】理论开篇

文章目录 前言前置条件什么是编程&#xff1f;什么是代码&#xff1f;什么是编程语言&#xff1f;常见的编程语言什么是C#&#xff1f;学习Unity为什么要先学习C#&#xff1f;选择适合自己的IDE集成开发环境VSCode安装和环境配置VSCode调试模式专栏推荐完结 前言 这个系列我想…...

ABAP开发-批量导入BAPI和BDC_1

系列文章目录 文章目录 系列文章目录[TOC](文章目录) 前言一、概念二、BDC和BAPI数据导入1、BDC数据导入&#xff08;录屏&#xff09;2、BAPI数据导入 三、实例1、BAPI2、BDC 总结 前言 一、概念 SAP中&#xff0c;对一个事务码反复操作并且达到批量处理数据的效果&#xff0…...

RabbitMQ七种工作模式之 RPC通信模式, 发布确认模式

文章目录 六. RPC(RPC通信模式)客户端服务端 七. Publisher Confirms(发布确认模式)1. Publishing Messages Individually(单独确认)2. Publishing Messages in Batches(批量确认)3. Handling Publisher Confirms Asynchronously(异步确认) 六. RPC(RPC通信模式) 客⼾端发送消息…...

并非传统意义上的整体二分

是的&#xff0c;如标题所见&#xff0c;本文章会以作者所理解的整体二分思想来介绍一系列整体二分食用方法。 一下内容均是作者本人理解&#xff0c;可能会与算法本身冲突。 1 本质 1.1 板子及从中的启发 我们在做主席树板子的时候&#xff0c;如果使用整体二分&#xff0…...

PostgreSQL的一主一从集群搭建部署 (同步)

一、实验环境 虚拟机名IP身份简称keep-postgres12-node1192.168.122.87主节点node1keep-postgres12-node2192.168.122.89备节点node2 二、安装数据库 源码包方式&#xff08;主&#xff09; 1、创建用户 [rootkeep-postgres12-node1 ~]# groupadd postgres [rootkeep-post…...

ios逆向某新闻 md5+aes

本期的案例比较简单&#xff0c;也许是ios逆向算法本来就比较简单的原因&#xff0c;所以前面我就多扯一些爬虫和逆向的东西。之前写的文章都是js逆向和android逆向的案例&#xff0c;这也是首篇ios的案例&#xff0c;所以会从入门开始讲起。 3大逆向对比 首先爬虫工程师大部…...

grpc的负载均衡

grpc的负载均衡分为client-side load balance和server-side load balance。 所谓的“客户端负载均衡”是指主调方调用被调方的时候&#xff0c;在grpc.DialContext里需要指定grpc.WithDefaultServiceConfig&#xff0c;这个DefaultServiceConfig默认是用pick-first策略。也支持…...

提升搜索体验!—— 推出 Elastic Rerank 模型(技术预览版)

作者&#xff1a;来自 Elastic Shubha Anjur Tupil 几分钟内即可开始使用 Elastic Rerank 模型&#xff1a;强大的语义搜索功能&#xff0c;无需重新索引&#xff0c;提供灵活性和成本控制&#xff1b;高相关性、顶级性能和文本搜索效率。 使用我们全新的先进跨编码器 Elastic …...

【51单片机】程序实验1112.外部中断-定时器中断

主要参考学习资料&#xff1a;B站【普中官方】51单片机手把手教学视频 前置知识&#xff1a;C语言 单片机套装&#xff1a;普中STC51单片机开发板A4标准版套餐7 码字不易&#xff0c;求点赞收藏加关注(•ω•̥) 有问题欢迎评论区讨论~ 目录 程序实验11&12.外部中断-定时器…...

webrtc-java:引领Java进入实时通信新时代

webrtc-java&#xff1a;引领Java进入实时通信新时代 项目地址:https://gitcode.com/gh_mirrors/we/webrtc-java 在现代互联网应用中&#xff0c;实时通信&#xff08;Real-Time Communication, RTC&#xff09;已成为连接人们的桥梁。而说起RTC技术的先锋&#xff0c;不得不…...

TongWeb7-东方通快速使用手册

TongWeb7-东方通 快速使用手册 文章目录 第1章 TongWeb7 产品介绍 1.1 概述1.2 规范支持 第2章 TongWeb7 安装 2.1 TongWeb7 安装要求 2.1.1 TongWeb7 支持的操作系统2.1.2 系统要求2.1.3 其他 2.2 安装TongWeb72.3TongWeb7 目录结构说明2.4 TongWeb7 的启动和停止 第3章 应用…...

JVM内存区块

大家好&#xff0c;经过前两篇文章的介绍&#xff0c;大家对数组也有了一定了解&#xff0c;其实所有的数组都是对象&#xff0c;我们在方法中引用数组的变量叫做引用变量&#xff08;简称引用&#xff09;&#xff0c;那么数组到底是存放在哪里的呢&#xff0c;为什么引用再出…...

C语言单元总结

黑色加粗表示刷题刷到这样的题 红色加粗表示可能重要 单元一 程序设计宏观认识 C语言程序框架 C语言程序最基本的程序框架由两部分构成&#xff0c;分别是 1) 编译预处理 2) 函数组 C语言程序构成 C程序最大的特点就是所有的程序都是用函数来装配的&#xff0c;函数是构成…...

通过PS和Unity制作2D动画之一:创建形象

1、通过路径画出轮廓 使用路径的过程中&#xff0c;需要注意&#xff1a; 1&#xff09;如果使用形状工具作图&#xff0c;比如使用椭圆工具画正圆形&#xff0c;需要设置其属性为“路径”。 2&#xff09;使用路径选择工具&#xff0c;再按住Alt键点击某个路径&#xff0c;可…...

Notable是一款优秀开源免费的Markdown编辑器

一、Notable简介 ‌ Notable‌是一款开源的跨平台Markdown编辑器&#xff0c;支持Linux、MacOS、Windows以及国产操作系统等多种主流操作系统。它以其高颜值和强大的功能&#xff0c;成为了许多用户的首选工具。 主要特性 实时预览‌&#xff1a; Notable提供了实时预览功能&…...

基于MFC绘制门电路

MFC绘制门电路 1. 设计内容、方法与难点 本课题设计的内容包括了基本门电路中与门和非门的绘制、选中以及它们之间的连接。具体采用的方法是在OnDraw函数里面进行绘制&#xff0c;并设计元器件基类&#xff0c;派生出与门和非门&#xff0c;并组合了一个引脚类&#xff0c;在…...

C—指针初阶(2)

如果看完阁下满意的话&#xff0c;能否一键三连呢&#xff0c;我的动力就是大家的支持与肯定&#xff0c;冲&#xff01; 二级指针 我们先看概念以及作用&#xff1a;用来存放一级指针的地址的指针 先看例子&#xff0c;我们逐一分析 我们先分析上面那个“1” 标注那里&#x…...

Linux 基础环境的开发工具以及使用(下)

1. make / Makefile 自动化构建的工具 1&#xff09;引入 在我们进行一些大型的工程的时候&#xff0c;代码量是极其大&#xff0c;当我们代码在进行一系列的编译的时候&#xff0c;难免会出现一些错误&#xff0c;当我们对错误进行一系列的更改之后&#xff0c;难道我们需要…...

网站制作广/网站备案查询系统

1、获取企业微信信息 1&#xff09;我的企业 --> 企业信息 --> 企业ID 2&#xff09;创建一个应用&#xff0c;记录该应用的 AgentId、Secret 2、python代码 #!/usr/bin/env python # -*- coding:utf-8 -*-import json import requestsclass WeChat:def __init__(self):s…...

wordpress前端编辑器/网站制作推广

运行-〉regedit 打开下面两个位置&#xff0c;根据名称找出要删除的程序右键菜单。 1.[HKEY_CLASSES_ROOT\*\shellex\ContextMenuHandlers]...所有文件的右键&#xff1b;2.[HKEY_CLASSES_ROOT\Directory\shellex\ContextMenuHandlers]...文件夹的右键&#xff1b; 要是不放心可…...

地方门户网站建设要求/怎么样才能引流客人进店

单元格的高度自适应原理就是通过内部label的高度变化来增加和减少单元格的高度。 - (UILabel *)label { if(_label nil) { _label [[UILabel alloc] init]; [self.contentView addSubview:_label]; _label.numberOfLines 0; [_label mas_makeConstraints:^(MASConstraintMak…...

路得威网站谁做的/西安seo培训

导读假如在你正看着屏幕上的某些重要的事情时&#xff0c;你不想让你的小猫或者小狗在你的键盘上行走&#xff0c;或者让你的孩子在键盘上瞎搞一气&#xff0c;那我建议你试试 xtrlock 这个工具。假如在你正看着屏幕上的某些重要的事情时&#xff0c;你不想让你的小猫或者小狗在…...

阿里巴巴国际站网站做销售方案/seo是什么意思seo是什么职位

•MVC的组成部分模型 (Model) 代表你的数据结构。通常来说&#xff0c;你的模型类将包含取出、插入、更新你的数据库资料这些功能。 视图 (View) 是展示给用户的信息。一个视图通常是一个网页&#xff0c;但是在 CodeIgniter 中&#xff0c;一个视图也可以是一个页面片段&#…...

网站建设费怎么写分录/网络运营是什么意思

目录 网络安全之防火墙 server nat 基本配置实验 实验图 1.进入视图模式 2.配置端口IP地址即区域 防火墙 ​编辑 untrust区域 DMZ区域 trust区域 配置trust-untrust区域的ftp 在untrust区域中的server1开启ftp服务 配置trust-untrust区域的ftp的安全策略 登陆ftp 查找se…...