[转]《TCPIP路由技术(第⼀卷)(第⼆版)》⼀1.3 IPv4地址
本节书摘来⾃异步社区《TCP/IP路由技术(第⼀卷)(第⼆版)》⼀书中的第1章,第1.3节,作者【美】Jeff Doyle,CCIE #1919 1.3 IPv4 地址
IPv4地址长度为32位。像所有其他⽹络层地址⼀样,IPv4地址也包括⽹络号和主机号两部分。⽹络号部分惟⼀地标识了⼀条物理链路或逻辑链路,对于与该链路相连的所有设备来说⽹络号部分是共同的。⽽主机号部分惟⼀地标识了该链路上连接的具体设备。
有⼏种⽅式可以表⽰IP地址的32位。举例来说,32位的IP地址 00001010110101100101011110000011可以⽤⼗进制表⽰为181 819 267。
由此可见⽤⼆进制表⽰IP地址⼗分⿇烦,⽽全部32位数字⽤⼗进制格式表⽰计算起来⼜很耗时。图1-4给出了⼀种更好的表⽰⽅法。
32位的地址包含4个字节,每个字节均可以⽤0~255之间的⼗进制数表⽰,⽽每个⼗进制数之间⽤点号分隔。在图1-4中,将32位的地址映射到⽤点分⼗进制法表⽰的地址上。[8]
在使⽤IPv4地址时需要记住⼀点,点分⼗进制表⽰法便于⼈们阅读和书写,⽽路由器更适合使⽤32位的⼆进制串,⽽不是按照4个⼋位组的⽅式读取地址。牢记这⼀点可以避免许多易犯的错误。如果读者没有接触过⼆进制数,特别是⼆进制与⼗进制之间的转换⽅法,那么建议读者在继续学习这⼀章的内容之前可以阅读⼀下附录A的内容。
IP地址与众不同的特性可能就是,IPv4地址不像其他⽹络层地址的⽹络号和主机号是固定不变的,IP地址的⽹络号和主机号可以在32位的界线内发⽣变化。也就是说,IP地址的⽹络号和主机号都有可能占据32位中的⼤多数位,也可能两者平分32位。例如NetWare和AppleTalk协议,由于它们主要⽤于相对较⼩的⽹络,所以协议的⽹络层地址的⽹络号和主机号长度是固定。这样的安排的确使得⼯作更加容易,接收设备可以从地址中读⼊固定的位来获取⽹络号,剩下的位便是主机号。
然⽽,TCP/IP从最初设计出来到现在可以灵活地应⽤于任何⽹络,从很简单的⼏个功能发展成为⼀个庞⼤的协议簇。TCP/IP这种适应性使得IP地址的管理更加困难。本节仅介绍了IP地址管理的⼀些基本内容,在第6章中将会介绍⼀些更⾼级的技术。
1.3.1 ⾸个⼋位组字节规则
如果不对⽹络作太过精确的划分,那么⽹络可以按照主机数量分为3类:⼤型⽹络、中型⽹络和⼩型⽹络。
⼤型⽹络——可以定义为包含⼤量主机的⽹络。⼤型⽹络的数量相对很少。
⼩型⽹络——作为⼤型⽹络的对照,它仅仅包含很少数量的主机,但⼩型⽹络的数⽬很多。
中型⽹络——相对于⼤型和⼩型⽹络来说,包含的主机数量中等,⽽且中型⽹络的数量也中等。
对于这3种规模的⽹络,⾼层的地址划分要求有3种类型的⽹络地址。⾯向⼤型⽹络的地址需要有能⼒为⼤量的主机编址,但是由于⼤型⽹络的数量有限,所以⼤型⽹络仅需要少量的⽹络地址。
⽽对⼩型⽹络来说情况⼜颠倒过来了,因为⼩型⽹络数量庞⼤,所以需要⼤量的⼩型⽹络的⽹络地址。但是⼩型⽹络主机有限,所以仅需要少量主机地址。
对于中等规模的⽹络来说,⽹络地址和主机地址的需求量均趋于中等⽔平。
图1-5显⽰了3类IPv4地址的⽹络号和主机号是怎样划分的。
迄今为⽌,对于所描述的⼤型、中型和⼩型⽹络,是按照如下⽅式映射到各类地址的:
A类地址——⽤于⼤型⽹络,第1个⼋位组是⽹络号,后3个⼋位组是主机号。8位的⽹络号最多可以表⽰256个⽹络,⽽每个⽹络地址的主机号可以提供的主机数量为224或16 777 216。
B类地址——⽤于中型⽹络。前2个⼋位组表⽰⽹络号,后2个⼋位组表⽰主机号。⽹络号和主机号的数量均为216或65 536个。
C类地址——对应于A类IP地址。前3个⼋位组表⽰⽹络号,最后1个⼋位组表⽰主机号。
因为所有的IPv4地址都是32位⼆进制字符串,所以需要某种⽅法来区分⼀个特定地址到底是属于哪⼀类地址。表1-3所⽰的⾸个⼋位组规则提供了这种⽅法,如下所述:
对于A类地址,⾸个⼋位组的第1位,即32位字符串最左边的1位,总是被设置为0。因此,通过设置⾸个⼋位组的剩余位为0(最⼩)或为1(最⼤),我们可以到A类地址范围中的最⼩数和最⼤数。于是我们可以得到最⼩数和最⼤数分别为0和127,但是这⾥有⼏个例外:0被保留作为缺省地址部分(参见第12章),127被保留为内部回送地址。[9] 剩下的⼗进制数则是1~126。因此任何⾸个⼋位组落在1和126之间的IP地址均属于A类地址。
  * 0和127保留。
