假如你有一个CLASS C的IP地址,比如192.168.10.0,你想把它分成8个网段,每个网段内可以有32台主机,你可以这样分:
subnetmask是:255.255.255.224
192.168.10.0 - 31, 网络地址:192.168.10.0,广播地址:192.168.10.31
192.168.10.32 - 63, 网络地址:192.168.10.32,广播地址:192.168.10.63
192.168.10.64 - 95, 网络地址:192.168.10.64,广播地址:192.168.10.95
192.168.10.96 - 127,网络地址:192.168.10.96,广播地址:192.168.10.127
192.168.10.128 - 159,网络地址:192.168.10.128,广播地址:192.168.10.159
192.168.10.160 - 191,网络地址:192.168.10.160,广播地址:192.168.10.191
192.168.10.192 - 223,网络地址:192.168.10.192,广播地址:192.168.10.223
192.168.10.224 - 255,网络地址:192.168.10.224,广播地址:192.168.10.255
即:每个网段32个IP地址,第一个是网络地址,用来标志这个网络,最后一个是广播地址,用来代表这个网络上的所有主机。这两个IP地址被TCP/IP保留,不可分配给主机使用。
另外,第一个子网192.168.10.0 - 31和最后一个子网192.168.10.224 - 255通常也被保留,不能使用,原因是因为第一个子网的网络地址192.168.10.0和最后一个子网的广播地址192.168.10.255具有二意性。
先看看这个大C的网络地址和广播地址:
192.168.10.0是它的网络地址,192.168.10.255是它的广播地址.显然,它们分别与第一个子网的网络地址和最后一个子网的广播地址相重了。
那么怎样区分192.168.10.0到底是哪个网络的网络地址呢?
答案是:把子网掩码加上去!
192.168.10.0 255.255.255.0 是大C的网络地址,192.168.10.0 255.255.255.224 是第一个子网的网络地址,192.168.10.255 255.255.255.0是大C的广播地址,192.168.10.255 255.255.255.224是最后一个子网的广播地址。带上掩码,它们的二意性就不存在了。
所以,在严格按照TCP/IP ABCD给IP地址分类的环境下,为了避免二意性,全0和全1网段都不让使用。这种环境我们叫作Classful。在这种环境下,子网掩码只在所定义的路由器内有效,掩码信息到不了其它路由器,比如RIP-1,它在做路由广播时根本不带掩码信息,收到路由广播的路由器因为无从知道这个网络的掩码,只好照标准TCP/IP的定义赋予它一个掩码。比如,拿到10.X.X.X,就认为它是A类,掩码是255.0.0.0;拿到一个204.X.X.X,就认为它是C类,掩码是255.255.255.0。
但在Classless的环境下,掩码任何时候都和IP地址成对地出现,这样,前面谈到的二意性就不会存在,是Classful还是Classless取决于你在路由器上运行的路由协议,一个路由器上可同时运行Classful和Classless的路由协议。RIP是 Classful 的,它在做路由广播时不带掩码信息;OSPF,EIGRP,BGP4是Classless的,它们在做路由广播时带掩码信息,它们可以同时运行在同一台路由器上。
在Cisco路由器上,缺省你可以使用全1网段,但不能使用全0网段。所以,当在Cisco路由器上给端口定义IP地址时,该IP地址不能落在全0网段上。假如你配了,你会得到一条错误信息。使用IP SUBNET-ZERO命令之后,你才能使用全0网段。
要强调的是,使用了IP SUBNET-ZERO命令之后,假如路由协议使用的是Classful的(比如RIP),虽然你的定义成功了,但那个子网掩码还是不会被RIP带到它的路由更新报文中。即,IP SUBNET-ZERO 命令不会左右路由协议的工作。
总之,TCP/IP协议中,全0和全1网段因为具有二意性而不能被使用。Cisco 缺省使全1网段可以被使用,但全0网段只有在配置了IP SUBNET-ZERO后方可被使用。