【计算机网络】Data-Link Layer (三)

前面我们已经介绍了DLL的基本知识概念(封装成帧、透明传输以及差错检测等)、DLL的基本数据链路协议以及局域网的一个实现——以太网。这一篇中,我们主要介绍,如果源主机和目的主机之间跨越了多个局域网,它们是如何完成信息传输的。首先我们需要在多个局域网LAN之间建立连接,没有连接如何完成信息传输?网桥(Bridge)与交换机(Switch)的功能就是将多个LAN连接起来,使得不同LAN上的两台主句可以完成通信。我们需要指出的是,网桥(我们认为交换机与网桥是一样的,不加区分)是工作在DLL的,它根据数据帧中的目的MAC地址来进行转发/丢弃操作判断的,所以它并不会检测网络层的信息,也就意味着网桥根本不认识来自不同网络层协议的分组,所以无论是IPv4、IPv6还是AppleTalk等等分组,都可以无障碍穿越网桥。

网桥Bridge.

当一个帧到达网桥时,网桥需要对这个帧做出转发/丢弃的决策,而对于转发,它又需要知道转发到哪一个LAN上去。这一系列决策的依据,是网桥内部的一张地址表,它通过查表来决定是丢弃还是转发以及具体转发到哪个LAN. 这样一来问题就清晰了,we need that table!下面我们给出,网桥中地址表的构造细节:

  • 初始时,这张表设置为空;
  • 扩散算法(泛洪算法,flooding algorithm):当网桥查表发现不知道该转发到哪个LAN时,它就将这个帧向所有的LAN进行广播(需要除去帧来的那个LAN,因为在同一个LAN中的通信根本不需要网桥,所以网桥转发这个帧毫无意义,只是在浪费资源);
  • 逆向学习(backward learning):网桥在扫描到达帧时,能够获取到源主机的MAC地址,所以它会在自己的地址表中记下该MAC地址以及对应的LAN(通常是记录网桥连接这个LAN的端口号)。

上述机制看起来能够很好地运作,但实际上它还存在一些问题,比如说主机位置的更换导致它所属的LAN改变,总而言之,网络的拓扑结构是动态的,这就决定了仅有上述的静态构造机制是无法得出一张符合我们需求的地址表的。所以,我们对于网桥中的地址表,也需要加入动态机制:

  • 对于地址表中加入的每个记录,都必须打下时戳;
  • 到达帧的源MAC地址在表中已经有了记录,则更新其时戳为当前时间;
  • 网桥定期扫描自己的地址表,删去那些已经超时的记录。

????,这就是我们所用于连接多个LAN的网桥的地址表构造过程,拥有了这样的网桥,我们可以进行跨局域网的通信,当一个帧到达时,网桥启动如下的算法:

  1. 若源MAC地址和目的MAC地址相同,则丢弃该帧,原因前面我说过;
  2. 若表中查找到了目的MAC地址的记录,则将该帧从记录中的端口号转发至目的主机所在的LAN;
  3. 若表中没有目的MAC地址的记录,则网桥在所有的LAN上进行广播,但需要除去该帧来自的LAN,原因和第一条相同。

介绍了算法,我们给出一个例子,来看一个网桥工作的具体实例,实例中主机A向主机H发送一帧:
【计算机网络】Data-Link Layer (三)
【计算机网络】Data-Link Layer (三)
【计算机网络】Data-Link Layer (三)
【计算机网络】Data-Link Layer (三)
【计算机网络】Data-Link Layer (三)
最后一步中,Fh_h到达B1交换机(说了交换机和网桥不加区分),B1交换机查表发现A的记录,直接从b11_{11}端口进行转发。值得注意的是,我们说过局域网中为了共享信道、降低成本,采取的是广播策略,所以交换机中记录的是(host,LAN)的信息,它是将数据帧在目的主机的LAN上进行广播,从而目的主机接收信息,其他的主机由于知道目的MAC地址不是自己,予以忽略。我们可以发现,网桥/交换机是有一定智能的,它不会将一个数据帧朝着该帧来自的LAN发送,并且它由一定的学习能力,能够对于当前的网络结构有所记录,加快通信速度。这和我们在物理层介绍的中继器、集线器等设备有很大的区别,中继器、集线器很头铁,或者说很笨,只要是收到的数据,统统进行转发,哪管你是不是会发回数据的来源地,这就是物理层设备扩大冲突域的原因。相比之下,DLL设备能够隔离冲突域,是一大进步。