B类地址总是把左边的第1位设置为1,第2位设置为0。那么再次通过设置⾸个⼋位组的剩余位为0或为1,我们依然可以到最⼩数和最⼤数。在图1-4中,我们可以看到⾸个⼋位组落在128和191之间的IP地址属于B类地址。
在C类地址中,前2位均被设置为1,第3位被设置为0。这样设置的结果是⾸个⼋位组在192和223之间。[10]
到⽬前为⽌,IPv4的编址看上去并不是⼗分困难。路由器和主机通过⾸个⼋位组字节规则能够很容易地确定IP地址的⽹络号。如果第1位是0,需要读取前8位才能获取⽹络地址;如果前两位是10,那么需要读取16位;如果前3位是110,则需求读取24位才能获取⽹络号。不幸的是,事情并不会这样简单。
1.3.2 地址掩码(Address Mask)
表⽰整个数据链路的地址——⾮特指某台主机的⽹络地址,可以⽤IP地址的⽹络部分来表⽰,其中主机位全部为0。例如,IP地址管理机构[11]可以将172.21.0.0[12]分配给⼀个申请者。因为172在128和191之间,所以这是⼀个B类地址,其中后两个⼋位组作为主机位,全部被设置为0。虽然前16位(172.21.)已经被指定,但是地址所有者有权决定后16位主机位的使⽤。
每⼀台设备和接⼝都将被分配⼀个惟⼀的、主机号明确的地址,例如172.21.35.17。不管设备是路由器还是主机,显然都需要知道⾃⾝的地址,⽽且它还需要能够确定它所属的⽹络,在这个案例中,它属于172.21.0.0。
这⼀任务通常由地址掩码来完成。地址掩码是⼀个32位的字符串,与IPv4地址的每⼀位相对应。掩码也可以像IPv4地址⼀样⽤点分⼗进制表⽰。这种表⽰⽅法会成为某些初学者的绊脚⽯。虽然地址掩码可以⽤点分⼗进制书写,但是它并不是⼀个地址。表1-4给出了对应于3类IPv4地址的标准地址掩码。
对于每⼀位IPv4地址位,设备会拿它与地址掩码的对应位进⾏布尔(逻辑)AND操作。AND函数表述如下:
⽐较两位并得出结果。当且仅当两位全部为1时,结果为1。如果两位中任意⼀位为0,则结果为0。
对于⼀个指定的IPv4地址,图1-6给出了怎样⽤地址掩码确定⽹络地址。地址掩码值为1 的位对应于地址的⽹络位,值为0的位对应于主机位。因为172.21.35.17是B类地址,所以掩码前两个⼋位组必须全部设置为1,后两个⼋位组,即主机号的所有位必须设置为0。参见表1-4,这个掩码的点分⼗进制表⽰为255.255.0.0。
在IPv4地址和地址掩码的每⼀位上执⾏逻辑“与”(AND)操作,结果如图1-6所⽰。在结果中,⽹络位不变,所有主机位则变为0。通过向接⼝分配地址172.21.35.17和掩码255.255.0.0,设备将会知道接⼝属于⽹络172.21.0.0。对IPv4地址和掩码应⽤AND操作总能够得到⽹络地址。tcpip协议pdf
通过下⾯命令可以向Cisco路由器的接⼝分配地址和掩码(本例中接⼝为E0):
Smokey(config)# interface ethernet 0
Smokey(config-if)# ip address 172.21.35.17255.255.0.0
但是为什么要使⽤地址掩码?到⽬前为⽌,使⽤⾸个⼋位组字节规则看上去更简单⼀些。
1.3.3 ⼦⽹和⼦⽹掩码
⾸先,决不要忽略⽹络层地址的必要性。为了完成路由选择,每个数据链路(⽹络)都必须有⼀个惟⼀的地址;另外,数据链路上的每台主机也必须有⼀个地址,这个地址不仅标识主机为⼀个⽹络成员,还可以把主机与⽹络上的其他主机区分开来。
到⽬前为⽌的定义中,⼀个A类、B类或C类地址仅仅能⽤在⼀个单⼀⽹络中;为了建⽴⼀个⽹络,每个数据链路都必须使⽤不同的地址,以便这些⽹络可以被惟⼀地标识。如果每⼀个数据链路都使⽤⼀个单独的A类、B类或C类地址,那么即使⽤尽所有的IPv4地址,也只能给少于1700万个数据链路分配地址。显然,这种⽅法是不切实际的,[13] 在前⾯的例⼦中,如果充分地使⽤主机地址空间,那么在数据链路172.21.0.0中的设备数⽬可以超过65 000!
使A类、B类或C类地址实⽤化的惟⼀⽅法是对主⽹地址进⾏划分,例如将172.21.0.0划分为⼦⽹地址。请回忆两个事实:
IPv4地址的主机部分可以随意使⽤。
IPv4地址的⽹络号由分配给接⼝的地址掩码确定。
如图1-7所⽰,分配给⽹络的地址为B类地址172.21.0.0。5个数据链路将主机和路由器互连起来,每个数据链路都需要⼀个⽹络地址。按照⽬前的情况,172.21.0.0必须分配给其中的⼀个数据链路,那么另外4个数据链路还需要4个地址。
注意图1-7所⽰,地址掩码并不是标准的16位B类地址掩码;⽽是被扩展了8位,以便IP地址的前24位都被解释为⽹络位。换句话说,掩码使路由器和主机把读取的前8位主机位作为⽹络地址的⼀部分。结果是,主⽹络地址应⽤于整个⽹络,⽽每⼀个数据链路则变为⼀个⼦⽹(subnet);⼀个⼦⽹是⼀个主A类、B类或C类地址空间的⼀个⼦集。
现在,IPv4地址包括3个部分:⽹络部分、⼦⽹部分和主机部分。地址掩码现在变为⼦⽹掩码,或⽐标准地址掩码长的掩码。地址的前两个⼋位组依然是172.21,但是第3个⼋位组——主机位已经由⼦⽹位代替——的变化范围为0~255。在图1-6中的⽹络有⼦⽹1、2、3、4和5(172.21.1.0~172.21.5.0)。在单⼀B类地址下最多可以有256个⼦⽹,对应的掩码如图1-7所⽰。
下⾯给出两点告诫。⾸先,并不是所有路由选择协议都⽀持⼦⽹地址,即⼦⽹位全0或全1。因为这些协议是有类别化协议,它们不能区分⼀个全0⼦⽹和主⽹络号。例如,在图1-7中⼦⽹0为172.21.0.0;⽽主⽹IP地址也为172.21.0.0。没有更多信息将⽆法区分⼆者。
同样的,有类别路由选择协议也不能区分全1⼦⽹的⼴播地址和⼀个所有⼦⽹的⼴播地址。[14]例如,图1-7中的全1⼦⽹为
172.21.255.0。对于这个⼦⽹,⼴播地址是172.21.255.255,但是这也是在主⽹172.21.0.0的所有⼦⽹上所有主机的⼴播地址。没有更多的信息也⽆法区分⼆者。第1版RIP协议和IGRP协议都是有类别路由选择协议;第7章将会介绍⽆类别路由选择协议,这种路由选择协议才可以真正地使⽤全0或全1⼦⽹。
其次是与⼦⽹及其掩码的⼝头表述有关。在图1-7中,对B类地址的第3个⼋位组进⾏⼦⽹划分是⾮常普遍的,但还常常听到⼈们这样表述⼦⽹设计:“B类地址使⽤C类地址掩码”,或者“将B类地址划分为C类地址”。这两种表述都是错误的。它们常常会对⼦⽹设计引起误解或者是不准确的理解。对于图1-6中所⽰的⼦⽹划分图解的正确表述应该是“⼀个使⽤8位进⾏⼦⽹划分的B类地址”或者“⼀个带有24位掩码的B类地址”。
可以⽤以下3种格式中的任何⼀种表⽰⼦⽹掩码:
点分⼗进制:255.255.255.0
位计数:172.21.0.0/24
⼗六进制:0xFFFFFF00
虽然位计数格式变得渐渐流⾏起来,但是点分⼗进制暂时⼀段时期仍旧经常使⽤在⼀些软件⾥⾯。与点分⼗进制相⽐,位计数格式更容易书写(地址后⾯是/,/后⾯紧跟着是⽹络部分的位计数)。另外,
位计数格式可以更清楚地描述掩码的实际作⽤,因⽽可以避免前⾯段落出现的语义误解问题。某些UNIX系统使⽤⼗六进制格式。
虽然在Cisco路由器中必须使⽤点分⼗进制⽅式表⽰地址掩码,但是在⾏配置模式下使⽤命令ip netmask-
format[decimal|hexadecimal|bit-count],可以设置使⽤3种格式中的任何⼀种格式显⽰掩码。例如,为使路由器以位计数格式显⽰掩码,配置如下:
Gladys(config) # line vty 0 4 
Gladys(config-line)# ip netmask-format bit-count
1.3.4 ⼦⽹规划
如前⾯部分所述,在有类别地址环境中,⼦⽹位不能全部为0或全部为1。同样的,⼀个主机的IPv4地址也不能将主机位全部设置为0,这种⽤法是为路由器保留的,⽤于表⽰⽹络和⼦⽹⾃⾝。当然IPv4地址的主机位也不能全部被设置为1,因为它⽤于表⽰⼴播地址。所有这些限制⽆⼀例外地适⽤于IP地址的主机位,并且这也是⼦⽹规划的起点。除了这些限制,⽹络设计⼈员还需要根据地址空间与⽹络详细的匹配程度来选择最合理的⼦⽹划分⽅案。
在规划⼦⽹和⼦⽹掩码时,可以使⽤相同的公式计算⼀个主⽹地址下可⽤的⼦⽹数以及每个⼦⽹内可⽤的主机数,公式为:2n−2,其中n 表⽰⼦⽹位数或主机空间,2表⽰减去全0和全1两个不可⽤地址。例如,给定⼀个A类地址10.0.0.0,⼦⽹掩码
10.0.0.0/16(255.255.0.0)意味着有8位⼦⽹空间,也就是可以产⽣28−2 =254个⼦⽹,每个⼦⽹可以有216−2=65 534个主机地址。 另⼀⽅⾯,掩码10.0.0.0/24(255.255.255.0)表⽰有16位⼦⽹空间,可以产⽣65 534个⼦⽹,其中8位主机空间可以在某个⼦⽹中产⽣254个主机地址。
下⾯是IPv4地址⼦⽹划分的步骤:
步骤1:确定需要多少个⼦⽹,每个⼦⽹需要多少台主机。
步骤2:为了满⾜第1步提出的需求,使⽤公式2n−2确定⼦⽹位数和主机位数。如果存在多个⼦⽹掩码可以满⾜第1步需求,那么选择最能够符合未来需求的⼀个。例如,如果⽹络最有可能通过增加⼦⽹发展起来,那么选择⼦⽹位最多的掩码;如果⽹络最有可能借助增加现有⼦⽹内的主机数发展起来,则选择主机位最多的掩码。为了避免所选择的⽅案中的⼦⽹及⼦⽹内的主机地址被迅速地⽤完,需要为将来的发展预留⼀些空间。
步骤3:使⽤⼆进制进⾏计算,在⼦⽹空间中确定所有的位组合⽅式。在每种组合⽅式中,将所有主机位都设置为0,将得到的⼦⽹地址转换为点分⼗进制格式。最终结果就是⼦⽹地址。
步骤4:对于每⼀个⼦⽹地址,再次使⽤⼆进制,在保持⼦⽹位不变的情况下写出所有主机位组合,并将结果转换成点分⼗进制格式。最终结果就是每个⼦⽹的可⽤主机地址。
这⾥没有过分强调在最后两步中使⽤⼆进制的重要性。当进⾏⼦⽹划分时,最主要的惟⼀错误根源就是,在没有理解在⼆进制上会发⽣什么的情况下试图使⽤点分⼗进制⽅法。此外,点分⼗进制表⽰法对于⼈们读写IPv4地址⼗分⽅便。但是路由器和主机却把地址看作32位⼆进制字符串;为了顺利地完成地址操作,必须采⽤路由器和主机处理地址的⽅式。
就⽬前给出的例⼦⽽⾔,作者在前⾯的段落中似乎有点多虑了。在没有限定必须使⽤⼆进制⽅式表⽰地址和掩码的时候,⼦⽹模式和主机地址看上去还是⼗分清楚的。下⾯⼩节将讨论使⽤4个步骤完成⼦⽹规划,在那⾥点分⼗进制表⽰法将⼗分不明确。
1.3.5 打破⼋位组界线
到⽬前为⽌,在给出的例⼦中,⼦⽹空间都是以⼋位组为界线的。但这并不总是最实⽤或最有效的选择。例如,如果你需要对⼀个B类地址进⾏⼦⽹划分,并满⾜以下需求:数据链路数为500,每个数据链路内主机数不超过100台,应该怎么办?这样的需求很容易得以满⾜,只要使⽤9位⼦⽹位,就可以得到29−2=510个⼦⽹,剩下7位做主机位,每个⼦⽹的可⽤主机数为27−2=126。除此不再有其他位组合可以满⾜上⾯的需求。
请注意,如果还是以⼋位组为界线的话,那么将⽆法对C类地址进⾏⼦⽹划分。如果要这样做就会占⽤最后1个⼋位组,那么就没有更多主机位了。因此,如下⾯的例⼦所⽰,⼦⽹位和主机位必须共享最后1个⼋位组。
图1-8与图1-7中显⽰的⽹络除了分配的地址是C类地址192.168.100.0之外,其他完全相同。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。