《TCP/IP路由技术(第一卷)(第二版)》一1.3 IPv4 地 址

原文链接:https://yq.aliyun.com/articles/100340

本节书摘来自异步社区《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]


0f9098c2cd60ee8bdf5c7d701d679857a734a17e

在使用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地址的网络号和主机号是怎样划分的。


13521349300e890aab1ae6e13bcf7146c6284998

迄今为止,对于所描述的大型、中型和小型网络,是按照如下方式映射到各类地址的:

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类地址。


86c2b7b410f672024827fe0540bc2d0249c8120c

  * 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地址的标准地址掩码。


759a414c84a08f4d5b4eed505184455a3575b279

对于每一位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操作总能够得到网络地址。


866d255dd5d144de4b5415342d6e8da5a14b735b

通过下面命令可以向Cisco路由器的接口分配地址和掩码(本例中接口为E0):

Smokey(config)# interface ethernet 0
Smokey(config-if)# ip address 172.21.35.17 255.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所示。


9ffb64a634722264f271dcf113d948d73e839eda

下面给出两点告诫。首先,并不是所有路由选择协议都支持子网地址,即子网位全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之外,其他完全相同。


c0707f71cb241d20b4c67bfad9a05dc79fdbb1f1

在这个网络中共有5条数据链路,因此至少需要划分出5个子网地址。图中还指明了每个子网需要分配的主机数(包括路由器接口)。其中两个以太网最多需要25个主机地址。所以完整的子网划分最小需求是5个子网,每个子网至少需要25个主机地址。

使用公式2n−2可以计算出,3个子网位和5个主机位即可以满足需求:23−2=6,25−2=30。带有3位子网位的C类地址掩码可以用点分十进制表示为255.255.255.224。

图1-9给出了子网位的推导过程。用二进制表示第2步计算出的子网掩码,子网掩码下面是IP地址。垂直线标记了子网空间,从二进制0开始计数,在这一空间中的所有位组合均被写出。


6e179825d807a6fd8480e9e197bdfe5d1553334e

图1-9 从标记的子网空间中可以得到子网位,接着从二进制0开始计数,给出子网空间中所有可能的位组合

在图2-10中,不发生变化的网络位填写在子网空间的左边,全部为0的主机位填写在子网位的右边。结果被转换为点分十进制表示后,得到6个子网地址(记住,第一个和最后一个地址,即在子网空间中全部位为0和全部位为1的地址不能使用)。


22298977ef80740e0433fa52235a700182e84fab

最后一步是计算每个子网内的可用主机地址。这一步通过以下方式完成:首先选择一个子网地址,保持其中的网络位和子网位不变,从二进制0开始计数,写出主机空间中所有的位组合。图1-11给出了针对子网192.168.100.32的计算过程。

注意结果的模式:第一个地址所有主机位全部为0,这是子网地址。最后一个地址主机位全部为1,这是子网192.168.100.32的广播地址。主机地址从子网地址起到广播地址为止。按照顺序,下一个子网地址是192.168.100.64。

现在,在二进制层次上理解子网划分的重要性就显而易见了。给出一个地址,如192.168.100.160,你不能确定它是否是一个主机地址、子网地址或广播地址。甚至在子网掩码已知情况下,结论也并不总是明显的。

这里我们鼓励读者计算例子中所有余下子网的主机地址,并且仔细观察产生地址的模式,理解这些模式对下一部分的内容会有帮助。


41fdb33d9d9d79da235781eac60f1030420371de

1.3.6 子网掩码的故障诊断

在“解剖”一个给定的主机地址和掩码时,常常需要确定地址属于哪个子网。例如,如果在一个接口上配置了地址,一个很好的实践就是首先验证对于接口连接的子网来说该地址是否合法。

使用下面的步骤逆推一个IP地址:

步骤1:用二进制写下一个给定的子网掩码。

步骤2:用二进制写下一个主机IPv4地址。

步骤3:在知道一个地址的类别后,掩码的子网位便是显然的了。根据掩码位,在最后网络位和第1个子网位之间画一条线,在最后子网位和第1台主机之间也画另一条线。

步骤4:写下地址的网络位和子网位,设置所有的主机位为0。最终的结果就是主机地址所属的子网地址。

步骤5:再次写下地址的网络位和子网位,这次设置所有主机位为1。结果就是本子网的广播地址。

步骤6:按照顺序可以知道第一个地址是子网地址,最后一个地址是广播地址。而且还可以知道在这两个地址之间的所有地址都是合法的主机地址。

对于地址172.30.141/25,图1-12给出了以上步骤的示例。

这个地址是B类地址,所以前16位是网络位,25位掩码中的后9位是子网位。可以发现子网地址是172.30.0.128,广播地址是172.30.0.255。在这两个地址之间的主机地址对于这个子网来说都是合法的,如对子网172.30.0.128来说,172.30.0.129~172.30.0.254都是主机地址。


8c38a0a8e2e0f8fb333feb34266b7b53230bdb6e

在这个例子中,初次进行子网划分的人可能会受到以下几种情况的干扰。一种是地址的第3个八位组所有位都为0。另一种是最后一个八位组仅一个子网位。一些人可能会认为广播地址看上去不合法。所有这些不舒服的感觉都源自地址的点分十进制表示法。当使用二进制表示地址和掩码时,这些疑虑会被打消,任何事看上去都一切正常,掩码设定了9位子网空间——包括第3个八位组和第4个八位组的第1位。这个案例说明了如果使用二进制表示法时一切正常,那么就不必担心看上去有些奇怪的点分十进制表示法。

展开阅读全文
博主设置当前文章不允许评论。

没有更多推荐了,返回首页