OVN简介

2023-05-16

三、OVN入门

3.1 OVN简介

Open vSwitch(OVS)是一款开源的“虚拟交换机”,控制协议方面它不但支持OpenFlow的所有特性而且扩展了部分OpenFlow的功能;Overlay协议方面它支持GRE, VXLAN, STT, Geneve四种主流Overlay数据包。OVS已经是数据平面的事实标准了,很多白盒交换机都兼容它提供的接口;还有一些x86架构的交换机则直接是基于OVS和DPDK的。所以无论“上层”的ODL、ONOS、Neutron如何的翻天覆地的“闹腾”而OVS还是岿然不动(最后流表的执行者还是OVS)。

但是长期一来OVS都缺乏一个统一的网络模型(Neutron虽然花费巨大力气实现一个网络模型但是仅仅适用于OpenStack而无法用于容器更加无法单独使用),于是在2015年OVS社区宣布了一个子项目——Open Virtual Network(OVN)。它旨在为OVS提供一个控制平面,通过一个统一的网络模型为容器、虚拟机提供相同的网络服务。

虽然很多人不愿意承认但是事实上它瞄准的对象是三个——ODL、ONOS、Neutron。我们可以看一下OpenStack中networking-ovn子项目,它是基于OVN实现的“Neutron”旨在替换Neutron的L2、L3功能。对比传统的Neutron的L2、L3的实现代码它的代码量非常少。这就是OVN的优点,对比ODL、ONOS、Neutron提供的大而全、复杂庞大、紧耦合的控制器,OVN提供的是一个轻量级控制器,这个轻量级不但体现在OVN本身的代码少(只有几个C语言文件,而且代码很少),模型简单(虽然简单但是很丰富,更懂得利用OVS本身的特性)而且它的流表设计(Pipeline)也容易理解。
OVN的功能

  • L2功能,叫Logical switches(逻辑交换机)
  • L3功能,叫Logical Router(逻辑路由器)
  • ACL,就像我们物理交换机可以配置ACL,OVN可以针对逻辑交换机添加ACL
  • NAT,SNAT、DNAT都支持
  • Load Balancer,支持面向内部的负载均衡和提供外部访问的负载均衡

OVN的架构

这幅架构图描绘了OVN的整体架构和进程分布,为了讨论方便我们把OVN中承担“管理”任务的节点成为ovn-central;把承担实际数据转发的节点成为ovn-host(可以类比成controller node、compute node)。

OVN引入了两个全新的OVSDB,一个叫Northbound DB(北向数据库,NB),一个叫Southbound DB(南向数据库,SB);两个库都可以导出远程接口,允许用户通过OVSDB协议对数据库进行操作(不必担心OVSDB只是叫DB而已,其实它更像etcd、zookeeper这种中间件)。

NB存放的是我们定义的逻辑交换机、逻辑路由器之类的数据,我们可以通过ovn提供的命令行(ovn-nbctl)完成添加、删除、修改、查询等操作;当然可以写代码通过OVSDB协议完成类似动作。OVN的NB是面向“上层应用”的或者叫“云管平台(Cloud Management System,CMS)”所以叫“北向接口”。

SB进程比较特殊它同时接受两边的“写入”,首先是运行在ovn-host上的ovn-controller启动之后会去主动连接到ovn-central节点上的SB进程,把自己的IP地址(Chassis),本机的OVS状态(Datapath_Binding)写入到SB数据库中(所以叫南向接口)。ovn-controller还“监听”(etcd、zookeeper类似的功能)SB数据库中流表的变化(Flow)去更新本地的OVS数据库,这叫“流表下发”。

SB中的流表是由运行在ovn-central节点上的ovn-northd进程修改的,ovn-northd会“监听”NB的改变,把逻辑交换机、路由器的定义转换成流表(Flow)写入到SB数据库。

整个架构非常简单,OVN仅仅提供了一组网络模型(逻辑交换机、逻辑路由器等),提供了一个OVSDB数据库用来存放这些模型同时把数据库的访问权限开放给最终用户,让最终用户通过OVSDB协议来直接“写入”这些模型(北向)。通过一个叫ovn-northd的进程把网络模型转换成流表,放入另一个数据库让ovn-host自己来“取”流表(南向),以此完成流表下发。

3.2 拓扑规划

