根据192.168.1.53/18,计算出子网掩码,最大主机(iP)数,可用主机数,子网段,网络号,广播号:
可以看出,192.168.1.53掩了18位,换算成二进制掩码就是18个1和14个0,因为32位二进制是4位的八进制,比如32个1表示255.255.255.255,比如32个0表示0.0.0.0,那么18位掩码的二进制就是1111 1111.1111 1111.1100 0000.0000 000,换算成八进制是255.255.192.0,所以掩码是255.255.192.0。
可用主机数需要拿掩码来换算,可用的B类主机共有(256-192=64)*256=16384个,去除1个网络号,再去除1个广播号,那么可用的主机数是16384-2=16382个。问题来了网络号是啥,广播号是啥?答:网络号是最小主机号,广播号是最大主机号。问题又来了,最小主机号是多少最大主机号是多少?要解决最小最大问题我们还需要知道掩出的子网范围,子网范围的换算方法是:
=256/(256-192)
=256/64
=4个子网段
4个了网段范围分别是0~63, 64~127, 128~191, 192~255
由192.168.1.53的第三位iP地址可以看出1属于0~63的子网段,那么由此可推断出iP地址的范围是192.168.0.0到192.168.63.255,即然知道ip范围,那最小的iP是192.168.0.0,最大iP是192.168.63.255,即网络号是192.168.0.0广播号是192.168.63.255。
希望对你有用。
public static function isIPsegment($ip){
return strpos($ip, '/') === false ? false : true;
}
public static function IPSegmentConvert($ip){
$is_ip_segment = self::isIPsegment($ip);
if($is_ip_segment === false){
return false;
}
list($ip_addr, $segment) = explode('/', $ip);
if(!in_array(intval($segment), self::IP_SEGMENT)){
return false;
}
// 计算掩码
$mask = '';
$mask = str_pad($mask, $segment, '1');
$mask = str_pad($mask,32, '0');
$mask = str_split($mask, 8);
// 子网范围
$ip_arr = explode('.', $ip_addr);
if ($segment >= 24) {
$net_f = 256 - bindec($mask[3]);
$ip_s = $ip_arr[3];
$location = 3;
} else if ($segment >= 16) {
$net_f = 256 - bindec($mask[2]);
$ip_s = $ip_arr[2];
$location = 2;
} else if ($segment >= 8) {
$net_f = 256 - bindec($mask[1]);
$ip_s = $ip_arr[1];
$location = 1;
} else {
$net_f = 256 - bindec($mask[0]);
$ip_s = $ip_arr[0];
$location = 0;
}
$net_s = 256/$net_f;
$start_number = $end_number = 0;
for($i=0; $i<$net_s; $i++) {
if ($ip_s >= ($i*$net_f) && $ip_s < (($i+1)*$net_f)) {
$start_number = $i*$net_f;
$end_number = ($i+1)*$net_f-1;
break;
}
continue;
}
if ($location == 3) {
$ip_start = $ip_arr[0].'.'.$ip_arr[1].'.'.$ip_arr[2].'.'.$start_number;
$ip_end = $ip_arr[0].'.'.$ip_arr[1].'.'.$ip_arr[2].'.'.$end_number;
} else if ($location == 2) {
$ip_start = $ip_arr[0].'.'.$ip_arr[1].'.'.$start_number.'.0';
$ip_end = $ip_arr[0].'.'.$ip_arr[1].'.'.$end_number.'.255';
} else if ($location == 1) {
$ip_start = $ip_arr[0].'.'.$start_number.'.0.0';
$ip_end = $ip_arr[0].'.'.$end_number.'.255.255';
} else {
$ip_start = $start_number.'.0.0.0';
$ip_end = $end_number.'.255.255.255';
}
return [
"ip_addr"=>$ip_addr.'/'.$segment,
"start_ip"=>IP::iptolong(explode('.', $ip_start)),
"end_ip"=>IP::iptolong(explode('.', $ip_end))
];
}
public static function iptolong($ip_arr){
return (($ip_arr[0] * 256 + $ip_arr[1]) * 256 + $ip_arr[2]) * 256 + $ip_arr[3];
}