子网掩码表及计算方法
host VLSM Subnet Mask subnet
n-2 /
--------------------------------------------------------------------------
n log2 n (32 - log2 n) 256/n
--------------------------------------------------------------------------
8 3 29 255.255.255.248 32
16 4 28 255.255.255.240 16
32 5 27 255.255.255.224 8
64 6 26 255.255.255.192 4
128 7 25 255.255.255.128 2
256 8 24 255.255.255.0 1
512 9 23 255.255.254.0
1024 10 22 255.255.252.0
2048 11 21 255.255.248.0
4096 12 20 255.255.240.0
8192 13 19 255.255.224.0
16384 14 18 255.255.192.0
32768 15 17 255.255.128.0
65536 16 16 255.255.0.0
+----------------------------------------------+ | addrs bits pref class mask | +----------------------------------------------+ | 1 0 /32 255.255.255.255 | | 2 1 /31 255.255.255.254 | | 4 2 /30 255.255.255.252 | | 8 3 /29 255.255.255.248 | | 16 4 /28 255.255.255.240 | | 32 5 /27 255.255.255.224 | | 64 6 /26 255.255.255.192 | | 128 7 /25 255.255.255.128 | | 256 8 /24 1C 255.255.255.0 | | 512 9 /23 2C 255.255.254.0 | | 1K 10 /22 4C 255.255.252.0 | | 2K 11 /21 8C 255.255.248.0 | | 4K 12 /20 16C 255.255.240.0 | | 8K 13 /19 32C 255.255.224.0 | | 16K 14 /18 64C 255.255.192.0 | | 32K 15 /17 128C 255.255.128.0 | | 64K 16 /16 1B 255.255.0.0 | | 128K 17 /15 2B 255.254.0.0 | | 256K 18 /14 4B 255.252.0.0 | | 512K 19 /13 8B 255.248.0.0 | | 1M 20 /12 16B 255.240.0.0 | | 2M 21 /11 32B 255.224.0.0 | | 4M 22 /10 64B 255.192.0.0 | | 8M 23 /9 128B 255.128.0.0 | | 16M 24 /8 1A 255.0.0.0 | | 32M 25 /7 2A 254.0.0.0 | | 64M 26 /6 4A 252.0.0.0 | | 128M 27 /5 8A 248.0.0.0 | | 256M 28 /4 16A 240.0.0.0 | | 512M 29 /3 32A 224.0.0.0 | | 1024M 30 /2 64A 192.0.0.0 | | 2048M 31 /1 128A 128.0.0.0 | | 4096M 32 /0 256A 0.0.0.0 | +----------------------------------------------+
#!/usr/bin/perl
eval 'exec /usr/bin/perl -S $0 ${1+"$@"}'
if 0; # not running under some shell
use Net::IP;
use strict;
print "+----------------------------------------------+
| addrs bits pref class mask |
+----------------------------------------------+
";
my ($ip,$size,$class,$bits,$len);
my $ip = new Net::IP('0');
for my $len (reverse (0..32))
{
$ip->set("0.0.0.0/$len");
$size = $ip->size();
if ($size >=1048576) # 1024*1024
{
$size /= 1048576;
$size .= 'M';
}
elsif ($size >= 1024)
{
$size /= 1024;
$size .= 'K';
};
$len = $ip->prefixlen();
$bits = 32 - $len;
if ($bits >= 24)
{
$class = 2**($bits-24);
$class.= 'A';
}
elsif ($bits >= 16)
{
$class = 2**($bits-16);
$class.= 'B';
}
elsif ($bits >= 8)
{
$class = 2**($bits-8);
$class.= 'C';
}
printf ("| %5s %6s %6s %7s %-15s |\n",
$size,$bits,'/'.$len,$class,$ip->mask());
};
print "+----------------------------------------------+\n";