生成树协议.

在多个LAN的连接中,我们常常为了连接的可靠,会采用冗余结构,但这一好的初衷,也带来了一些问题:
【计算机网络】Data-Link Layer (三)
这些问题的出现都是因为冗余结构导致网络中出现了环路,广播风暴是因为连接两个相同LAN的两个不同网桥递归广播数据帧导致的,多帧传送是因为同一个数据帧可以有多条路径到达目的主机,最后的MAC地址库不稳定也就是说网桥中的地址表变动频繁,这一问题和广播风暴放在一起很容易理解。A网桥将收到的数据帧进行逆向学习并广播出去,B网桥做了同样的事,并且A网桥收到了B网桥广播出的数据帧,它迷惑了,怎么同一个帧可以从我的不同端口到达呢?从而A和B开始了它们漫长的递归广播、疯狂更新旅程。
想要解决这个问题,就需要消除逻辑上的回路。树结构是一种很好的选择,因为树是无回路的,这就是我们要说的生成树协议Spanning Tree Protocol.STP的思想如下图所示:
【计算机网络】Data-Link Layer (三)
STP通过"非指定端口不被使用"这一设定来破坏逻辑回路,之所以强调逻辑回路,是因为物理回路还是在那里的,总不能把物理回路也给切了。并且如果其中一个指定端口故障损坏了,那么非指定端口还是可以被启用,来实现连接的可靠性,这也是我们采用冗余结构的初衷。
【计算机网络】Data-Link Layer (三)

虚拟局域网VLAN.

【计算机网络】Physical Layer中的基础知识部分我们说过网络按其覆盖范围的划分,LAN就是这些分类中的一种。而VLAN是一种抽象的LAN,它不是根据地理范围来划分用户的,VLAN将逻辑上的一组用户或设备视作一个局域网的组成,使得局域网的构建更加灵活多变。VLAN的特性和普通的物理LAN没什么不同,它的特殊之处在于采用了帧标记法(最常用的是VLAN ID)。
帧标记法起什么作用呢?它使得VLAN中用户间的数据帧,能够正确通过网络中的干线,到达在物理上另一个LAN的VLAN用户。通俗地说,VLAN的帧标记法就是给这个VLAN内部的数据帧着色,虽然我们地处不同的物理LAN,但我们心在一起,非我族类,其心必异。对帧进行标记之后,网桥就能够将这些VLAN帧转发给正确的主机了。

DLL设备.

实际上前面我们已经介绍过了很多DLL的设备,例如网桥/交换机以及网卡。NIC(Network Interface Card)网卡为主机提供介质的访问功能,主机的MAC地址就烧在NIC的ROM中,每当主机启动时,MAC地址从ROM被拷贝到RAM中。下图中是NIC网卡的功能,以及这些功能的描述:
【计算机网络】Data-Link Layer (三)
【计算机网络】Data-Link Layer (三)
【计算机网络】Data-Link Layer (三)
网桥我们已经很熟悉了,它用于连接多个LAN,并完成不同LAN的主机间的通信任务。交换机和网桥没什么不同,我们可以认为他们是等价的。下图中是网桥的功能:
【计算机网络】Data-Link Layer (三)
对比着,我们也给出交换机的描述和功能:
【计算机网络】Data-Link Layer (三)
最后我们简述一下,网桥在进行数据帧转发时的具体策略,包括存储转发、直通交换以及无分片转发。
【计算机网络】Data-Link Layer (三)
首先是直通交换,从图中可以看出,这种交换方式只扫描到目的MAC地址就进行转发,牺牲差错检测来换取低时延;存储转发,顾名思义会对数据帧进行缓存,计算它有没有发生错误,它和直通交换相反,完整地进行差错检测,但代价是有三种转发方法中最高的时延;最后的无分片转发是前二者的折中,它会在读到该数据帧已经满了64字节时才进行转发,至于为什么是64个字节,我们在差错检测部分说过,可以看Data-Link Layer (二)。这样的做法过滤掉了一些非法短帧,而这些非法短帧往往是冲突的碎片帧,所以无分片转发就会过滤掉这些帧,并且又不会有很高的时延。