一般OVS试验环境建议创建N台虚拟机或者使用mininet作为试验环境,这种试验环境有三方面的缺陷1. 不具备“真实性”过于简单 2. 不便于借助Wireshark等分析工具来分析网络原理 3. 没有办法融入到真实环境,比如如何和传统L2、L3设备互联。

所以笔者这里推荐一种新的实验方式——借助GNS3完成实验。

GNS3提供OVS在2.6以上版本才会提供OVN支持(2.5的版本不太靠谱,跟现在的命令无法兼容),大家可以去官方网站上下载OVS自己来编译(目前版本是2.7)。当然如果你像我一样懒得话可以直接用编译好的,Centos没有提供OVS源,大家可以通过ovirt的yum源安装2.7版本。我个人的选择的版本是Ubuntu17(Ubuntu16带的是OVS2.5),它内置了OVS2.6版本的源,直接apt-get install就可以完成安装了。
通过GNS3创建一个拓扑


端口连接方式和服务器列表

服务器 | 业务IP|角色
ovn-node1 | 10.10.10.11 | central
ovn-node2 | 10.10.10.12 | host
ovn-node3 | 10.10.10.13 | host


截图中是ovn-node1的IP地址配置,注意我使用第二块网卡作为OVN互联网的网络(也是通过SW1互联的网卡),第一块网卡是NAT配置,由VMWare DHCP分配的,此处作为单纯的管理IP(用于SSH登录)。

3.3 安装配置

在ovn-node1上作为“管理节点”(架构图中叫 ovn-central,Ubuntu中软件包也叫 ovn-central)

安装成功后可以看到ovn相关进程,

在ovn-central启动了ovn-northd守护进程,两个OVSDB进程(分别是SB和NB)。
验证SB(6642)、NB(6641)的远程端口已经打开,

在ovn-node1、ovn-node2上安装ovn-host

安装成功后可以看到ovn相关进程


启动了ovn-controller进程和openvswtich进程
通过下面的命令把ovn-host节点连接到ovn-central(overlay封装协议为vxlan)

 
 
 
 
Java
 
1
`sudo ovs-vsctl set Open_vSwitch . external_ids:ovn-remote="tcp:10.10.10.11:6642" external_ids:ovn-encap-ip="10.10.10.12" external_ids:ovn-encap-type=vxlan`

在ovn-node1上执行验证ovn-node2添加成功(chassis)

3.4 学会排错

由于环境不一样所以实验的过程中肯定会碰到各种问题,我们又不太可能枚举出所有的常见问题挨个说明。最有效的方式是“授人以渔”,所以后续的文章中我会尽量把如果排错写错来。今天我们先学习阅读OVN产生的日志。
ovn-central上的/var/log/openvswitch/以下几个文件:

  • ovn-northd.log ,ovn-northd进程产生的日志,类似下面的输出


可以看到ovn-northd进程通过unix domain socket(Linux下一种IPC通讯方式)连接上了SB、NB数据库进程。

  • ovsdb-server.log ,本机OVS数据库进程日志。一般我们不会让ovn-central加入到网络转发中所以这个进程以及日志都用不到。
  • ovsdb-server-nb.log,NB数据库日志
  • ovsdb-server-sb.log ,SB数据库日志
  • ovs-vswitchd.log,本机OVS进程,一般我们不会让ovn-central加入到网络转发中所以这个进程以及日志都用不到。

ovn-host上的/var/log/openvswitch/以下几个文件:

  • ovn-controller.log ,ovn-controller产生的日志,输入如下


以红线为分割,上面汇报了ovn-controller连接了两个OVSDB数据——通过unix domain socket连接到本地OVS数据库;通过TCP连接到远程OVS数据库。下面汇报了ovn-controller发现的本地网桥(Datapath)。

  • ovsdb-server.log ,本机OVS数据库进程日志
  • ovs-vswitchd.log,本机OVS进程日志

ovn-host承担数据转发功能,所以本机OVS需要参与转发的,日志是很有价值的

重点分析一下, ovs-vswitchd.log的内容。首先是汇报系统的硬件状态,通过unix domain socket连接到本地OVS数据库。**后面的“system@ovs-sytem”输出非常重要**,OVS有很多特性体现在允许使用一些OpenFlow没有定义的流表定义关键字(比如NAT,learn),这些特性中有一部分是需要系统支持的(内核模块)日志的输出说明了OVS相关特性是否工作正常。

总结

