网段表示法转换为ip列表

106.52.1.0/26 这个表示法代表的是什么意思呢?

IP 地址:网络和主机

IP 地址是一个 32 位的数字。 它以唯一的数字标识出 TCP/IP 网络上的主机(计算机或其他设备,如打印机或路由器)。
IP 地址有两个部分。 IP 地址的第一部分用作网络地址,后一部分则用作主机地址。 以 192.168.123.132 为例,将其划分为这两部分,则会得到 192.168.123.0(网络地址)和 0.0.0.132(主机地址)

CIDR:无类域间路由

由于早期的IP地址的划分会浪费太多的IP地址(5种类型,A类地址、B类地址、C类地址、D类地址和E类地址),所以,现在都是用CIDR表示法,为此引入了子网掩码的概念,即网络位的个数可以任意指定。该方法兼容早期的IP划分方法。
CIDR表示方法:IP地址/网络ID的位数(网段的划分更加灵活)

子网掩码

在 TCP/IP 中,IP 地址中用作网络和主机地址的部分并不固定。 除非获取额外的信息,否则无法确定上述的网络和主机地址。 此信息以另一个 32 位数字(称为子网掩码)提供。 在这个例子中,子网掩码为 255.255.255.0。 这个数字的含义并不明显,除非你知道 255 在二进制计数法中等于 11111111。 因此,子网掩码为 11111111.11111111.11111111.00000000。

将 IP 地址和子网掩码排在一起,即可分开地址中的网络和主机部分:

11000000.10101000.01111011.10000100 - IP 地址 (192.168.123.132)
11111111.11111111.11111111.00000000 - 子网掩码 (255.255.255.0)

前 24 位(子网掩码中的 1)被标识为网络地址。 最后 8 位(子网掩码中剩余的零)被标识为主机地址。 它为你提供以下地址:

11000000.10101000.01111011.00000000 - 网络地址 (192.168.123.0)
00000000.00000000.00000000.10000100 - 主机地址 (000.000.000.132)

106.52.1.0/26

这个表示是网络地址位数有26位,其包含的ip列表有
最小IP:主机ID不能全为0,全为0表示网络ID
最大IP:主机ID不能全为1,全为1表示本地广播

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
// processSegment 处理网段表示的 ip
protected function processSegment($segment)
{
$info = $this->getIpInfo($segment);
for ($i = $info['long']['begin']; $i <= $info['long']['end']; $i++) {
$ip = long2ip($i);
echo {$ip};
}
}

public function getIpInfo($ipStr)
{
$ipArr = explode('/', $ipStr);
$info['ipStr'] = $ipStr;
$info['bin']['mask'] = $this->getSubnetMask($ipArr[1]); // 获取掩码的二进制字符串
$info['ip']['mask'] = $this->bin2ip($info['bin']['mask']);
$info['long']['mask'] = ip2long($info['ip']['mask']);
$info['bin']['net_and'] = $this->ip2bin($ipArr[0]) & $info['bin']['mask']; // 求与
$info['ip']['net_and'] = $this->bin2ip($info['bin']['net_and']); //
$info['bin']['broadcast_address'] = $info['bin']['net_and'] | $this->getSubnetMaskFan($ipArr[1]); // 求或,获取广播地址
$info['ip']['broadcast_address'] = $this->bin2ip($info['bin']['broadcast_address']);
$info['ip']['begin'] = long2ip(ip2long($this->bin2ip($info['bin']['net_and'])) + 1); // 全为0的不能用
$info['bin']['begin'] = $this->ip2bin($info['ip']['begin']);
$info['long']['begin'] = ip2long($info['ip']['begin']);
$info['ip']['end'] = long2ip(ip2long($info['ip']['broadcast_address']) - 1); // 全为1的不能用
$info['bin']['end'] = $this->ip2bin($info['ip']['end']);
$info['long']['end'] = ip2long($info['ip']['end']);
return $info;
}

//获取二进制
private function get_bin($number)
{
return str_pad(decbin($number), 8, '0', STR_PAD_LEFT);
}

//IP地址转二进制
private function ip2bin($ip)
{
$ip_octets = explode(".", $ip);
unset($bin_sn);
foreach ($ip_octets as $val) {
$bin_sn[] = $this->get_bin($val);
}
return join(".", $bin_sn);
}

//二进制转IP地址
private function bin2ip($ip)
{
$ip_octets = explode(".", $ip);
unset($bin_sn);
foreach ($ip_octets as $val) {
$bin_sn[] = bindec($val);
}
return join(".", $bin_sn);
}

//获取子网掩码
private function getSubnetMask($mask)
{
$maskStr = "";
for ($i = 1; $i <= 32; $i++) {
if ($i <= $mask) {
$maskStr .= '1';
} else {
$maskStr .= '0';
}
if ($i % 8 == 0) {
$maskStr .= '.';
}
}
return substr($maskStr, 0, -1);
}

private function getSubnetMaskFan($mask)
{
$maskStr = "";
for ($i = 1; $i <= 32; $i++) {
if ($i <= $mask) {
$maskStr .= '0';
} else {
$maskStr .= '1';
}
if ($i % 8 == 0) {
$maskStr .= '.';
}
}
return substr($maskStr, 0, -1);
}