- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我有一个 VPC,假设它的 CIDR block 是 10.0.0.0/16。我在那个 VPC 中有几个随机子网。他们的 CIDR 可能类似于 10.0.128.0/19、10.0.32.0/19、10.0.208.0/22。子网的 CIDR block 必须被 VPC 的 CIDR block 覆盖。此外,不允许子网之间的 CIDR 重叠。
我的问题是:给定这样的 VPC 和子网,如何为我要创建的新子网(比方说/22)找到具有特定大小的好 CIDR block 。在我看来,好 意味着更好地利用空间。比方说,如果我只想要一个小的 CIDR block ,它不应该在 VPC CIDR 的中间返回一个 CIDR,这样可以防止将来放置潜在的大 CIDR block 。欢迎使用其他好的定义。没有任何初始状态的保证。
我不知道是否有针对此类问题的标准算法。我目前正在考虑的是利用二叉树。左 child 表示 0,而右 child 表示 1。所有叶子代表正在使用的 CIDR block 。要获得一个新的 CIDR block ,问题基本上是在某种程度上创建一个休假取决于所需的 block 大小。如何创造一个好的叶子我还不知道。
顺便说一句,我正在编写 Java 代码。我找不到这个图书馆。如果有现有的库,也请告诉我!
最佳答案
二叉树是正确的结构,但它不需要深入到叶级。仅在需要时将其取下。树中的每个叶子代表一个分配或一个可用 block 。根据定义,每个 CIDR block 的大小都是 2 的幂。因此,如果一个节点/ block 有子节点,则它正好有两个。如果节点有子节点(不是叶节点),则其 block 不可用。
因此,您的顶级 block 及其初始分配像这样分解(从左边缘表示的树以便于绘制。***
标记分配的 block 。[我可能很胖-在这里指指点点,但基本思想应该很清楚:每个/16 有两个/17 子节点,每个/17 有两个/18 子节点,等等。除非该节点可用,在这种情况下它没有子节点。]):
/---- 10.0.0.0/19
|
/--- 10.0.0.0/18
| |
| \---- 10.0.32.0/19***
|
/--- 10.0.0.0/17
| \
| ---- 10.0.64.0/18
|
10.0.0.0/16
|
| /---- 10.0.128.0/19***
| |
| /---- 10.0.128.0/18
| | |
| | \---- 10.0.160.0/19
| |
\--- 10.0.128.0/17
|
| /---- 10.0.192.0/20
| |
| /---- 10.0.192.0/19
| | |
| | | /---- 10.0.208.0/22***
| | | |
| | | /---- 10.0.208.0/21
| | | | |
| | | | \---- 10.0.212.0/22
| | | |
| | \---- 10.0.208.0/20
| | |
| | \---- 10.0.216.0/21
| |
\---- 10.0.192.0/18
|
\---- 10.0.224.0/19
因此,例如,要找到/24 的 block ,首先遍历树(以任何顺序)寻找大小恰好为/24 的 block 。如果你找到一个,你就完成了;将其标记为已分配并返回。在遍历过程中,跟踪您发现的小于/24 的最小块。。 (显然,如果您到达树中小于/24 的任何节点,则不需要进一步遍历其子树,因为大小只会从那里下降。)
如果您没有找到恰好是/24 的 block ,那么您将转到您保存的 block ,它是大小大于/24 的最小块。然后将该 block 切成两半,用两个半尺寸 block 替换它。捕获其中之一(任意)。如果它是/24 你就完成了。如果不是,则递归将该 block 一分为二,依此类推。最终,您会找到/24。
假设大于/24 的最小块是/21。通过以这种方式递归分割,您会将/21 分割成:两个/24(一个您已分配,一个仍然可用)、一个可用的/23 和一个可用的/22。
如果一个 block 被返回给你,你可以将它与它的伴随 block 组合起来,前提是该 block 可用(即一个叶子并且没有标记为已分配)。如果您可以将它与它的同伴结合起来,您也许也可以将它的 parent 与 parent 的双胞胎结合起来。
(顺便说一句,这与@mcdowella 的回答兼容;只是添加了细节。)
关于java - 使用什么算法从基本 CIDR 获取子 CIDR?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43104569/
我需要您在以下方面提供帮助。近一个月来,我一直在阅读有关任务和异步的内容。 我想尝试在一个简单的 wep api 项目中实现我新获得的知识。我有以下方法,并且它们都按预期工作: public Htt
我的可执行 jar 中有一个模板文件 (.xls)。不需要在运行时我需要为这个文件创建 100 多个副本(稍后将唯一地附加)。用于获取 jar 文件中的资源 (template.xls)。我正在使用
我在查看网站的模型代码时对原型(prototype)有疑问。我知道这对 Javascript 中的继承很有用。 在这个例子中... define([], function () { "use
影响我性能的前三项操作是: 获取滚动条 获取偏移高度 Ext.getStyle 为了解释我的应用程序中发生了什么:我有一个网格,其中有一列在每个单元格中呈现网格。当我几乎对网格的内容做任何事情时,它运
我正在使用以下函数来获取 URL 参数。 function gup(name, url) { name = name.replace(/[\[]/, '\\\[').replace(/[\]]/,
我最近一直在使用 sysctl 来做很多事情,现在我使用 HW_MACHINE_ARCH 变量。我正在使用以下代码。请注意,当我尝试获取其他变量 HW_MACHINE 时,此代码可以完美运行。我还认为
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 关闭 9 年前。 要求提供代码的问题必须表现出对所解决问题的最低限度的理解。包括尝试过的解决方案、为什么
由于使用 main-bower-files 作为使用 Gulp 的编译任务的一部分,我无法使用 node_modules 中的 webpack 来require 模块code> dir 因为我会弄乱当
关闭。这个问题需要更多focused .它目前不接受答案。 想改进这个问题吗? 更新问题,使其只关注一个问题 editing this post . 关闭 5 年前。 Improve this qu
我使用 Gridlayout 在一行中放置 4 个元素。首先,我有一个 JPanel,一切正常。对于行数变大并且我必须能够向下滚动的情况,我对其进行了一些更改。现在我的 JPanel 上添加了一个 J
由于以下原因,我想将 VolumeId 的值保存在变量中: #!/usr/bin/env python import boto3 import json import argparse import
我正在将 MSAL 版本 1.x 更新为 MSAL-browser 的 Angular 。所以我正在尝试从版本 1.x 迁移到 2.X.I 能够成功替换代码并且工作正常。但是我遇到了 acquireT
我知道有很多关于此的问题,例如 Getting daily averages with pandas和 How get monthly mean in pandas using groupby但我遇到
This is the query string that I am receiving in URL. Output url: /demo/analysis/test?startDate=Sat+
我正在尝试使用 javascript 中的以下代码访问 Geoserver 层 var gkvrtWmsSource =new ol.source.ImageWMS({ u
API 需要一个包含授权代码的 header 。这就是我到目前为止所拥有的: var fullUrl = 'https://api.ecobee.com/1/thermostat?json=\{"s
如何获取文件中的最后一个字符,如果是某个字符,则删除它而不将整个文件加载到内存中? 这就是我目前所拥有的。 using (var fileStream = new FileStream("file.t
我是这个社区的新手,想出了我的第一个问题。 我正在使用 JSP,我成功地创建了 JSP-Sites,它正在使用jsp:setParameter 和 jsp:getParameter 具有单个字符串。
在回答 StoreStore reordering happens when compiling C++ for x86 @Peter Cordes 写过 For Acquire/Release se
我有一个函数,我们将其命名为 X1,它返回变量 Y。该函数在操作 .on("focusout", X1) 中使用。如何获取变量Y?执行.on后X1的结果? 最佳答案 您可以更改 Y 的范围以使其位于函
我是一名优秀的程序员,十分优秀!