上一次,我们通过宿舍联网打魔兽的需求,认识了如何通过物理层和链路层组建一个宿舍局域网。今天,让我们切换到稍微复杂点的场景,办公室。
在这个场景里,就不像在宿舍那样,搞几根网线,拉一拉,扯一扯就可以了。一个办公室少到数十人,大至上百人,每个人都有一个网口,如果再算上整个楼层楼层、甚至整栋楼,这个网口就更多了。
类似办公室这样,这些复杂场景的网络布线就牵扯出一个专业名词-拓扑结构。
什么是拓扑结构?
在解释拓扑结构前,我们要先明白什么是拓扑。拓扑是 Topology 的音译,直译是地质学,最早指研究地形、地貌相类似的有关学科。现在是研究几何图形或空间在连续改变形状后还能保持不变的一些性质的一个学科。
计算机网络的拓扑结构是引用拓扑学中研究与大小、形状无关的点、线关系的方法,把网络中的计算机和通信设备抽象为一个点,把传输介质抽象为一条线,由点和线组成的几何图形就是计算机网络的拓扑结构。
办公室拓扑结构的形成
上面说过,每个办公室会有几十个甚至上百个网口。这个时候,一个交换机肯定不够用,需要多台交换机连接,而多台交换机连接就形成了一个稍微复杂的拓扑结构。
我们先来看两台交换机的情形。两台交换机连接着三个局域网,每个局域网上都有多台机器。如果机器 1 只知道机器 4 的 IP 地址,当它想要访问机器 4 时,把包发出去的时候,它必须知道机器 4 的 MAC 地址。我们来看看这个过程:
- 机器 1 发起广播,机器 2 和交换机 A 都收到广播。机器 2 收到广播后,知道不是找它的,所以没它什么事。
- 交换机 A 一开始是不知道任何拓扑信息的,在它收到这个广播后,采取的策略是,除了广播包来的方向外,它还要转发给其他所有的网口。
- 机器 3 和交换机 B 收到了广播信息了,同样的,机器 3 也知道和它没什么关系。
- 交换机 B 收到广播信息后,这时候它也不知道任何拓扑信息,所以也进行广播,将包转发到局域网三,也就是机器 4 和机器 5。
- 机器 4 收到广播是,它发现是找它的,就主动响应说,这是找我的,我的 MAC 地址是 XXX。
该机器 1 收到机器 4 的 MAC 地址后,一个 ARP 请求就成功完成了。
在上面过程中,交换机 A 和交换机 B 都是能够学习到这样的信息:
- 机器 1 是在左边这个网口。
当了解这样的信息后,如果机器 2 访问 机器 1,机器 2 发起一个 ARP 请求获取机器 1 的 MAC 地址,这个广播消息会发给机器 1 和交换机 A。这个时候交换机 A 已经知道机器 1 是在左边的网卡,所以它就不会将请求广播到局域网络和局域网三。
就这样,当交换机学习完所有的拓扑信息后,两台交换机工作得会越来越好。
但是随着办公室越来越大,交换机数量肯定会越来越多,当整个拓扑结构复杂,这么多网线绕来绕去,不可避免的就会出现一些意料之外的情况,其中最常见的问题就是环路问题。
环路与广播风暴
如下图。当两个交换机环路连接两个局域网时,你知道会出现什么结果吗?
我们来想象下机器 1 访问机器 2 的过程。
- 机器 1 发起 ARP 广播
- 机器 2 收到广播,把 MAC 地址返回。
咦,整个过程很顺利,没什么问题。
但是我们忽略了,两个交换机也是能收到广播包的。我们来看看两个交换机的广播过程:
- 交换机 A 开始不知道拓扑信息,于是将广播信息放到局域网二
- 消息在局域网二广播,交换机 B 右网卡收到广播消息,于是将信息放到局域网一
- 消息在局域网络广播,交换机 A 左网口收到消息,又将广播信息放到局域网二
- ......
看出来了吗?这样一直广播,就会形成一个环路,最终成为广播风暴,直到网络瘫痪。
上面过程,可能会有人说,两台交换机逐渐学习到拓扑结构后 ,是不是就可以了?那就让我们来看下它们的学习过程:
- 在局域网一,交换机 A、B 收到机器 1 的广播包后,知道机器 1 都是在左网口
- 当广播放到局域网二后,交换机 B 右网口又收到了来自机器 1 的广播包,于是就误会机器 1 换位置了,就记住了机器 1 是在右网口,把之前学习到的信息清理掉
- 同理,交换机 A 右网口收到了机器 1 的广播包,同样误会了,于是也学会了,机器 1 在右网口,不是在左网口
就这样,两个交换机会不断刷新“三观”,机器 1 是在左网口,过一会,发现不对,机器 1 是在右网口,过了一会,又发现不对,是在左网口。于是,又形成了一个“广播风暴”。
那么,有什么方法可以解决环路问题呢?这就到了 STP 协议出场的时候了。
STP 协议中那些难以理解的概念
在数据结构中,有一个方法叫做最小生成树。有环的我们常称为图。将图中的环破了,就生成了树。而在计算机网络中,生成树的算法叫作 STP(Spanning Tree Protocol)。
STP 协议比较复杂,一开始很难看懂,让我们来通过华山论剑,决出五岳盟主的方式看看生成树的过程。
在 STP 协议里面有很多概念,译名就非常拗口,让我们以门派中的职位来帮助大家理解。
- Root Bridge,也就是根交换机。可以比喻为“掌门”交换机,是某棵树的老大。
- Designated Bridge,也就是指定交换机。这个比较难理解,可以想象成一个“小弟”,对于树来说,就是一棵树的树枝。所谓“指定”的意思是,我拜谁做大哥,其他交换机通过这个交换机到达根交换机,也就相当于拜他做了大哥。这里注意是树枝,不是叶子,因为叶子往往是主机。
- Bridge Protocol Data Units(BPDU),网桥协议数据单元。可以比喻为“相互比较实力“的协议。行走江湖,比的就是武功,拼的就是实力。当两个交换机碰见的时候,也就是相连的时候,就需要互相比比内力。BPDU 只有掌门能发,隶属于某个掌门的交换机只能传达掌门的指示。
- Priority Vector,优先级向量。可以比喻为实力(值越小越牛)。实力是啥?就是一组 ID,[Root Bridge ID, Root Path Cost, Bridge ID, and Port ID]。为什么这样设计呢?这是因为要看怎么来比实力。先看 Root Bridge ID,也就是老大的 ID,发现掌门一样,那就是师兄弟;再比 Root Path Cost,也就是我距离我老大的距离,也就是拿和掌门的关系比,看同一个门派内谁和老大关系铁;最后比 Bridge ID,比我自己的 ID,拿自己的本事比。
概念都准备好了,下面我们看看 STP 是怎么工作的。
STP 的工作过程
一开始,江湖纷争,异常混乱。大家都觉得自己是掌门,谁也不服谁。于是,所有的交换机都认为自己是掌门,每个网桥都分配了一个 ID。这个 ID 里有管理员分配的优先级,当然管理员指定哪些交换机性能好,就给它们分配高的优先级。这种交换机生下来武功就很高,起步就是乔峰。
既然都是掌门,互相都连长网线,那就互相发送 BPDU 来比功夫呗。这一比就发现,有人是岳不群,有人是封不平。赢的人接着做掌门,输的就只好做小弟了。当掌门的还会继续发 BPDU,而输的人就没有机会了,他们就只有在收到掌门发的 BPDU 的时候,转发一下,表示服从命令。
数字表示优先级。就像上面的图,5 和 6 碰见了,6 的优先级低(数字越小,优先级越高),所以乖乖做小弟。于是,一个小门派形成,5 是掌门,6 是小弟。其他诸如 1-7、2-8、3-4 这样的小门派也诞生了。接着,这些小的门派就好相互合并。
合并的过程会出现以下四种情形。
情形一:掌门遇见掌门
当 5 碰到了 1,掌门碰见掌门,1 觉得自己是掌门,5 也刚刚跟别人 PK 完,成为掌门。这俩掌门比功夫,最终 1 胜出,于是 5 就率领所有的小弟归顺。结果就是 1 成功大掌门。
情形二:同门相遇
同门相遇可以是掌门与自己的小弟相遇,这说明存在“环”了。这个小弟已经通过其他门路摆在你门下,结果你还不认识,还 PK 了一把。结果掌门发现这个小弟功夫不错,不应该级别这么低,就把他招到门下亲自带,那这个小弟就相当于升职了。
我们再来看,假如 1 和 6 相遇。6 原来就拜在 1 的门下,只不过 6 的上司是 5,5 的上司是 1。1 发现,6 距离我只有 2,比如 5 这里过来的 5(=4+1)近多了,那 6 就直接向我汇报吧。于是,5 和 6 分别汇报给 1。
同门相遇还可以是小弟相遇。这个时候就要比较谁和掌门的关系近。近的当大哥。刚才 5 和 6 同时向 1 汇报,后来 5 和 6 相遇比功夫的时候发现,5 你直接汇报给 1 距离是 4,如果 5 汇报给 6 再汇报给 1 ,距离只有 2+1=3,所以 5 干脆拜 6 为上司
情形三:掌门与其他帮派小弟相遇
小弟拿本帮掌门和这个掌门比,赢了,这个掌门就拜入门下,输了,就拜入新掌门,并且会主动拉拢和自己连接的兄弟,一起“弃暗投明”。
例如,2 和 7 相遇,虽然 7 是小弟,2 是掌门,就个人武功而言,2 比 7 强,但是 7 的掌门是 1,比 2 牛,所以没办法,2 要拜入 7 的门派,并且连同自己的小弟都一起拜入。
情形四:不同小弟相遇
各自拿掌门比较,输了的拜入赢的门派,并且逐渐将与自己连接的兄弟拉入新门派。
例如,5 和 4 相遇。虽然 4 的武功好于 5,但是 5 的掌门是 1,比 4 牛,于是 4 拜入 5 的门派。后来当 3 和 4 相遇的时候,3 发现 4 已经“叛变”了,4 说我现在老大是 1,比你牛,要不你也来吧,于是 3 也拜入 1。
最后,生成一棵树,武林一统,天下太平。但是天下统一久了,也会有相应问题。常见的有广播和安全问题。
广播和安全问题
机器多了,交换机也多了,就算交换机比 Hub 智能一些,但是还是难免有广播的问题。一大堆机器,相关的部门、不相关的部门,广播一大堆,性能就下来了。
就像一家公司,创业的时候,十来个人,坐在一个会议室,有事情大家讨论下,非常方便。当时如果变成了 50 个,全在一个会议室吵吵,就会乱的不得了。
另一方面,一个公司里,有的部门需要保密,比如人事部门,肯定要讨论升职加薪的事情。但是如果在一个广播域里,碰到一个会抓包的程序员,就能看的没有加密的敏感信息。
那咋办?能咋办,分部门,分会议室呗,让我们来看看怎么分。
有两种分的方法。一个是物理隔离。每个部门设一个单独的会议室,对应到网络方面,就是每个部门有单独的交换机,配置单独的子网。这样部门之间的沟通就需要路由器了。
这样的问题在于,有的部门人多,有的部门人少,而且部门的人数也会频繁发生变化,如果每个部门有单独的交换机,网口多了浪费,少了又不够用。
这时候,虚拟隔离就出来了。虚拟隔离,就是我们常说的 VLAN,或者叫做虚拟局域网。
使用 VLAN,一个交换机上会连属于多个局域网的机器,那交换机是怎么区分哪个机器属于哪个局域网呢?
我们只需要在原来的二层头上加一个 TAG,里面有个 VLAN ID,共 12 位,可以划分 4096 个 VLAN。对于普通办公室,这个数量应该是够用的。
如果我们买的交换机支持 VLAN,当这个交换机把二层的头取下来的时候,就能够识别这个 VLAN ID。这样只有相同的 VLAN 的包,才会互相转发,不同 VLAN 的包,是看不到的。
这样,广播和安全问题就能够解决了。