如何判断两个网段是否存在覆盖

10 篇文章 0 订阅
  • 把需要讨论的2个的网段(CIDR),称作: A网段B网段,简称:AB
  • 把网段的子网掩码1的数目的,写作:Mask[n],例如:A网段子网掩码1的数目为:Mask[A]
  • 把网段的网络地址写作:Net[n],例如:A网段的网络地址为:Net[A]

B网段是A网段应该满足下面条件:

  1. Mask[A] < Mask[B]
  2. Net[B] 属于 A网段

例如:

  • 1.0.0.0/24
  • 1.0.1.0/24
  • 1.0.0.0/16
  • 1.0.0.1/32

1.0.0.0/241.0.0.0/16 举例

1.0.0.0/24 子网掩码1数量为:30
1.0.0.0/16 子网掩码1数量为:16

16 < 30

1.0.0.0/30 网络地址为:10.0.0.0,该地址属于1.0.0.0/16网段。

因此我们说 1.0.0.0/16 包含了 1.0.0.0/24

列表中的包含关系如下:

1.0.0.0/24 ∈ 1.0.0.0/16

1.0.1.0/24 ∈ 1.0.0.0/16

1.0.0.1/32 ∈ 1.0.0.0/16

1.0.0.1/32 ∈ 1.0.0.0/24

Go 语言实现

// ContainsCIDR 子网a 是否包含 子网b
// b 是 a 的子集
// return true - b是a的子网; false b 不是 a 的子网
func ContainsCIDR(a, b *net.IPNet) bool {
	ones1, _ := a.Mask.Size()
	ones2, _ := b.Mask.Size()
	return ones1 <= ones2 && a.Contains(b.IP)
}

参考文献

  1. net.IPNet inside other net.IPNet? . stackoverflow . JimB . 2016.11 . https://stackoverflow.com/questions/40406230/net-ipnet-inside-other-net-ipnet
  2. How to detect if two Golang net.IPNet objects intersect? . stackoverflow . dahc . 2016.01 . https://stackoverflow.com/questions/34729158/how-to-detect-if-two-golang-net-ipnet-objects-intersect
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值