之一:理解IPv4地址的含义
网络没有地址就不能工作:只要你发送某种东西,你就需要具体说明这个东西要发到哪里和从哪里发出来的。要做一个高效率的网络工程师或者管理员,你需要全面理解IP地址:你需要能够依靠自己思考。如果发生了某些问题,很可能是某些地址分配不正确。迅速查明故障所在位置对于英雄和普通人来说是有很大区别的。普通人需要很长时间才能修复这个问题。在下一篇文章介 绍子网之前,我想以最原始的格式全面介绍一下IP地址。这对于理解子网是非常重要的。
IPv4地址和32位数字
IP地址只是32位二进制数字。但是,它们是重要的二进制数字:你需要知道如何处理这些数字。当处理子网掩码的时候,新的网络管理员一般会混淆他们没有记住的子网掩码。所有这些子网掩码的总和是移动代表一个“网络”的地址部分与代表一台“主机”的部分之间的界限。一旦你适应了这种关于IP地址和子网掩码的思维方式,你就掌握了IP地址的方法。
二进制非常简单。在二进制中,数码只有0和1。一个32位数码有32个0和1。我们都适应十进制数码。在十进制中,数码中的每一个位置都可以是0至9之间的任何一个数字。在二进制中,每一个位置或者是一个0,或者是一个1。下面是以二进制表示的255.255.255.0的地址。
11111111.11111111.11111111.00000000
为了方便,网络工程师一般把IP地址分为4个8位字段,或者称作8位字节。在8位数字中,如果所有的字节都设置为1,那么,这个数码等于255。在上面的地址中,11111111代表255,00000000代表0。
二进制发挥作用的方法是以二次方为基础的。每一个字节代表一个不同的二次方。从左手端开始,最有意义的数位,数字以下列方式组成:
2的次方 232 ... 27 26 25 24 23 22 21 20
小数 4,294,967,296 ... 128 64 32 16 8 4 2 1
这个结果是加法。这就是说,如果所有的字节不变,你可以为每一个位置简单地加2的次方值。例如,如果我们有一个8位数11111111,我们可以简单地加:27 + 2 6 +
2 5 + 2 4 + 2 3 + 2 2 + 2 1 + 2 0 = 255
现在我们设法理解一个不平凡的例子:11110000
我们可以看到,在上述8位数中,有4位数是“固定的”。把这些位置上的2的次方的值加起来,结果是:27 + 26 + 2 5 + 2 4 = 240
就是这样简单。如果你能把二进制数字转换为小数形式,你就很容易猜出子网掩码和网络地址。我们将在下一篇文章中介绍这个问题。
现在,把重点集中在32位IPv4地址本身,有一些不同的类型需要了解。所有的IP地址都可以在0.0.0.0至255.255.255.255的数字范围内。但是,有些地址有特殊用途。
环回地址(loopback):
不离开主机的数据包(也就是说,这些数据包不会通过外部网络接口)
单播地址:
指定向一个IP地址发送的数据包。例如:2.2.2.2
多播地址:
被路由器复制并且最终由组播路由机制转发的数据包。例如:226.0.0.2
有限广播:
一个广播数据包,发送给每一台主机,仅限于本地子网。例如:255.255.255.255
定向广播:
发送到一个具体子网的数据包,然后进行广播。例如,假如我们不在这个子网,使用的地址是:1.1.1.255
还有一些IP地址的特殊情况,包括专用和组播地址。在224.0.0.0至239.255.255.255之间的地址范围是为组播保留的。在互联网上,任何低于这个范围的地址都可能成为被攻击的目标,除非为RFC 1918保留的地址和为一些其它特殊用途分配的地址。这些1918地址是专用地址,这就意味着互联网路由器不会发送这些地址。这个地址范围包括:
• 10.0.0.0 -10.255.255.255
• 172.16.0.0 - 172.31.255.255
• 192.168.0.0 - 192.168.255.255
这些IP地址能够分配给本地的许多计算机,你愿意分配给多少台计算机都可以。但是,在这些计算机访问互联网之前,这些地址必须翻译成能够全球路由的地址。这个工作通常由网络地址转换(NAT)完成。1918地址并不是惟一保留的地址空间。但是,这些地址的定义为“本地站点”。组播也有一个保留的地址范围。这个地址范围并不是连接到互联网的:224.0.0.0 至224.0.0.255是组播“本地连接”的地址。
为了提供这个讲座的下一篇文章的必要的背景知识,我们需要确认大家都理解一个本地子网的概念。一旦我们分配给一台计算机一个合法的地址,假如子网掩码设置正确,这台计算机就可以同本地网络对话。子网掩码告诉这个操作系统哪一个IP地址在本地子网上,哪一个IP地址不在本地子网上。我们希望与之对话的IP地址位于本地子网,那么,这个操作系统不用使用路由器就能够直接与它对话。换句话说,操作系统能够使用ARP协议获得目标系统的物理地址并且开始对话。IP地址和子网掩码的设置对于普通的24位网络来说是非常简单的。标准的255.255.255.0子网掩码的意思是前三个八位字节是网络地址,最后的部分是为主机保留的。例如,一台计算机被分配了10.0.0.1的IP地址和255.255.255.0的子网掩码(如果你用二进制书写的话是24位),这台计算机能够同10.0.0.1至10.0.0.255地址范围内的任何人对话。
小结
•IP地址只是32位数字。子网掩码只是一个能够上下滑动这个IP地址字节的“盖子”,以便创建更大或者更小的网络。
•一个IP地址的网络部分告诉主机它的本地子网有多大,本地子网然后告诉主机它可以直接与谁对话。
•单向广播数据包发送到一台计算机,广播数据包发送到许多台计算机。
之二:理解子网和CIDR
我们将学习有关子网和CIDR(无类域间路由)的知识。我们希望能够以比某些图书提供的更容易管理的方式学习这些知识。让我们先搞清楚一件事情:在子网中是没有“类别”的。在以前,网络分为A类、B类和C类。这些网络只能分为相等的几部分,因此现在我们引入了可变长度子网掩码(VLSM)来解决这个问题。老类别的C类网络是一个24位网络地址,B类网络是一个16位网络地址,A类网络是一个8位网络地址(如果你不清楚这个含义,请参阅“理解IP地址”那一讲)。这就是你需要了解的有关网络类别的全部内容。这些网络类别现在已经不存在了。一个IP地址由一个主机部分和一个网络部分组成。与子网掩码配合使用,你可以确定这个地址中哪一个部分是网络部分、这个网络有多大和网络开始的地方在哪里。操作系统需要知道这些信息,以便确定本地子网使用什么IP地址以及哪些地址属于外网并需要一台路由器来访问那些地址。相邻的路由器也需要知道这个子网有多大,以便这些路由器仅向这个方向发送合适的通信。一个网络地址中主机部分与网络部分的划分完全是由子网掩码确定的。CIDR(发音为“cider”的网络地址使用网络/子网掩码的风格。这个IP地址/子网掩码的组合能告诉你很多信息:网络部分/主机部分0000000000000000/0000000000000000上述32位字符串代表一个16位网络,因为这个地址中的16位被掩盖了。在本文中的例子(和现实世界)中,某些子网掩码被反复提及。这些子网掩码本身并不特殊。子网地址就是一个简单的32位字符串,其中有任何位数被掩盖(MASK)。不过,使用一个常用的子网掩码(如24位网络地址)开始研究对于记忆和理解关于子网的概念和划分非常有利。让我们先看一下个标准的子网划分表,这个表中也包括了一些有趣的其它信息:
子网掩码位数 | 24位子网数量 | 一个子网的地址数量 | 对主机部分的位挪用 |
/24 | 1 | 256 | 0 |
/25 | 2 | 128 | 1 |
/26 | 4 | 64 | 2 |
/27 | 8 | 32 | 3 |
/28 | 16 | 16 | 4 |
/29 | 32 | 8 | 5 |
/30 | 64 | 4 | 6 |
/31 | 128 | 2 | 7 |
由于是二进制数字,这使一个31位网络有两个可用的IP地址。设想一下这个子网:2.2.2.0/31。如果我们以二进制来表达这个网络地址,这个地址看起来是这样的: 00000010.00000010.00000010.00000000 (2.2.2.0) 11111111.11111111.11111111.11111110 (31)子网掩码“掩盖”被网络部分使用的位数。这意味着被掩盖的位数将用于网络地址部分。可供主机地址使用的位数等于1。这个数字可以是一个0或者一个1。这就导致了两个可用的IP地址,就像上面的表格显示的一样。另外,从上面的表格中可以看到,子网掩码(从主机部分挪用的)位数每增加一,子网中可用的地址数量就被削减一半。现在让我们来分析“192.168.0.200/26”的广播地址、网络地址和掩码。这个IP地址的掩码很简单:为255.255.255.192(26位子网掩码的含义是主机用6位,2的6次方等于64,255减去64减1等于192)。你能够在网络上查到子网地址表。这个表还能为你列出所有的信息。但是,我们更感兴趣地是教人们理解这里所发生的事情。这个子网掩码可以告诉你,这个网络地址中惟一需要我们关心的部分是最后一个字节:广播地址和网络地址的开头都是192.168.0。搞清楚这最后一个字节的含义很像是为一个划分一个24位网络。但是,如果这个提示对你没有帮助,你甚至不需要考虑这个问题。每一个26位地址的网络都有64台主机。这个网络的地址范围是从.0至.63、从.64至.127,从.128至.191,以及从.192至.255。我们的地址192.168.0.200/26在.192至.255网段中。因此,这个网络的地址是192.168.0.192/26。这个广播地址就更简单:192用二进制表示是11000000。取最后的6位数(这些字节被掩码“关闭”了),把这些字节“打开”,你得到了什么?192.168.0.255。来看一下你是否已经理解了这一切,现在计算192.168.0.44/26的网络地址和广播地址。(网络地址:192.168.0.0/26;广播地址:192.168.0.63)。一开始这些地址是很难一下子就看出来。这时制作一个表格会很有帮助。如果你计算出你要每一个子网有6台主机(包括不能使用的网络和广播地址是8台主机),你就可以制作下面这个表格。下面是2.2.2.0/29、2.2.2.8/29、2.2.2.16/29以及最后一个子网是2.2.2.249/29。
实际上,你很可能偶尔发现这样的网络。这种网络划分为三个26位网络地址,并且最后一个26位网络地址分为两个27位网络地址。如果你已经能够制作上述表格将会更容易理解这个问题。这就是你需要知道的全部东西。在16位网络地址和24位网络地址范围内使用更大的子网是比较复杂的。但是,原则是一样的。都是一个32位地址和一个子网掩码。然而,一定要认识到子网的使用是受到某些限制的。我们不能分配以10.1.0.32开头的26位网络地址。如果我们把10.1.0.32/26的IP地址和子网掩码发送给大多数操作系统,操作系统只会认为我们发送的起始地址是10.1.0.0/26。这是因为26位地址空间需要64个地址,而子网划分会从这个位数的自然分界线开始。因些,如果在上述表格中,你把某子网从2.2.2.3/29开始?实际的结果却是2.2.2.0/29。这些复杂的问题确实需要一个简明的例子。请记住,当你从这个网络主机部分提取另一位以便创建一个更大的子网掩码时,IP地址数量在一个子网内是如何被减少一半的。这个原则在相反的情况下也发挥作用。如果我们有一个拥有128台主机的25位网络地址,并且从网络(掩码)部分挪用一位,我们现在就有一个拥有256台主机的24位网络地址。使用搜索引擎Google在网络上搜索“subnet table”(子网表),可以立即看到子网掩码与网络大小的关系。如果一个16位网络地址拥有65535个地址,一个17位网络地址拥有的网络地址将减少一半,一个15位网络地址拥有的网络地址将提高一倍。这是非常令人激动的。实践,实践,再实践。这是让你理解这个原理的好方法。不要忘记,所有的问题都可以归结到网络的位数问题。如果你要更多地了解子网,下一步应该是阅读一些路由协议。小结
•CIDR IP地址有一个主机部分和一个网络部分。而子网掩码指定网络部分使用的位数,地址中这些位将不会改变。•子网是通过简单地在32位数字中上下移动网络与主机部分的分界来创建。•如果你从已知的子网掩码开始学习,复杂的地址是很容易理解的。一个17位网络地址的数量是一个16位网络地址的一半。16位网络中有6.5万个地址。
之三:理解OSI网络分层
OSI(开放系统互连)参考模型了。网络协议栈具有重要的意义。但是,还没有重要到你应该首先学习的程度。许多所谓的网络课程都是从教你记住OSI模型中的每一个层的名字和这个模型中包含的每一个协议开始的。这样做是不必要的。甚至第5层和第6层是完全可以忽略的。国际标准组织(ISO)制定了OSI模型。这个模型把网络通信的工作分为7层。1至4层被认为是低层,这些层与数据移动密切相关。5至7层是高层,包含应用程序级的数据。每一层负责一项具体的工作,然后把数据传送到下一层。物理层(也即OSI模型中的第一层)在课堂上经常是被忽略的。它看起来似乎很简单。但是,这一层的某些方面有时需要特别留意。物理层实际上就是布线、光纤、网卡和其它用来把两台网络通信设备连接在一起的东西。甚至一个信鸽也可以被认为是一个1层设备(参见RFC 1149)。网络故障的排除经常涉及到1层问题。我们不能忘记用五类线在整个一层楼进行连接的传奇故事。由于办公室的椅子经常从电缆线上压过,导致网络连接出现断断续续的情况。遗憾的是,这种故障是很常见的,而且排除这种故障需要耗费很长时间。第2层是以太网等协议。请记住,我们要使这个问题简单一些。第2层中最重要的是你应该理解网桥是什么。交换机可以看成网桥,人们现在都这样称呼它。网桥都在2层工作,仅关注以太网上的MAC地址。如果你在谈论有关MAC地址、交换机或者网卡和驱动程序,你就是在第2层的范畴。集线器属于第1层的领域,因为它们只是电子设备,没有2层的知识。第2层的相关问题在本网络讲座中有自己的一部分,因此现在先不详细讨论这个问题的细节。现在只需要知道第2层把数据帧转换成二进制位供1层处理就可以了。在往下讲之间,你应该回过头来重新阅读一下上面的内容,因为经验不足的网络管理员经常混淆2层和3层的区别。如果你在谈论一个IP地址,那么你是在处理第3层的问题,这是“数据包”问题,而不是第2层的“帧”。IP是第3层问题的一部分,此外还有一些路由协议和地址解析协议(ARP)。有关路由的一切事情都在第3层处理。地址解析和路由是3层的重要目的。第4层是处理信息的传输层。第4层的数据单元也称作数据包(packets)。但是,当你谈论TCP等具体的协议时又有特殊的叫法,TCP的数据单元称为段(segments)而UDP协议的数据单元称为“数据报(datagrams)”。这个层负责获取全部信息,因此,它必须跟踪数据单元碎片、乱序到达的数据包和其它在传输过程中可能发生的危险。理解第4层的另一种方法是,第4层提供端对端的通信管理。像TCP等一些协议非常善于保证通信的可靠性。有些协议并不在乎一些数据包是否丢失,UDP协议就是一个主要例子。现在快要到7层了,我们很想知道第5层和第6层有些什么功能。可以说,它们都是没有用的。有一些应用程序和协议在5层和6层。但是,对于理解网络问题来说,谈论这些问题没有任何益处。请大家注意,第7层是“一切”。7层也称作“应用层”,是专门用于应用程序的。如果你的程序需要一种具体格式的数据,你可以发明一些你希望能够把数据发送到目的地的格式,并且创建一个第7层协议。SMTP、DNS和FTP都是7层协议。学习OSI模型中最重要的事情是它实际代表什么意思。假如你是一个网络上的操作系统。在1层和2层工作的网卡将通知你什么时候有数据到达。驱动程序处理2层帧的出口,通过它你可以得到一个发亮和闪光的3层数据包(希望是如此)。作为操作系统,你将调用一些常用的应用程序处理3层数据。如果这个数据是从下面发上来的,你知道那是发给你的数据包,或者那是一个广播数据包(除非你同时也是一个路由器,不过,暂时不用担心这个问题)。如果你决定保留这个数据包,你将打开它,并且取出4层数据包。如果它是TCP协议,这个TCP子系统将被调用并打开这个数据包,然后把这个7层数据发送给在目标端口等待的应用程序。这个过程就结束了。当要对网络上的其它计算机做出回应的时候,每一件事情都以相反的顺序发生。7层应用程序将把数据发送给TCP协议的执行者。然后,TCP协议在这些数据中加入额外的文件头。在这个方向上,数据每前进一步体积都要大一些。
TCP协议在IP协议中加入一个合法的TCP字段。然后,IP协议把这个数据包交给以太网。以太网再把这个数据作为一个以太网帧发送给驱动程序。然后,这个数据通过了这个网络。这条线路中的路由器将部分地分解这个数据包以获得3层文件头,以便确定这个数据包应该发送到哪里。如果这个数据包的目的地是本地以太网子网,这个操作系统将代替路由器为计算机进行地址解析,并且把数据直接发送给主机。这个过程确实简化了。但是,如果你能够按照这个进程来做,并且理解数据包在每一个阶段 都会发生什么事情,你就征服了理解网络的相当大的一部分问题。当你开始讨论每一个协议实际上做什么的时候,一切都会变得非常复杂。如果你刚刚开始学习,在 你理解复杂的事情在设法完成什么任务之前,请你先忽略这些复杂的事情。这样会提高你的学习热情。小结•与其苦钻OSI模型中的各协议不如好好理解路由器和主机如何利用网络栈传输数据•2层数据称作帧,不包含IP地址。IP地址和数据包在3层,MAC地址在2层。•除非你是一台路由器,通过网络栈向上发来的数据是给你的,通过网络栈向下发送的数据是你发送的。
之四:理解数据链路层
比IP和路由更重要的是什么?当网络2层出现故障的时候,链路层的知识显得更重要。许多人都没有掌握构建富有弹性的2层网络必须具备的生成树协议的知识。当一台交换机出现问题时,除非主机直接连接到这台交换机。否则不应该影响其它人的网络连接。在我们深入介绍生成树协议之前,你必须要理解2层内部的工作原理。
2层是数据链路层,是以太网所在的层。在这一层我们将讨论网桥、交换和虚拟局域网,要让一个网络运行起来,你实际上不需要学习以太网内部的工作原理,当然,如果你愿意学习的话,你可以利用其它的时间学习这方面的知识。
以太网交换机是一种“网桥”设备。传统的网桥是这样工作的,一开始它接收以太网帧,然后,把它们发送到除接收端口之外的全部其它端口。以太网交换机具允许允许双绞线连接的能力。它渐学习哪一个端口连接了哪些MAC地址。这时候,网桥就变成了一台学习设备,能够存储在一个端口上看到的全部的MAC地址表。当一个帧需要发出时,网桥将查看在网桥表中的目标MAC地址,并且知道应该在哪一个端口发送这个帧。这种仅向正确的主机发送数据的能力是交换技术中的一个巨大的进步,因为这可能显著减少通信冲突。如果在网桥表中没有目标MAC地址,交换机就简单地把数据发送到全部端口。这是首次发现主机到底在什么地方的惟一方法,因此,正如你看到的那样,把数据发送到全部端口是交换技术中的一个重要原则。这个原则在路由中也非常必要。
2层相关的重要词汇包括:
单播分段(Unicast segmentation):网桥能够限制哪些主机能够收到单播帧(仅发送给一个MAC地址的帧)。集线器只是简单地把一切数据发送给所有的端口,因此,单播分段本身可以节省大量的带宽。
冲突域(Collision Domain):冲突域是能够发生冲突的网段。由于交换机采用了直通发送技术以及网卡全部采用双工技术,冲突已经不再发生了。如果你在一个端口看到冲突,这就意味着有人意外地使用半双工的设备,或者是出现了其它的故障。
广播域:发送和接收广播帧的网段。
在交换机产品几年后,网桥运行所采用的老式的存储和发送方式改变了。新的交换机仅查看帧的目标MAC地址,然后立即把这个帧发送出去。这种技术称作“直通发送”可以帧更快地直接通过交换机,因为这种方式对帧很少进行处理。这种方式也暗示了一件重要的事情:一台交换机不再检查CRC(循环冗余校验)以便查看数据包是否损坏。这还暗示着不可能发生冲突。
另外,为了解决广播网段的问题,我们引入了虚拟局域网技术。如果你不能向另一台机器发送广播帧,那些机器就不在你的本地网络中,你要把全部数据包发送给一台路由器,接着由路由器发送这些数据包。实际上,这就是虚拟局域网做的事情:虚拟局域网将网络划分为更多的子网。
你可以在一台交换机上设置虚拟局域网,然后向一个虚拟局域网分配端口。如果主机A是虚拟局域网1,这台主机就不能与虚拟局域网2中的任何人通话,就像它们生活在完全没有网络连接的设备中一样。不过需要注意,这毕竟只是虚拟的,如果交换机的MAC地址表空间已经被数据填满从而无法继续维护这个交换MAC地址表,为了继续维持通讯交换机将会把收到的所有数据转发到所有端口。很多人将VLAN视为一种很好的安全措施,实际上任何一个半吊子黑客使用合适的工具都可以很快的攻克交换机的VLAN限制,事实上,当交换机出现MAC地址表溢出的情况时,它会变成一台单纯的HUB。
正如我们已经知道的那样,如果你无法使用ARP协议获得目标的MAC地址,那你必须要使用一台路由器。这是不是意味着你必须在每个VLAN之间物理的连入一台路由器呢?不需要,因为我们现在拥有3层交换机!设想一个例子,如果你愿意,一台交换机可以配置48个端口。这台交换机有两个虚拟局域网,虚拟局域网1采用1至24端口,虚拟局域网2采用25至48端口。要把这两个虚拟局域网连接起来,你基本上有三种选择。第一,使用一台路由器分别连接这两个虚拟局域网中的一个端口,并且分为VLAN中的主机配置正确的默认路由。第二种方法是你还可以简单地在每个虚拟局域网中各自建立一个虚拟路由器接口(virtual interfaces)。在思科的设备,这种虚拟路由器接口可能称作“vlan1”和“vlan2”。它们拥有自己的IP地址,而VLAN中的主机使用这些虚拟路由器接口作为自己的路由器。
在第三种方法使我们回到了2层概述的最终话题。如果你拥有多台需要包含同样的虚拟局域网的交换机,你可以通过端口汇聚(trunk)的方式它们都连接起来。这样,交换机A中的虚拟局域网1和交换机B中的虚拟局域网1就完全是一样的了。这是采用802.1q标准完成的。802.1q标准为将离开第一台交换机的数据包打上一个虚拟局域网的标识符。思科把这些交换机间的链路称作“主干端口(trunk ports)”,你可以拥有交换机允许的最多数量的虚拟局域网(目前大多数硬件允许4096个虚拟局域网)。因此,在虚拟局域网之间建立联系的第三种方法(也是最后一种方法)是把以trunk方式连接一台路由器,并且为每一个虚拟局域网建立一个虚拟路由器接口。虚拟局域网1上的主机(无论是在交换机A和交换机B上)都能够访问这个路由器接口(这个接口可以在另一台设备上),因为他们全部都连接在了一起,并且共享一个广播域。关于trunk与802.1q的更多信息请参见这篇文章。
在这里我们没有采用“这是2层协议,记住以太网数据包头”这种标准的教学模式。要成为一个真正的专家,你必须要知道这些知识。但是,要成为一个有用的操作人员,简单地知道2层是如何工作的就可以了。下一讲我们将介绍网络领域最有趣的协议生成树协议。
小结:
●网桥(又名交换机)存储MAC地址表以实现单播网段功能。也就是说它们仅向需要这个数据的主机发送单播数据。
●虚拟局域网并不能提供可靠的安全。
●一台3层交换机能够通过trunk提供多个虚拟局域网,并且为这些虚拟局域网提供路由。这可以完全在同一条线路上实现
之五:学习生成树协议
现在,我们的网络教程开始接触到让人期待的生成树协议,学好它,你就可以尽可能避免因某台交换机的问题造成整个局域网崩溃。继续读下去吧。
生成树协议是由Sun微系统公司著名工程师拉迪亚•珀尔曼博士(Radia Perlman)发明的。网桥使用珀尔曼博士发明的这种方法能够达到2层路由的理想境界:冗余和无环路运行。你可以把生成树协议设想为一个各网桥设备记在心里的用于进行优化和容错发送数据的过程的树型结构。
我们要介绍的这个问题在图1中进行了描述。
图 1.
如果这些交换机不采用生成树协议并且以这种方式连接,每一台交换机将无限地复制它们收到的第一个数据包,直到内存耗尽和系统崩溃为止。在2层,没有任何东西能够阻止这种环路的事情发生。在图1中,管理员必须要手工关闭这个红色连接线路才能让这个以太网网络运行。生成树协议在当前可用连接有效时关闭一个或者更多其它冗余连接,而在当前连接出现故障后,再启用这些被关闭的冗余连接。生成树协议决定使用哪一个连接完全取决于网络的拓扑结构。
生成树协议拓扑结构的思路是,网桥能够自动发现一个没有环路的拓扑结构的子网,也就是一个生成树。生成树协议还能够确定有足够的连接通向这个网络的每一个部分。它将建立整个局域网的生成树。当首次连接网桥或者发生拓扑结构变化时,网桥都将进行生成树拓扑的重新计算。
当一个网桥收到某种类型的“设置信息”(一种特殊类型的桥接协议数据单元,BPDU)时,网桥就开始从头实施生成树算法。这种算法从根网桥的选择开始的。根网桥(root bridge)是整个拓扑结构的核心,所有的数据实际上都要通过根网桥。顺便提示一下,有手工设置根网桥时要特别注意。对于思科设备来言其根网桥的选择过程暴露出一些问题,就是过分简单化。思科硬件通常使用最低的MAC地址,具备这些地址的设备通常是网络中最古老的设备,因而其交换速度常是最慢的,而从根网桥在网络中的位置看,它负荷却最重。生成树构建的下一步是让每一个网桥决定通向根桥的最短路径,这样,各网桥就可以知道如何到达这个“中心”。这一步会在每个局域网进行,它选择指定的网桥,或者与根桥最接近的网桥。指定的网桥将把数据从局域网发送到根桥。最后一步是每个网桥要选择一个根端口。所谓根端口也即“用来向根桥发送数据的端口”。注意,一个网桥上的每一个端口,甚至连接到终端系统(计算机)的端口,都将参加这个这个根端口选择,除非你将一个端口设置为“忽略”。
上 面就是生成树算法的过程。但是,这还不能解释生成树在现实世界中实际上在做什么。我们说,这种计算是破坏性的。毫无疑问,它确实是如此。要进行这种计算, 网桥必须停止所有的通信。网桥要经过一系列的测试和学习阶段,只有在拓扑结构建立起来之后才开始发送数据。网桥只有在拓扑机构改变的时候或者网桥得到一个BPDP包时才会进行,想起来这种情况应该很少,可事实上,这种计算发生的频度要比你想象的多。
生成树协议思路是,你允许有一个连接错误,因为你在一对网桥之间存在两条物理连接。生成树协议在一个端口需要使用之前将封锁那个端口。因此,我们应该可以拔掉冗余的连接,并且在不中断通信的情况下把它连接到其它的网桥。很可惜,它不是这样工作的。
当一个物理连接的网桥新网桥连线时,它将发送重新设置BPDU,其它连接的设备将遵照施行。当生成树协议开始计算的时候,所有的通信都要停止大约50秒。这些时间可以说是物有所值,因为你仅仅被限制在一个很短的停机时间内。如果交换机被挤暴,或者你缺少多余的路径,将会出现永久的停机。相比之下,停机50秒钟只是非常轻的损失。
另外,很多现代厂商已经实现了快速生成树协议,这是老的生成树协议的一个改进版本,更加注意了在重新计算拓扑时的开销,并且与老版本的协议兼容。在大多数情况下,它可以把以前多达50秒的计算时间缩短到不足3秒,从这点看,任何人都应该使用新的快速生成树协议。
希望上面的介绍已经足够清楚。我们知道,启用生成树功能可以让我们通过多个连接把两个网桥连接在一起,并且不产生环路。如果连接之中的一个网桥坏了,我们可以绕过这个网桥,使用另一个网桥。这个工作原理是虽然现用的交换机封锁其备用的连接,但是,它默默地监听BPDU更新并且仍然知道哪一个连接通向根桥。这就是说,如果你进行了适当的设置。还记得虚拟局域网中的trunk?如果其中一个物理连接碰巧是一条虚拟局域网trunkk线,会出现什么情况呢?如果我们只有一个运行的生成树实例,这个生成树可能会发现trunk中的一个网络不应该使用这个连接(turnk端口汇聚将多条物理连接汇聚为一个带宽更大的逻辑连接)。除了关闭整个连接之外,它没有其它的选择。
现在进入每一个虚拟局域网一个生成树协议(PVST/per-VLAN spanning trees)的话题。当启用这项功能的时候,一个网桥将为该网桥上的每一个虚拟局域网运行一个生成树实例。如果一个trunk连接包含虚拟局域网1、2和3,它可以决定虚拟局域网1和2不能使用那个路径,但是仍然允许虚拟局域网3使用这条路径。在复杂的网络中,还有许多虚拟局域网3只有一个出口的情况,这可能是因为管理员要限制虚拟局域网3访问的范围。如果我们不是用PVST,而且trunk端口被生成树封锁了,这个网桥上的虚拟局域网3将失去与其局域网的其它方面的连接。每一个人都应该使用PVST。
最后,你应该不会忘记,发送BPDU数据的任何端口都能够引起网络中断。这也包括运行ettercap软件和其它非法程序的计算机。一定要在所有的端口启用类似于思科的“BPDU-Guard”这样的技术来封锁BPDU数据包。这些BPDU数据包不仅能够引起生成树协议重新进行计算,而且一台计算机也可以参加投票并且赢得这个选择。你肯定不希望发现你的生成树根是某个人的计算机。当所有的通信都涌向你的时候,这种情况很容易完成中间人攻击。
还有一些没有提到的BPDU信息以及需要学习的有关生成树协议的其它细节。这些细节有一点复杂。但是,由于你已经了解了生成树协议的概况,这些细节应该很容易理解。如果你要花更多的时间学习这些细节,从长远来看,你会得到回报。
小结
•生成树协议提供一种控制环路的方法。采用这种方法,在连接发生问题的时候,你的以太网能够绕过出现故障的连接。
•生成树中的根桥是一个逻辑的中心,并且监视整个网络的通信。最好不要依赖设备的自动选择去挑选哪一个网桥会成为根桥。
•生成树协议重新计算是痛苦的:恰当地设置主机连接端口(这样就不会引起重新计算),推荐使用快速生成树协议。