- 把需要讨论的2个的网段(CIDR),称作:
A网段
,B网段
,简称:A
,B
。 - 把网段的子网掩码1的数目的,写作:
Mask[n]
,例如:A网段子网掩码1的数目为:Mask[A]
。 - 把网段的网络地址写作:
Net[n]
,例如:A网段的网络地址为:Net[A]
B网段是A网段应该满足下面条件:
- Mask[A] < Mask[B]
- 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/24
与 1.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)
}
参考文献
- net.IPNet inside other net.IPNet? . stackoverflow . JimB . 2016.11 . https://stackoverflow.com/questions/40406230/net-ipnet-inside-other-net-ipnet
- 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