本章我们学习了GNS3如何使用以及抓包,除此以外,对OVN主要有一个入门的了解,以及了解如何解决问题、技术架构,安装了一个OVN的实验环境,学会了分析OVN产生的日志。接下来的一章我们会开始OVN的正式学习——学习OVN网络模型中的第一部分“逻辑交换机”。

一、为什么OVN会出现?

OpenvSwitch (OVS) 以其丰富的功能和相对优秀的性能,成为OpenStack中广泛使用的虚拟交换机。下图是2年前的一个调查,时过境迁,nova-network已经被废弃,OpenvSwitch如今的占有率肯定会更高。

OVS甚至可以说是网络虚拟化里最重要的工业级开源产品,OVS模仿物理交换机设备的工作流程,实现了很多物理交换机当时才支持的许多网络功能。OVN提供了许多原生的虚拟网络功能,提升了OVS的工作效率和性能。
OVN是OpenvSwitch项目组为OpenvSwitch开发SDN控制器,同其他SDN产品相比,OVN对OpenvSwitch 及OpenStack有更好的兼容性和性能。
在2016年的OpenStack Austin 峰会上,OVN项目组有个演讲提到了的OVN存在的意义(目标),原文是

  • Production-quality
  • Straightforward design
  • Scale to 1000s of hypervisors (each with many VMs/containers)
  • Improved performance and stability over existing OpenStack OVS plugin
  • Become preferred method for OpenStack+OVS integration for the majority of use cases

中文翻译如下:

  • 可用于生产环境
  • 简洁的设计
  • 支持1000台以上的物理机环境(也支持相当数量的虚拟机/容器环境)
  • 基于已有的OpenStack OVS 插件 来提升性能和稳定性
  • 成为OpenStack+OVS集成场景下的首选方案

已经实现从OVS 平滑升级到 OVN
OVN 对于运行平台没有额外的要求,只要能够运行 OVS,就可以运行 OVN,所以从 OVS 升级到 OVN 是非常简单快捷的。原有的网络、路由等数据不会丢失,也不需要对这些数据导入导出来进行数据迁移

另外 OVN 可以和很多 CMS(Cloud Management System)集成到一起,尤其是 OpenStack Neutron,这些 CMS 只需要添加一个 plugin 来配置 OVN 即可。

二、OVN使得Neutron组件数量减少

以最新的Ocata版本中的OVN和OVS 2.6版本来看OVN带来的变化:

  • OVN自带的(时髦的说法叫"原生")ML2 driver替换掉 OVS ML2 driver 和 Neutron的OVS agent;
  • OVN原生支持L3和DHCP功能,这样就不再需要Neutron 的L3 agent、 DHCP agent 和DVR。

看明白了没有?随着OVN不断添加新的功能,大量的Neutron agents就被干掉了。这样的话,组件数量将会大大减少。后面会详细讲OVN 给 Neutron带来实现机制方面的变化。

三、OVN L3 对比 Neutron L3

Neutron 的三层功能主要有路由,SNAT 和 Floating IP(也叫 DNAT),它是通 Linux kernel 的namespace 来实现的,每个路由器对应一个 namespace,利用 Linux TCP/IP 协议栈来做路由转发。

OVN 支持原生的三层功能,不需要借助 Linux TCP/IP stack,用OpenFlow 流表来实现路由查找,ARP 查找,TTL 和 MAC 地址的更改。OVN 的路由也是分布式的,路由器在每个计算节点上都有实例,有了 OVN 之后,不需要 Neutron L3 agent 了 和DVR了。

四、OVN和其它通用SDN控制器(比如OpenDayLight)的主要区别

  • OVN专注于实现云计算管理平台场景下的SDN控制器
  • OVN专注于实现二层和三层网络功能。除了在传输层实现了基于L4的ACL 外,基本上不在L4 ~ L7层实现某些功能。

五、OVN的实现了哪些功能?拥有哪些特性?

最新版本OVN的高级特性,英文原文如下:

(可以和OVS的特性对比一下,就知道OVN和OVS 的侧重点。见我的另一篇博文http://blog.csdn.net/zhengmx100/article/details/54729272)
Provides virtual networking abstraction for OVS, implemented using L2 and L3 overlays, but can also manage connectivity to physical networks
Supports flexible ACLs (security policies) implemented using flows that use OVS connection tracking
Native support for distributed L3 routing using OVS flows, with support for both IPv4 and IPv6
ARP and IPv6 Neighbor Discovery suppression for known IP-MAC bindings
Nativesupport for NAT and load balancing using OVS connection tracking
Native fully distributedsupport for DHCP
Works with any OVS datapath (such as the default Linux kernel datapath, DPDK, or Hyper-V) that supports all required features (namely Geneve tunnels and OVS connection tracking. See the datapath feature list in the FAQ for details.)
Supports L3 gateways from logical to physical networks
Supports software-based L2 gateways
Supports TOR (Top of Rack) based L2 gateways that implement the hardware_vtep schema
Can provide networking for both VMs and containers running inside of those VMs, without a second layer of overlay networking

选取几个重点讲一下:
Logical switches:逻辑交换机,用来做二层转发。
L2/L3/L4 ACLs:二到四层的 ACL,可以根据报文的 MAC 地址,IP 地址,端口号来做访问控制。
Logical routers:逻辑路由器,分布式的,用来做三层转发。
Multiple tunnel overlays:支持多种隧道封装技术,有 Geneve,STT 和 VXLAN。
TOR switch or software logical switch gateways:支持使用硬件 TOR switch 或者软件逻辑 switch 当作网关来连接物理网络和虚拟网络。

六、OVN的架构和分析

先来一张简单明了的架构图

看完上图,感觉OVN的架构很简单是不? 再看看我从网上找的另一张更详细的架构图:

OVN/CMS Plugin 是Neutron的一个插件,作为OVN 和 CMS 之间的接口 。它将CMS中的数据(存储在Neutron DB)翻译成一种“中间格式”。

这种中间格式就是逻辑网络配置数据,这样CMS中的网络配置数据就能够被OVN理解 (准确的说是能够被OVN的Northbound DB 所理解)。

Northbound DB 里面存的就是上面OVN/CMS Plugin翻译之后的逻辑网络的相关数据。比如 logical switch,logical router,logical port和ACL。

Northbound DB 里面的几乎所有的内容都是由 CMS 产生的

OVN-northd 类似于一个集中的控制器,监听Northbound DB 数据库的内容变化,它把 Northbound DB 里面的逻辑网络的相关数据翻译成 Southbound DB 可以理解的格式(logical datapath flows),并传递给 Southbound DB 进行存储,进而被所有的chassis 读取和应用。 (关于chassis这个概念 ,本人会在下一篇博文中进行介绍。)

Southbound DB 处在 OVN 架构的核心,它是 OVN 中最重要的部分,它跟 OVN 的其他组件都有交互。 里面存的数据和 Northbound DB 语义完全不一样,主要包含 3 类数据(第二类数据就是OVN-northd 从Northbound DB 翻译过来的):

一、物理网络数据,比如 hypervisor的 IP 地址,hypervisor的 tunnel 封装格式;

二、逻辑网络数据,比如报文如何在逻辑网络中转发;

三、物理网络和逻辑网络的绑定关系,比如逻辑端口关联到哪个 hypervisor上面。这类数据存储在binding表中,字段有uuid,chassis, logical_datapath, logical_port, mac, parent_port, tag, tunnel_key。

如果对这里的2次翻译不太明白的话,我举个例子:
有四个人在一起聊天,他们分别来自不同国家。
一个英国人只会英语,
一个伊拉克人同时掌握英语和阿拉伯语,
一个伊朗人同时掌握阿拉伯语和俄罗斯语,
一个俄罗斯人只会俄罗斯语。
英国人讲的话要被俄罗斯人理解是不是要先被伊拉克人翻译为阿拉伯语,再被伊朗人翻译俄罗斯语。 这个过程需要2个人进行翻译。

ovn-controller 是 OVN 里面的 agent,类似于 Neutron 里面的 ovs-agent,它也是运行在每个 hypervisor和软件网关之上。

它有下面2种功能:
(1)把物理网络的信息写到 Southbound DB 里面(这类信息就包括 Southbound DB中的第一类数据);
(2)把 Southbound DB 里面存的一些数据转化成 Openflow flow 配到本地的 OVS table 里面,来实现报文的转发。

第2个功能的具体实现机制就是:
ovn-controller连接到到本地的ovsdb-server ,监控、读取、管理OpenvSwitch的配置信息;

ovn-controller作为ovs-vswitchd 的Openflow 控制器来控制流量的转发。另外,从架构图中就可看出ovn-controller是一种分布式SDN控制器。

ovs-vswitchd 和 ovsdb-server 是 OVS 的两个进程:

  • ovs-vswitchd :核心模块,实现交换功能,和Linux内核模块一起,实现基于流的交换;
  • ovsdb-server :是一个数据库。其保存了整个OVS的配置信息,包括接口,流表和VLAN等;ovs-vswitchd从其查询配置信息;

小结:OVN 给 Neutron带来实现机制方面的变化

从 OVN 的架构可以看出,OVN 里面数据的读写都是通过 OVSDB来做的,取代了 Neutron 的消息队列机制,所以有了 OVN 之后,Neutron 里面所有的 agent 都不需要了,Neutron 变成了一个 API server 来处理用户的 REST 请求,其他的功能都交给 OVN 来做,只需要在 Neutron 里面加一个 plugin 来调用配置 OVN。

Neutron 里面的子项目 networking-ovn 就是实现 OVN 的 plugin。Plugin 使用 OVSDB 协议来把用户的配置写在 Northbound DB 里,ovn-northd 监听到 Northbound DB 配置发生改变,然后把配置翻译到 Southbound DB 里面。 ovn-controller 监控到 Southbound DB 数据的发生变化之后,进而更新本地的流表。

OVN 里面报文的处理都是通过 OVS OpenFlow 流表来实现的,而在 Neutron 里面二层报文处理是通过 OVS OpenFlow 流表来实现,三层报文处理是通过 Linux TCP/IP 协议栈来实现。

转载于:https://www.cnblogs.com/liuhongru/p/11121731.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

OVN简介 的相关文章

  • Testing ovn manually based on LXD (by quqi99)

    作者 xff1a 张华 发表于 xff1a 2022 05 27 版权声明 xff1a 可以任意转载 xff0c 转载时请务必以超链接形式标明文章原始出处和作者信息及本版权声明 准备两个LXD容器 lxc list 43 43 43 43
  • set up ovn development env (by quqi99)

    作者 xff1a 张华 发表于 xff1a 2022 07 08 版权声明 xff1a 可以任意转载 xff0c 转载时请务必以超链接形式标明文章原始出处和作者信息及本版权声明 编译ovs并启动ovs vswitchd https docs
  • ovn-central raft HA (by quqi99)

    作者 xff1a 张华 发表于 xff1a 2022 10 12 版权声明 xff1a 可以任意转载 xff0c 转载时请务必以超链接形式标明文章原始出处和作者信息及本版权声明 What s raft RAFT https raft git
  • OVN简介

    作者简介 xff1a 郑敏先 xff0c 就职于诺云系统 xff08 上海 xff09 有限公司 工作地点为南京的诺云研发中心 担任解决方案工程师 本人博客为 xff1a http blog csdn net zhengmx100 一 为什
  • devstack安装OpenStack Pike版本 (OVN+VLAN)

    控制节点配置文件 Sample DevStack local conf This sample file is intended to be used for your typical DevStack environment that 3
  • 《OVN Logical Flows and ovn-trace》翻译

    在本篇文章中 xff0c 我将解释什么是Logical Flow以及如何使用ovn trace去更好地理解它们 同时 xff0c 我也会用一些例子来解释 xff0c 为什么使用Logical Flow这种抽象模型能让新特性的添加变得出乎意料
  • OVN简介

    三 OVN入门 3 1 OVN简介 Open vSwitch xff08 OVS xff09 是一款开源的 虚拟交换机 xff0c 控制协议方面它不但支持OpenFlow的所有特性而且扩展了部分OpenFlow的功能 xff1b Overl
  • openstack和ovn架构

  • OVN入门

    参考链接 如何借助 OVN 来提高 OVS 在云计算环境中的性能 OVN简介 Open vSwitch Documentation OVSDB介绍及在OpenDaylight中的调用 OpenDaylight即将迈入 七年之痒 xff1f
  • ovn 配置逻辑路由器实现三层转发

    本文使用ovn搭建一个三层转发的环境 xff0c 拓扑图如下 image png 两个虚拟交换机ls1和ls2 xff0c 端口ip网段分别为 10 10 10 0 24和 10 10 20 0 24 虚拟交换机上分别连接两个vm 使用na
  • ovn-northd 源码分析

    ovn northd是ovn中的核心后台进程 xff0c 主要负责将ovn的高层配置转换成供ovn controller后台进程使用的逻辑配置 xff0c 更详细的说就是它将ovn northbound数据库中传统意义上的逻辑网络配置转换成
  • OpenvSwitch 的 Open Virtual Network(OVN)项目

    几天前 xff08 1 月 13 日 xff09 xff0c OpenvSwitch 团队正式宣布了 OVN xff08 Open Virtual Network xff09 项目 xff0c 参考 Open Virtual Network
  • OpenStack Neutron 对接OVN 使用 networking-ovn

    OVN是OVS的控制平面 xff0c 它给 OVS 增加了对虚拟网络的原生支持 xff0c 大大提高了 OVS 在实际应用环境中的性能和规模 使用neutron 配置mechanism drivers 为OVN时 xff0c 会有以下优点
  • 【kubernetes/k8s概念】kube-ovn架构和部署安装

    Kube OVN是一款由灵雀云自主研发的开源企业级云原生Kubernetes容器网络编排系统 xff0c 它通过将OpenStack领域成熟的网络功能平移到Kubernetes xff0c 极大增强了Kubernetes容器网络的安全性 可
  • 【kubernetes/k8s概念】OVN SouthBound DB 及 ovn-sbctl 命令

    OVN 南向数据库 xff08 OVN Southbound DB xff09 xff0c 南向数据库是系统的中心 xff0c 客户端是上层的 ovn northd 和下层运行在每一个传输节点的 ovn controller 南向数据库包括
  • OVN 简介

    文章目录 OVN 介绍OVN的架构OVN 应用OVN 信息流配置数据状态信息 Chassis 设置逻辑网络 OVN 介绍 Open vSwitch xff08 OVS xff09 是一款开源的 虚拟交换机 xff0c 控制协议方面它不但支持
  • OVN 安装,使用,流表分析

    文章目录 OVN 安装环境准备安装 OVN 安装 环境准备 两台 ubuntu 18 04 管理网络 172 18 22 0 24 172 18 22 197 192 168 22 198 安装 apt get update apt get
  • OVN 流表基础 -- 基于 kubeOVN (一)

    文章目录 Kubectl ko 工具分析Nbctl SbctlTrace Ovn 流表MatchActionRegisterTable 介绍Logical Switch DatapathsLogical Router Datapaths K
  • OVS和OVN 2.8新功能

    OVS和OVN 2 8新功能 本文最初整理在我的github上SDN Learning notes 本文翻译自ovs官方文档 本文档主要是关于2017年8月底发布的Open vSwitch 2 8中添加的内容 xff0c 重点介绍OVN中的
  • OVN实验----L3互通

    概述 在L2互通基础上 xff0c 完成跨网段互访 物理拓扑 如上一个实验OVN实验 L2互通 逻辑拓扑 按照上个实验OVN实验 L2互通 的操作方式 xff0c 再配置一组容器blue xff0c 网段192 168 2 0 24 配置完

随机推荐

  • 函数模板和类模板成员函数的定义通常放在头文件中

    今天写程序时 xff0c 将函数模板的声明和定义分开放在头文件和 cpp文件中 xff0c 发生了连接错误 上网查看资料和查看 C 43 43 PRIMER 5 P582发现 xff0c xff1a 函数模板和类模板成员函数的定义通常放在头
  • 虚拟机防火墙关了怎么端口还是不能访问

    今天虚拟机启动时候发现网站不能访问了 xff0c 先在本地ping了下地址 xff0c 发现是可以ping通的 xff1b 然后telnet下 80 端口 xff0c 发现进不去 然后在虚拟机上面启动apache xff0c 发现不能访问
  • T84341 Jelly的难题1

    T84341 Jelly的难题1 题解 当窝发现窝的锅在读入这个矩阵的时候 xff0c 窝 窝 窝 果然 xff0c 一遇到和字符串有关的题就开始吹空调 好啦我们说说思路吧 BFS队列实现 拿出一个没有走过的点 xff0c 扩展它可以达到的
  • strtok(), strtok_s() 字符串分割函数

    strtok 函数原型 Check return CRT INSECURE DEPRECATE strtok s CRTIMP char cdecl strtok Inout opt z char Str In z const char D
  • iOS网络——NSURLCache设置网络请求缓存

    今天在看HTTP协议 xff0c 看到了response头中的cache control xff0c 于是就深入的研究了一下 发现了iOS中一个一直被我忽略的类 NSURLCache类 NSURLCache NSURLCache用于缓存网络
  • Maven 教程4-常用dos命令

    常用dos命令 mvn compile 编译mvn clean 清理mvn package 打包mvn package Dmaven test skip 61 true 跳过测试打包mvn package Dmaven test skip
  • Docker笔记

    lxc xff1a LinuX Container chroot xff0c 根切换 xff1b namespaces xff1a 名称空间 CGroups xff1a 控制组 简单使用 xff1a lxc checkconfig xff1
  • 芒果iOS开发之创建pch文件

    在Xcode6之前 xff0c 创建一个新工程xcode会在Supporting files文件夹下面自动创建一个 工程名 Prefix pch 文件 xff0c 也是一个头文件 xff0c pch头文件的内容能被项目中的其他所有源文件共享
  • HDU 1085

    题意 xff1a 有1 2 5三数 xff0c 你赋予他们各自的数量 xff0c 求他们所不能组成的最小数 分析 xff1a 首先想到暴力 xff0c 两层循环 暴力超时 xff0c 再寻他法 O n 2 include 34 cstdio
  • 谈谈对事件的理解(持续更新中)

    谈谈对事件的理解 xff1a 从前有一家人 xff0c 我们称为window家 window他其中有一个儿子叫事件 事件 事件他有很多好基友 xff0c 每次发生什么事情都会找到事件 xff0c 叫他帮忙查看一下那些细节出现了问题 可是事件
  • SSIS组件转换_排序、合并、合并联转换

    一 排序转换 xff08 Sort xff09 排序转换功能是按升序或降序对输入流中的数据进行排序 并将排序后的数据复制到转换输出中 它类似于T SQL中的order by 语句 下面以数据库AdventureWorks为例来介绍一下排序转
  • MariaDB 单表查询与聚合(5)

    MariaDB数据库管理系统是MySQL的一个分支 主要由开源社区在维护 采用GPL授权许可MariaDB的目的是完全兼容MySQL 包括API和命令行 MySQL由于现在闭源了 而能轻松成为MySQL的代替品 在存储引擎方面 使用Xtra
  • 详解python linecache模块读取文件的方法 分类: python...

    本节主要内容 xff1a python linecache模块读取文件 在python中 xff0c 有个好用的模块linecache xff0c 该模块允许从任何文件里得到任何的行 xff0c 并且使用缓存进行优化 xff0c 常见的情况
  • 【ubuntu】ubuntu安装WPS出现系统缺失字体

    ubuntu安装WPS出现系统缺失字体 1 官网下载WPS http community wps cn download 2 双击安装或者命令行安装 3 安装好后出现系统缺失字体问题 解决 xff0c 下载 xff1a https pan
  • 歪国人DIY的MINI四轴

    歪国人DIY的MINI四轴 Crazyflie 2 0 自己仿Crazyflie CrazyPony 转载于 https www cnblogs com LittleTiger p 4699001 html
  • Linux系统-CENTOS7界面美化

    前期准备 xff1a 在美化前 我们先安装一个扩展源 yum install y epel release 然后安装字体包 yum y install liberation mono fonts 安装gnome menis标准菜单实现 通常
  • [原创]Python+selenium+Chrome爬取excel网站

    最近要写一个水利网站的爬虫脚本 xff0c 将网页中2个excel的数据 xff0c 爬到一个excel表里 恩 xff0c 就是下面的网页截图 xff0c 一左一右两张表 左边日期控件 xff0c 输入对应日期查询相应日期的数据 看到这么
  • el-select绑定值为对象时,报错[Vue warn]: <transition-group> children must be keyed: <ElTag>...

    解决方法 xff1a lt el select v model 61 34 syncParams toSlaveList 34 multiple value key 61 34 ip 34 placeholder 61 34 请选择 34
  • iOS开发零基础教程之真机调试流程

    本讲主要内容 xff1a 1 真机测试前准备工作 2 第一步创建App ID 3 第二步创建开发证书Development Certificate 4 第三步打开本地钥匙串创建CSR文件 5 第四步添加设备 6 第五步创建描述文件 7 第六
  • OVN简介

    三 OVN入门 3 1 OVN简介 Open vSwitch xff08 OVS xff09 是一款开源的 虚拟交换机 xff0c 控制协议方面它不但支持OpenFlow的所有特性而且扩展了部分OpenFlow的功能 xff1b Overl