概述
此文为极客时间趣谈网络协议第二模块“从第二层到第三层”中,第一和第二节的学习笔记。
主要内容包括局域网 LAN 的建立,以及局域网间如何通过交换机建立拓补结构。
一、如何建立一个局域网
局域网 LAN 的全称为 Local Area Network,它其实就是一个小型的计算机网络系统,当我们搭建一个局域网,我们需要考虑这四个问题:
- 设备间要怎么互相发送数据?
- 多个设备同时发送数据,那么发送顺序怎么安排?
- 如果数据发生过程中出现错误怎么办?
- 设备怎么知道数据是发送给自己的?
1.物理层连接网线
目前的网线一般有八根线组成,其中1,2起接收数据的作用,而3,6起发送数据的作用,我们将网线一端的1与3换位子,2与6换位子,然后将水晶头两端连接到电脑上,理论上两台电脑就具备了互相通信的物理基础(现在的电脑都具备自动适配的功能,理论上不换水晶头也不会有什么影响)。
当然,有了物理基础,我们还需要配置 IP 地址,子网掩码和默认网关,当配置好以后,两台电脑就会组成一个最小的局域网,即 LAN。
如果是多台设备,就需要一个交换机(相当于大学里头用的集线器)。多台设备连接到一个交换机上,当一个电脑发出数据的时候,Hub 会获取数据包并且广播给其他电脑。
现在解决了“设备间要怎么互相发送数据”问题。
2.MAC策略控制发送顺序
现在我们有了一个局域网,两台电脑之间可以通过广播给另一台电脑发送数据。
但是如果有多台电脑,就需要一个中转站,也就是交换机。交换机处于数据链路层,这是一个第二层设备,我们发出的包在抵达网络层之前,需要在数据链路层封装 MAC 地址,因而第二层也叫 MAC 层。
广播频道是有限的,就需要区分一个先来后到,确定谁先发生数据,谁先等会。MAC 全称 Medium Access Control,即媒体访问控制。他主要解决设备之间数据发送顺序的问题。
假如将设备发送数据比作汽车上路,有三种策略:
- 信道划分:划分车道,你走你的,我走我的;
- 轮流协议:限单双号,今天单号,明天双号;
- 随机接入:先出门,发现堵车就回去,错峰出门。(以太网使用的就是随机接入策略。)
这样,就解决了“多个设备数据发送顺序”问题。
3.循环冗余检测防止发生出错
对于以太网,第二层的最后面是 CRC,也就是循环冗余检测。通过 XOR 异或的算法,来计算整个包是否在发送的过程中出现了错误,
这样,就解决了"数据发生过程中出现错误"问题
4.网卡根据MAC接收数据包
现在,我们可以发送数据,并且也能确定好发送顺序了,接下来我们要解决接收问题。
现在,我们需要发送数据必然是知道目标 IP 的,而 IP 处于第三层,也就是网络层。
一般有两种情况,即发送设备知道目标设备 MAC 地址与发送设备不知道目标 MAC 地址两种情况。
发送设备知道目标设备 MAC 地址
当数据通过广播进入数据链路层的时候,应当携带对应的链路层地址,也就是 MAC 地址。在网络包中,应当包含目标 MAC 地址和源 MAC 地址:
有了目标 MAC 地址,当数据包在链路上广播的时候,网卡发现目标 MAC 和自己的 MAC 相同,就会接收数据包,接着打开 IP 包,如果 IP 也是自己的,就再打开 TCP 包......依次直到转发给应用层的引用处理为止。
反之,如果机器要做出响应,就要反过来重复这个过程:数据封装的 TCP 包,TCP 包封到 IP 包,IP 包封装到 MAC 包,然后发送出去,接收机器的网卡根据 MAC 确认是不是自己的.......直到应用层处理完为止。
发送设备不知道目标 MAC 地址
当设备知道目标 IP,但是不知道目标 MAC 的时候,可以通过 ARP 协议来通过目标 IP 获取 MAC 地址。
而 ARP 协议就是广播设备目标设备的 IP,并且获得目标设备返回的 MAC,对应的,有一个功能相反的 RARP 协议,作用是广播 MAC 获取 IP。
现在通过 ARP 协议设备可以知道目标设备的 IP 了,而为了避免频繁的发起 ARP 请求,设备自己也会在请求后缓存 ARP 信息。由于机器可能会下线,因此 IP 与 MAC 的对应关系不一定不变,因此 ARP 缓存有一定的有效时间,过了会过期再请求一次。
这样,就解决了"设备怎么知道数据是发送给自己的"问题
5.路由器
实际上,按照上面这些环节是可以建立一个局域网的,但是由于原始的交换机是无条件广播的,没有办法根据 IP 或者 MAC 定向发送数据,这样当设备一多,就会占用带宽,降低效率。并且,如果网络存在闭环,当一个设备发起 ARP 请求的时候,请求有可能再次回到交换机,然后进一步广播,如此反复形成广播风暴。
为此,我们需要交换机具有学习能力,就像路由器一样。而路由器是一个网络层设备,他可以直接记忆 IP 和 MAC 的对照关系,假如一个交换机可以做到这点,那么它其实就可以看做一个网络层设备,因此也叫三层交换机。我们以路由器为例,说明这个“学习”的流程:
在最开始的时候,机器发起 ARP 请求需要广播,把包发给所有连接路由器的机器,但是一次请求后它就会记住 MAC 来自于哪一个口,再发送请求的时候就不需要广播,而是定向发送。
当所有的机器都发送过 ARP 请求后,路由器就会记住整个网络结构,将网口和 MAC 的对应关系记录在具有一定过期时间的转发表中,过期时间内,所有的请求都可以得到定向转发,不必再广播。
二、交换机与VLAN
1.交换机与拓补结构
在公司这样的场合,多个局域网一般会由多个交换机互相连接形成拓补结构:
假如现在机器1需要发送消息给机器4,现在它只知道机器4的 IP,那么它就需要通过 ARP 请求获得机器4的 MAC。
- 现在机器1发起了 ARP 请求,机器2收到了,但是 IP 不是它的,所以它没有动作;然后交换机 A 收到了这个 ARP 请求,现在它也不知道 IP 对应的 MAC 是多少,于是它把请求广播给其他设备或交换机。
- 现在 LAN2 中的机器3收到了,但是 IP 不是它的,因而它也没有动作。
- 然后交换机 B 收到了,他也不知道 IP 对应的 MAC,于是又在 LAN3 中进行广播,机器5没有动静,但是机器4发现要找的就是自己的 IP,于是发出响应,给出了 MAC,现在响应经过了交换机 A 和交换机 B,然后到达了机器1,于是一个 ARP 请求成功完成了。
在响应过程中,交换机 A 和交换机 B 就知道了机器1和机器4的 IP 与 MAC对应关系,还有他们所在的位置。
假如现在机器2要请求机器1,由于交换机 A 已经知道机器1在 LAN1 中,因此只会在 LAN1 中广播。
随着 ARP 请求,交换机会逐渐了解整个拓补结构,减少不必要的广播,从而提高转发效率。
2.环路问题
当我们把两台交换机相连的时候,可能就会导致环路问题,比如机器1请求机器2:
- 机器1请求到达交换机 A,交换机 A 广播至 LAN2;
- 交换机 B 也在 LAN2,因此他也收到了广播,接着转发至 LAN1;
- 交换机 A 也在 LAN1,因此他也收到了广播,再次转发至 LAN2。至此,形成了循环
同理,交换机 B 也会形成这个过程,因此一份请求会不断的在循环中变多。
实际上,交换机“记忆”拓补结构的能力在这里是失效的:
- 当机器1请求机器2,请求先到达交换机A,此时交换机A记住了机器1在左边的网口;接着请求到达交换机B,交换机B也记住了机器1在左边的网口;
- 接着,交换机 A 广播请求到 LAN2,交换机 B 也收到了广播,因而认为机器1在右边的网口;然后交换机 B 广播到 LAN1,交换机 A 收到后也认为机器1 在左边。至此,形成了循环。
3.STP协议解决环路问题
STP 即最小生成树,假如我们有一张无向量的图,每个节点之间的路径有不同的权重,我们打破图的环状结构,将其变为一课树,如果有一课树上节点之间所有路径的权重之和最小,那么这个树就是最小权重生成树,简称最小生成树。
我们比较熟悉的普利姆和克鲁斯卡算法就是用来生成最小生成树的,具体可以参考大佬的博文:数据结构--最小生成树详解。
当交换机并入网络的时候回被分配到一个 ID,ID 有优先限级,当交换机节点相遇的时候,会互相发送 BPDU(网桥协议数据单元)比较优先级,优先级大的节点会成为优先级第的节点的父节点,反复比较后,最终会得到一个根节点。
根据此原则,有以下四种情况:
- 父级节点相遇:优先级低的节点带领子级节点成为优先级高的父级节点的子级节点(收入门下);
- 父级节点遇到自己的子级节点:说明形成了环,如果是该节点是孙子或者更低级的节点,并且该点直接到达父级节点的路径权值和小于通过他的上级节点到达父节点的路径权值,就会提升它的等级,将其直接变为自己的子节点;
- 父级节点遇到其他父级节点的子级节点:子节点会找到自己的父节点,最后跟这个父节点比较,然后走父节点相遇的流程;
- 子级节点相遇:子级节点相遇,会找到自己的父节点然后互相比较,走父级节点相遇的流程。
通过 STP 协议,我们就打破了环路,将原本的图状网络变为了树状。
不过 STP 虽好,但是也有问题:如果接入的机器非常多,或者网络请求比较慢,就会导致整个树生成的时间较长,如果生成树以后某个父级节点挂了,或者加入了新的节点,在等待重新生成 STP 的过程中是没法上网的。
4.局域网的隔离
机器之间通过交换机互相连接形成 LAN,但是总有一些信息不方便完全共享,因此需要将一个大的 LAN 分割成多个小的 LAN。
隔离有两种方式,一种是物理隔离,即直接将局域网和交换机摘出去,改为通过路由器连接。
第二种是虚拟隔离,即虚拟局域网 VLAN,将一个连接在一个交换机上的机器划分为多个虚拟的局域网。
方法同一个 VLAN 里的机器,在发送数据包的时候会在 MAC 层的头中加上Tag,里面有一个 VLAN ID,默认为 12 位,也就是一个 VLAN 中最多允许 2^12 = 4096
个 IP。当交换机支持使用 VLAN 的时候,包经过 MAC 层转发到交换机,交换机会解析 Tag,只有 VLAN 相同的包才会互相转发。
而交换机之间有一个特殊的网口,叫做 Trunk 口,这两个口会转发所有的 VLAN 的包。
三、总结
局域网的建立
- 物理层:首先,物理层的支持是必不可少的,比如网线。
- 数据链路层:当一台设备发送请求的时候,需要经过数据链路层——也就是 MAC 层的处理。数据包将在 MAC 层在头上添加源 MAC 与目标 MAC;设备发送数据需要确定先后顺序,这根据 MAC 层采用的三种 MAC 策略决定。在这之后,会进行循环冗余检测确保数据包是否成功发出。
- 网络层:假如一切顺利,那么数据包就会进入网络层,若不知道目标 IP 的 MAC,就需要先通过 ARP 请求获取目标 IP,再重复上述过程——比较需要注意的是, ARP 协议也是一个网络层协议。
数据包会被路由器广播到各个 LAN,接着机器根据目标 MAC 是否是自己的来决定是否要接收数据包。
交换机与路由器
由于 ARP 需要在 LAN 中广播,若每次发送数据包都要进行 ARP 请求效率会非常低,因此交换机会在 ARP 请求后记录源机器和目标机器的位置与信息,当下次发起请求时,不再全局广播 ARP 请求,而是定向发送。
环路问题与STP协议
一般来说,公司的局域网都是以多台交换机组成的拓补结构,但是随着网络结构复杂程度的上升,可能会出现环路,对应的解决方法是将形成环的图结构根据 STP 协议转为最小生成树。不过在节点过多的时候生成 STP 可能会花费较多时间,而且如果每当新节点加入都需要重新生成 STP。
VLAN
要将一个大局域网分为多个小局域网,一种是划分物理局域网,一种是划分虚拟局域网,即 VLAN。
当一些机器处于 VLAN 中时,发送的数据包会在 MAC 层会在头中添加 Tag,而 Tag 中又包含了 VLAN ID,支持划分 VLAN 的路由器在转发数据包的时候,只会广播给 VLAN ID 相同的机器,而路由器间通过 Trunk 口互相连接,这个网口会广播所有的 VLAN 的包。