专业的网络工程师在进行网络设计时,会事先规划好不同业务数据的转发路径,一方面是为了满足用户应用需求,另一方面是为了提高数据转发效率、充分利用各设备/各链路的硬件或带宽资源。在进行网络故障排除时,理顺各路数据的转发路径也是精准、高效排除故障的最基本前提。这些路径的实现是基于网络通信原理通过网络设备配置实现的,所以理解数据通信原理,是作为一个合格网络工程师必备的基础和前提。
数据在网络中如何转发受到许多因素影响,在不同网络中有不同的转发技术。如在同一个IP网段中,采用的是基于MAC地址表的数据转发技术;在跨网段的IP网络中,最常见的是IP路由转发,即根据IP数据包携带的目的IP地址,按照对应的IP路由表项一跳一跳地进行转发;在MPLS网络中,则又是根据MPLS报文中携带的外层MPLS标签进行转发。但这也只是最基本的转发原理,数据是否可以按照原路径进行转发,还可能受一些策略影响,如报文过滤策略、路由策略、策略路由、MPLS隧道策略等。所以,事实上,在一些比较大型的网络中,数据转发路径的确定不是想象的那么容易,可能要考虑前面所说的多方面因素。本文先介绍同一IP网段基于MAC地址表的数据转发原理,即通常所说的“二层交换原理”。
同一IP网段俗称二层交换网络,在此仅以最常见的以太交换网络为例进行介绍。在二层以太交换网中,数据转发的依据是帧头中的“目的MAC地址”字段中的值和在交换机上建立的MAC地址表进行的。MAC地址表可以看成是二层以太网的数据转发表,可以手动创建(生成静态MAC地址表),也可由交换机通过对进入交换机的数据帧中帧头的“源MAC地址”字段和“VLAN Tag”字段(仅VLAN网络中存在)的学习动态创建(生成动态MAC地址表)。静态MAC地址表项除非人为删除,否则永久有效,而动态创建的MAC地、址表项是有生存周期的,即是可以被老化的,老化后即删除。在此仅介绍动态MAC地址表的创建和指导数据帧的转发原理。
在MAC地址表中最主要的三个字段是“MAC地址”、“VLAN ID”(仅VLAN网络中存在)和“入接口”字段,它们之间形成一个映射关系。“MAC地址”和“VLAN ID”字段分别是通过学习所接收的帧中的“源MAC地址”和“VLAN Tag”两字段的值得到的,而“入接口”字段是本交换接收数据帧的接口,建立的是源设备的动态MAC地址表项。“MAC地址”字段是用来作为帧接收设备,向源设备发送的数据帧头部的“目的MAC地址”,“VLAN ID”字段代表帧所属的VLAN,“入接口”字段用来确定源帧接收设备向源设备发送的数据帧,到达本地交换机后的出接口,即确定了数据帧在本地交换机上的转发路径。在初始状态下,交换机没有为任何外部设备建立动态的MAC地址表项。在此先介绍非VLAN场景下的二层交换原理,下集课程再介绍VLAN帧的交换原理。
在非VLAN场景下,二层交换设备收到以太网帧后,根据以太网帧中帧头的“目的MAC地址”字段去查找本地MAC地址表,如果没有找到匹配表项,或者目的MAC地址是广播MAC地址(48位全为1的MAC地址),则向除帧入接口外的所有接口转发;如果能够找到匹配表项,则向该MAC地址表项中对应的接口转发。
【说明】二层交换设备虽然能够隔离冲突域,但是它并不能有效的划分广播域。因为从前面介绍的二层交换原理可以看出,广播报文以及目的MAC地址查找失败的报文会向除报文的入接口之外的其它所有接口转发,当网络中的主机数量增多时,这种情况会消耗大量的网络带宽,并且在安全性方面也带来一系列问题。当然,通过路由器来隔离广播域是一个办法,但是由于路由器的高成本以及转发性能低的特点使得这一方法应用有限。基于这些情况,二层交换中出现了VLAN技术,具体将在下集课程中进行介绍。
在图1所示的非VLAN网络中,PC A、PC B和PC C三台主机网卡的MAC地址分别为MAC A、MAC B和MAC C。现假设,在初始状态下,PC A要访问PC C(假设PCA已获取了PC C的MAC地址,具体获取原理本文后面介绍)。
图1
(1)根据前面课程的介绍,数据帧在发送前要进行帧封装,以PC C的MAC地址MAC C作为目的MAC地址,自己的MAC地址MAC A作为源MAC地址,参见1。
(2)当交换机收到PC A访问PC C的数据帧时会会学习帧中的“源MAC地址”MAC A,然后与接收该帧的接口Port 1建立映射关系,生成基于源主机PC A的MAC地址表项,如图2所示。
图2
(3)由于交换机上原来并没有基于PC C的MAC地址表项,不能确定从哪个接口转发到达PC C的数据帧,所以会向除入接口Port 1外的其它所有接口(如Port 2和Port 3)进行泛洪转发(类似广播转发方式),如图3所示。
图3
【说明】“泛洪”其实是一种复制转发方式,就是从除入接口外的各个接口上发送一个帧副本,帧头中的“目的MAC地址”保持不变,且不是广播MAC地址。而“广播”(这里仅是二层广播)是帧头中的“目的MAC地址”是广播MAC地址。
(4)当PC C收到该帧后,发现帧中的“目的MAC地址”与自己的MAC地址一致,于是确定该帧是发给自己的,所以接收该帧,然后对源设备PC A进行响应。响应帧中的“源MAC地址”是PC C的MAC地址MAC C,目的MAC地址是PC A的MAC地址MAC A,如图4所示。
图4
(5)当交换机收到PC C发给PC A的响应帧后,同样会学习帧中的“源MAC地址”字段值MAC C,然后与接收该帧的接口Port 3建立映射,生成基于PC C的MAC地址表项,如图5所示。然后根据帧中的“目的MAC地址”MAC A在本地MAC地址表中进行查找。因为在交换机上原来已建立了基于PC A的MAC地址表项,所以可以查找到匹配的MAC地址表项,然后根据所映射的出接口Port 1把PC C发给PC A的响应帧发给PC A,如图6所示。
图5
图6
在这里再回到前面的问题,就是PC A如何知道目的主机PC C的MAC地址呢?其实这里要分两种情况的。通过前面课程的学习已知道,帧的封装是在数据链路层进行的,其中的数据部分可以是本地链路层自身的协议报文,通常是由二层交换机自己产生的(如STP BPDU),也可以是来自上层——网络层(或者以太网协议的更高子层),而来自网络层的数据包又可以是网络层自身产生的协议报文,也可以来自上面传输层,甚至应用层的用户数据报文,通常是由主机类设备产生的。二层交换可通过LLDP(Link Layer Discovery Protocol,链路层发现协议)之类的二层协议报文交互进行MAC地址学习,LLDP报文中的目的MAC地址固定为0x0180-C200-000E。如果是三层或以上层设备发送的协议或数据报文,则是采用ARP通过目的IP地址解析对应的目的MAC地址。有关ARP的工作原理将在后面的课程中介绍。