网络协议之办公室网络是怎样的?
写在前面
本文来看下办公室网络怎样的。
1:正文
如果是在一个寝室中组件一个局域网还是比较简单的,只需要一个交换机,然后大家的电脑全部连接到这个交换机上就行了,之后所有的电脑设置CIDR保证在一个局域网就可以了。但是,在办公室的场景中,一个交换机显然就不够了,为啥?因为口不够!所以我们就需要多个交换机,可能如下图:
注意:这里LANX分别代表一个局域网,并且都是一个网段的可以互通,至于LANX内部的结构是怎样的,暂时不用纠结
假定机器1首次访问机器4,机器1只知道机器4的IP地址,但是呢不知道MAC,所以需要先发送一个ARP请求,获取MAC地址,此时机器1发出的ARP请求发送路径如下:
1:机器2,经过网络层拆包发现与自己的IP地址不匹配,所以直接丢弃
2:交换机A,因为此时交换机A还没有任何拓扑信息,即不知道机器4到底在哪里,所以会发送到机器3,和交换机B,最终发送到LAN3中的机器4,机器4发现是自己的,则返回自己的MAC地址信息
经过这个ARP请求后,交换机A就知道机器1是在自己左边的这个网口了,这就是交换机学习
的过程了。那么当机器2发起一个访问机器1的ARP时请求过程就是这样的了:
1:请求到达机器1,机器1发现是自己的,则回复MAC
2:请求到达交换机A,交换机A此时已经知道机器1在左边的出口,而不在右边的出口,所以不会进一步将请求转发到LAN2了
同理,如果是机器3要访问机器1的话,请求过程就是这样子的:
1:请求到达交换机B,交换机B经过上面的学习知道机器1不在自己右边的出口,所以不会转发请求到LAN3
2:请求到达交换机A,交换机A知道机器1在自己左边的网口,所以会将请求进一步转发到LAN1,最终到达机器1
如果是交换机不是特别多的话,还好,但是当交换机越来越多,就很有可能导致环路问题
的发生,当出现了环路问题后,就会导致广播风暴,彻底堵塞网络,导致大家都上不了网了,就比如下图:
比如机器1要通过ARP获取机器4的mac,则过程可能是这样子的:
1:发送给机器2,机器2发现IP不是自己,则丢弃
2:发送给交换机A,交换机A将消息发送到LAN2,也会同时发送到交换机B的B-右的口
3:交换机B接着从B-左口,发送数据包给机器1,机器2,和交换机A的A-左,注意到交换机A的A-左就构成循环了
因为不断的循环,所以交换机们也无法学习到机器1到底是在哪个位置,因为其数据包一会从这个口过来(从哪个口过来交换机就会学习到机器的位置就在哪侧)
,一会又从那个口过来,所以就破不了局了。而要破局,也很简单,只要破环
就行了,即图转树
。其中STP协议就是来干这个事的,STP协议全称spanning tree protocol,协议细节作为开发来讲我觉得作为非网络工程师从业者也没必要了解太细,知道有这么个东西就行了。那么,通过STP协议,上图就可能变成如下这样:
当然只是一种可能的结果,并非肯定哈。
让我们把场景转换到机房中,机房中的机器有的作为测试机器,而有的呢是作为生产机器来使用,毫无疑问的是,生产机器和测试机器肯定是不能互通的,只要是开发我相信其中缘由肯定都是清除的,那么,这个时候应该怎么做呢?有如下两种方式。
- 物理隔离
物理隔离很简单,就是使用不同的交换机,测试机器和生产机器分别使用各自的交换机。
问题:不同环境机器数量不同,机器多的可能交换机口不够用,机器少的交换机口又会浪费。对于此问题可以考虑使用虚拟隔离。 - 虚拟隔离
虚拟隔离,就是经常听说的VLAN,或者叫做虚拟局域网,虚拟的意思是通过特定的标志位来区分是否可以通信,这个标志位就是TAG,具体是一个12长度的VLAN ID,支持VLAN的包结构如下图:
这里VLAN ID的长度是12位,所以理论上可以使用虚拟隔离的方式隔离出4096个独立网络,当然对于一般的环境是够用了,但对于云计算场景还是稍显不足的,因为用户的个数远远不止4096个,特别是对于阿里云,腾讯云这种比较大的云厂商而言,当然这是后话,暂且不表。
接着看怎么设置VLAN ID,VLAN ID是在路由器上设置的,这当然需要路由器本身的支持,主机通过网线连接的路由器的口设置的是什么VLAN,那么该主机发出去的包在网络接口层设置的VLAN ID就是什么,路由器在收到包后就会解包拿到VLAN ID,只有设置了该VLAN ID的口才会转发,这样实现网络的隔离了。到这里你可能有个疑问,VLAN ID可以有4096个,但是一个路由器肯定是没有这么多的口的啊,此时就需要将路由器的口设置成trunk口,然后使用一个网线就可以连接两台路由器的trunk口连接起来,也就相当于在逻辑上路由器的口增多了
,最终使用了VLAN的完了过可能如下图:
后续如过是某台生产机器淘汰作为测试机器用的话,就需要该机器能够和现有的测试机器互通,怎么做呢?也很简单,只需要修改该机器连接的交换机的口的vlan id为测试使用的vlan id就可以了。