对于单个物理网络而言,连接100台以上计算机的情况是少见的。所以A类和B类地址(分别允许一个网络上有16 777 214和65 534台主机)实际上是相当愚蠢和浪费的。例如,126个A类网络占掉了多达一半的可用地址空间。
有这类地址的大多数站点都使用了一种名为子网划分的细分寻址方案,在这个方案里,可以借用地址的主机部分来扩展网络部分。例如,B类地址的4字节通常解释为N.N.H.H。如果子网划分把第3字节分配为网络号,而不是主机号,那么地址就会解释为N.N.N.H。划分子网的这种用法可以把单独一个B类网络地址转变为256个不同的类似C类的网络,每个网络都能支持254台主机。
可以用ifconfig命令把一个明确的“子网掩码”与一个网络接口联系起来,从而影响地址的重新分配。对应一个IP地址网络部分的各个网络掩码位被设置为1,而主机位则设置为0。例如,对N.N.N.H配置的网络掩码是十进制的255.255.255.0,或十六进制的0xFFFFFF00。ifconfig通常用一个地址本来的分类来计算出哪些位是属于网络部分的。在明确设置了掩码时,就可以取代这种行为。参考12.7节了解有关ifconfig命令的更多信息。
网络部分和主机部分之间的分界不必落在字节的边界处。但是网络位必须相邻,并且必须在地址的高端。
不在字节边界结束的网络掩码解读起来麻烦一些,通常把它们写成/XX的形式,XX是地址的网络部分的比特位数。这在有时叫做CIDR(Classless Inter-Domain Routing,无类域间路由)记法。例如,网络地址128.138.243.0/26是指前3字节为128.138.243的4个网络中的第1个网络。其他3个网络的第4字节分别是64、128和192。与这些网络关联的网络掩码是255.255.255.192或者0xFFFFFFC0,二进制为26个1后接6个0。图12.3更详细地说明了这些数字间的关系。
图12.3 子网掩码基变换
一个/26网络有6个比特(32-26=6)留下来给主机编号。因为26等于64,所以网络具有64个可用的主机地址。但实际上它只能容纳62台主机,因为全0和全1的主机地址是保留的(它们分别是网络地址和广播地址)。
虽然在脑子里计算这些比特很容易搞混,但通过一些技巧可以简化它。每个网络的主机数目和网络掩码的最后一个字节的数值之和始终为256:
最后一个网络掩码字节=256-网络大小
例如,256-64=192,它是前一个例子里网络掩码的最后一个字节。另一个算法是,某个实际网络地址(与网络掩码相反)的最后字节必须可以被每个网络上的主机数目整除。在当前的这个例子里就是这样的,最后一个字节分别是0、64、128和192,它们都可以被64整除。
在这个例子里,子网网络地址中另外两位可以用数值00、01、10和11。这样一来,网络128.138.243.0/24就分成了4个/26网络:
— 128.138.243.0/26 (十进制0在二进制中是00000000);
— 128.138.243.64/26 (十进制64在二进制中是01000000);
— 128.138.243.128/26 (十进制128在二进制中是10000000);
— 128.138.243.192/26 (十进制192在二进制中是11000000)。
The boldfaced bits
of the last byte of each address are the bits that belong to the network
portion of that byte.
每个地址的最后一字节中用粗体字显示的位是该字节中属于网络部分的位。
对于一个IP地址(如,128.138.243.100),在没有相关掩码的情况下我们不能给出网络地址和广播地址。表12.4显示了/16(默认为B类地址),/24(一个合理的数值),和/26(地址空间很紧缺时,一个较为实际的数值)的可能情况。
表12.4 IP地址解读
IP地址
|
子 网 掩 码
|
网 络 地 址
|
广 播 地 址
|
128.138.243.100/16
|
255.255.0.0
|
128.138.0.0
|
128.138.255.255
|
128.138.243.100/24
|
255.255.255.0
|
128.138.243.0
|
128.138.243.255
|
128.138.243.100/26
|
255.255.255.192
|
128.138.243.64
|
128.138.243.127
|
Krischan Jodies编写了一个方便的脚本,这个脚本叫做IP计算器(IP Calculator),它可以帮助进行二进制/十六进制/掩码的运算。从可以下载到它。ipcalc显示了您可能应该了解的所有关于一个网络地址及其网络掩码、广播地址、主机方面的知识。网上的版本是个tar的压缩文件,而Debian和Ubuntu默认就带一个ipcalc的命令行版本。
下面是一些IP计算器输出的例子,可以通过格式提供一点帮助:
这些输出既给出了易于理解的地址版本,又给出了“剪切和粘贴”的版本。非常酷。
|
Red Hat里有一个程序,也叫做ipcalc,它的功能很差,大多数计算都要假定IP地址是A类、B类或者C类。
|
最初定义IP子网划分的RFC(RFC950)不允许使用第一个或者最后一个子网(全为0或者全为1)。在/26网络的例子中,这个规则排除了一半子网:0子网和192子网。除了Novell和Cisco之外,所有地方都忽略这个RFC(在Cisco早期的IOS操作系统版本中,必须用ip subnet zero命令明确启用子网0。在12.0及其以后的版本中,子网0是默认可用的)。
虽然这个RFC的意图很好,但它却是错误的。不允许子网0出现是因为人们认为如果一个子网的地址与没有划分子网的网络地址相同,不能区分开,就有可能产生混淆。但是事实证明这种担心是没有根据的,现在全0/全1子网都得到了广泛应用。不能为全0或全1的应该是主机部分。
网络地址和广播地址从每个网络中占用了两个主机,所以最小的有意义的网络应该有4台主机:两个实际主机—通常在一条点对点链路的两端—以及网络地址和广播地址。为了使主机有4个值,需要在主机部分有2位,所以这样的网络应该是网络掩码为255.255.255.252或者0xFFFFFFFC的一个/30网络。不过,/31网络被当作一种特例(参考RFC3021),它没有网络或者广播地址,两个地址都供主机使用,它的网络掩码是255.255.255.254。
虽然网络上的主机可能会同意使用作了子网划分的地址,但世界上的其他地方并不知道这一点,于是仍然按照原本的IP地址类处理地址。在我们给出的128.138.243.100这个例子中,并没有向外面的世界通告每个子网,而只需通告到单个B类网络就可以了。一旦一个包到达了划分了子网的区域,它的目的地址就会用本地网络掩码重新解释,从而发现实际的目标网络,并把这个包路由至它的确切目的地。
|