4.4 基于VLAN的转发与路由 Vlan内通信的主机同属一个广播域,主机之间的流量通过二层网络直接转发;Vlan间通信的主机位于不同广播域,主机无法直接通过ARP广播请求到对方的地址,此时必须借助三层路由器来完成通信。 路由器可视为各个Vlan的网关,因此通过路由器来互相通信的主机必须知道路由器的存在及其在本Vlan上的接口地址(默认网关)。在主机上配置默认网关后,对于跨Vlan的通信,主机会自动寻找默认网关,并把报文交给默认网关转发而不是直接发给目的主机。 可见,当报文的目的MAC地址是网关地址(路由器或三层交换机MAC地址)时,该报文为三层报文。 4.4.1 二层转发 基于Vlan的二层转发流程主要包括:确定和查找Vlan、查找和学习源MAC、查找目的MAC并转发数据帧。 1) 确定和查找Vlan:交换机端口接收到一个数据帧时,首先通过TPID值判断该帧是否带标签[1]。 - 若是tagged帧,且Vid≠0,则在端口所属的Vlan表中查找该帧标签中的Vid是否存在,若存在,则进入下一步,否则丢弃该帧(或提交CPU处理);
- 若是tagged帧,且Vid=0(即priority帧[2]),则对该帧附加端口PVid使之成为tagged帧;
- 若是untagged帧,则对该帧附加端口PVid并指定优先级使之成为tagged帧。
注:①为提高处理效率,交换机内部所有数据帧均携带Vlan标签,以统一方式处理。故需对输入交换机的数据帧进行标签检查并按需加上标签。 ②802.1Q Vlan环境下,帧可分为tagged、untagged和priority-tagged三种。Tagged帧根据其携带的标签Vid进行MAC学习转发。Untagged和Priority-tagged帧进入交换机端口后根据PVid进行MAC学习转发。 2) 查找和学习源MAC:交换机在MAC转发表(Mac+Vid+Port)中查找收帧Vid对应的源MAC表项,未找到则学习收帧源MAC (将“源MAC+Vid+Port”添加到MAC表中);若找到则更新该表项的老化时间。 注:MAC地址学习只学习单播地址,对于广播和组播地址不进行学习。组播MAC表项通过CPU配置建立。 3) 查找目的MAC:若目的MAC是广播或组播,则在所属的Vlan中广播或组播;否则在MAC表中查找是否存在Vid对应的目的MAC表项。 4) 转发数据帧:若在MAC表中查找到完全匹配的DMAC+Vid表项,则将该帧转发到表项中的相应端口(若相应端口为收帧端口,则应丢弃该帧);否则向所属Vlan内除收包端口外的其他所有端口洪泛该帧(洪泛广播的是未知单播帧而不是广播帧)。 图13所示为二层转发的一般流程。 图13 二层转发流程 【例】数据帧从PC1经过一台交换机转发到与另一台交换机相连的PC2并得到响应,如下图所示。 图14 PC1向PC2发送信息 假设两台交换机刚刚开机(此时MAC地址表为空),其具体的转发过程如下: ①PC1发出的数据帧进入交换机SW1的Access端口后,按照端口PVid加上Vid=100的标签。交换机将该帧源MAC地址存入MAC地址表(学习),并将该帧洪泛到Vid=100的所有端口(除入端口外); ②SW1的Trunk端口属于Vid=100的Vlan,故接受这个标记为100的Tagged数据帧;而该端口在Vid=100上为Tagged port,因此在发送数据帧出交换机SW1时,不改变Tagged帧的结构; ③Tagged帧到达交换机SW2的Trunk端口,由于Trunk端口拥有VID=100的Vlan,故接受该帧;该Trunk端口不改变Tagged帧的结构,而是学习源MAC地址后把该数据帧洪泛给所有Vid=100的端口(除入端口外); ④SW2的Access端口接收到该帧,剥除该帧的Tag标签后发送给PC2。 ⑤PC2收到PC1发送的数据帧,并发送响应帧给PC1。 ⑥经过与前述过程类似的转发,响应帧到达交换机SW1。交换机发现该帧的目的MAC地址已在MAC地址表中,则仅转发给PC1。 可见,收发双方同属一个Vlan的通信,一切处理均在二层网络内完成。 4.4.2 三层路由4.4.2.1 路由器路由 使用路由器进行Vlan间路由时,大致有以下两种: 1) 用多个路由器端口分别与每个Vlan相连接。 2) 单个路由器接口与交换机的Trunk端口相连(称为dot1Q连接),使多个Vlan共享同一条物理连接到路由器。 方式1将交换机上用于和路由器互联的每个端口设为接入链路,再分别用网线与路由器上的独立端口互联。如下图所示,交换机上有两个Vlan,需在交换机上预留两个端口用于与路由器互联;路由器上同样需要有两个端口;两者之间用两条网线分别连接。 图15 每个Vlan一个物理连接 如图,每个Vlan都要独占一个交换机端口和一个路由器端口,并需重新布设一条网线。而路由器上通常LAN接口有限,这无疑带来扩展性问题。 方式2将用于连接路由器的交换机端口设为汇聚端口,而路由器上的端口也必须支持汇聚链路。双方用于汇聚链路的协议也必须相同。接着在路由器上定义对应各Vlan的“子接口(Sub Interface)”。尽管实际与交换机连接的物理端口只有一个,但在理论上可将其分割为多个虚拟端口。如下图所示。 图16 Vlan Trunking 使用这种Vlan Trunking技术,可使多个Vlan的业务流共享相同的物理连接,通过在汇聚链路上传递带标签的帧来区分各Vlan的流量。通常情况下,Vlan间路由的流量不足以达到链路的线速度,使用Vlan Trunking的配置,可提高链路的带宽利用率,节省端口资源以及简化管理(网络新增Vlan时只需在路由器上新设一个对应新Vlan的子接口,无需重新布线) 【例】不同Vlan间通信时数据的流程,如下图所示。 图17 不同Vlan间通信流程 主机PC1通过通信目标IP地址(192.168.2.1) 与子网掩码计算比较发现PC2与本机不属于同一网段,不能直接访问。根据IP通信规则,PC1查找本机路由表寻找相应的网关。在实际网络中,主机通常只配置默认网关(Default Gateway,GW),故PC1找到默认网关。然后,PC1在本机ARP高速缓存中查找默认网关(即路由器)的MAC地址,若没有则向外广播发送一个ARP请求帧,其目的MAC地址为全1,源MAC地址为本机MAC地址,请求的IP地址为网关192.168.1.100。从路由器返回的ARP单播应答帧中得到路由器MAC地址R后,接下来就按图中所示的步骤向PC2发送数据帧①,其目的MAC地址是路由器地址R、但目的IP地址仍是最终要通信的对象PC2的地址。 交换机在端口1上收到数据帧①后,检索MAC地址表中与端口1同属一个Vlan的表项。汇聚链路被视为属于所有的Vlan,因此端口6也属于检索对象。检索后交换机得知往MAC地址R发送数据帧时,需经过端口6转发。 从汇聚端口6发送数据帧时,会附加Vlan识别信息。图中数据帧②被加上原属的红色Vlan标签后,进入汇聚链路。路由器收到数据帧②后,确认其Vlan标签,交由负责红色Vlan的子接口接收。 接着,根据路由器内部的路由表,判断该向哪里转发。由于目标网络192.168.2.0/24属于蓝色Vlan,且该网络通过子接口与路由器直连,因此只需从负责蓝色Vlan的子接口转发即可。此时数据帧的目的MAC地址被改成PC2的MAC地址;由于需要经过汇聚链路转发,故附加属于蓝色Vlan的识别信息(数据帧③)。 交换机收到数据帧③后,根据Vlan标签从MAC地址表中检索属于蓝色Vlan的表项。由于通信目标PC2连接在端口3上且该端口为接入端口,因此交换机剥除数据帧的Vlan标签后(数据帧④)转发给端口3,最终PC2成功收到PC1发来的数据帧。 可见,Vlan间通信时,即使双方都连接在同一台交换机上,也必须经过“发送方→交换机→路由器→交换机→接收方”这样一个流程。在进行三层路由转发时,数据包IP地址保持不变,MAC地址则在每个节点都会改变。 4.4.2.2 三层交换机路由 使用VLAN Trunking后,用传统路由器进行Vlan间路由在性能上存在一定的不足:由于路由器采用通用CPU,转发完全依靠软件处理,同时支持各种通信接口,给软件带来较大负担。软件要处理包括报文接收、校验、查找路由、选项处理、报文分片等,导致性能不可能很高。就Vlan间路由而言,流量会集中到路由器和交换机互联的汇聚链路部分,该部分容易成为速度瓶颈。 由于Vlan间通信比较简单,只需查下路由表,所以可将交换机集成查路由表的专用芯片(ASIC),实现二层交换和三层路由的功能集成,即三层交换机(Layer 3 Switch)。 三层交换机的设计基于对IP路由的仔细分析,提取出IP路由中每个报文都必经的简化过程: - IP路由中绝大多数报文不包含IP选项,因此多数情况下无需处理报文IP选项;
- 不同的网络报文长度不同,为支持各种异构网络的互连,IP实现了报文分片功能,但在全以太网环境中,数据帧(报文)长度固定,因此可裁减报文分片功能;
- 三层交换机采用与路由器最长地址掩码匹配不同的方法,使用精确地址匹配的方式处理,有利于硬件实现快速查找;
- 三层交换机采用Cache方法,将最近经常使用的主机路由放入硬件查找表。只有在该Cache中无法匹配到的条项才通过软件转发。这样,只有每个流的第一个报文通过软件转发,其后的大量数据流则在硬件中得以完成,极大提升转发性能。
三层交换机的内部结构可参照下面的简图。 图18 三层交换机内部结构简图 如图,内置的路由模块与交换模块相同,使用ASIC硬件处理路由。因此,与传统的路由器相比,可实现高速路由。并且,路由与交换模块由内部汇聚链路连接,可确保相当大的带宽。 对应到IP网络模型中,每个Vlan对应一个IP网段,三层交换机中的三层转发引擎在各网段(Vlan)间转发报文,实现Vlan之间的互通,因此三层交换机的路由功能通常叫做Vlan间路由(Inter-VLAN Routing)。 使用路由器连接时,一般需要在LAN接口上设置对应各Vlan的子接口;三层交换机则是在内部生成“VLAN接口(VLAN Interface)”,用于各Vlan收发数据。在Cisco的Catalyst系列交换机上,VLAN接口被称为SVI(Switched Virtual Interface,交换虚拟接口)。三层交换机每创建一个Vlan就会自动生成一个SVI。在SVI接口设置默认网关后,并将主机网关配置成与交换机SVI相同,即可实现不同Vlan间的路由。 使用三层交换机进行Vlan间路由与使用汇聚链路连接路由器与交换机相似,即需经过“发送方→交换模块→路由模块→交换模块→接收方”的流程。 【例】假设网络按图19连接好后,所有设备均为初始状态,也未向外发送过任何报文。若PC1已知PC2的IP地址,则可通过ping命令发送ICMP报文来获知PC1能否到达PC2。以下分析该过程。 图19 ping流程网络拓扑 ⑴ PC1将自身IP和子网掩码255.255.255.0相与得到网络号1.1.1.0,将PC2的IP与子网掩码相与得到网络号2.2.2.0,得知PC2与自己不在同一网段。于是PC1检索路由表得到默认网关。PC1欲向网关传递信息,但此时PC1中ARP表为空,所以向默认网关(交换机三层接口)发出ARP请求帧,请求网关MAC地址。该帧目的MAC地址为全1,源MAC地址为本机MAC地址,请求的IP地址为网关1.1.1.1; ⑵ SW收到ARP请求帧,对其附加端口PVid(10)的标签; ⑶ SW用ARP请求帧的Mac1和Vid10查找MAC转发表,发现没有该项,则进行学习,即在表中添加“Mac1—Vid10—Port1”的记录;并将源IP和MAC的对应关系(“1.1.1.2—Mac1”)记录到ARP表,表明目的IP为1.1.1.2的数据帧转发时目的MAC为Mac1,同时需路由到端口Port1; ⑷ ARP请求的目的地址是广播地址,SW将其洪泛到该Vlan的每个端口(除入端口);同时SW自身截获一份上送CPU(网关),发现是询问自己的MAC,于是回复ARP单播应答帧,目的MAC为PC1的Mac1,源MAC为网关的MAC地址GwMac1,源IP为1.1.1.1,目的IP为PC1的1.1.1.2; ⑸ PC1收到SW发来的ARP应答帧,得到SW三层网关MAC地址,将“1.1.1.1—GwMac1”记录到ARP表。PC1向SW发送ICMP请求帧,目的IP为PC2的IP(2.2.2.2),目的MAC为网关MAC,源IP和源MAC为PC1的; ⑹ SW收到ICMP请求帧,对其附加端口PVid(10)的标签,然后进行源MAC地址学习,发现二层转发表有该条目,更新老化时间。因该帧目的MAC地址是网关,SW送交三层路由处理。 ⑺ 在三层首先检查IP报文的版本、IP首部检验和TTL是否正确,若不正确则标记丢弃并交由CPU处理;正确则在三层主机路由表(又称L3表)中查找目的IP(即PC2的IP 2.2.2.2)。此时L3表中只包含与自己直连的32位地址(包括自身接口)及步骤⑶中ARP表学习后下发的PC1信息,而找不到PC2的信息。进而按最长前缀匹配算法查找子网路由表(又称Longest Prefix Match即LPM表)得到2.2.2.1目的网段的条目,下一跳的IP地址为 2.2.2.1; ⑻ 索引回L3表查找2.2.2.1,得到该条目,发现要提交CPU处理(CPU也需要看作是一个端口); ⑼ CPU没有到PC2的路由,但PC2的目的IP属于自己接口地址2.2.2.1的网段,故向接口Vlan20所包含的所有物理端口广播一个ARP请求帧,源MAC地址为交换机接口的三层MAC地址GwMac2,源IP地址为2.2.2.1,请求IP地址2.2.2.2的MAC地址; ⑽ PC2收到ARP请求,学习“2.2.2.1—GwMac2”加入ARP表;并回复ARP应答帧,目的IP为交换机接口Vlan20的IP地址2.2.2.1,目的MAC为交换机接口Vlan20的MAC地址GwMac2; ⑾ SW收到PC2发送的ARP应答帧,附加端口PVid(20)后在MAC表中查找“Mac2+Vid20”,没找到则学习源地址,在MAC转发表中添加PC2相关记录。因该帧目的MAC为网关地址,故提交三层处理; ⑿ 三层首先检查报文正确性,无误则在L3表中查找目的IP。由于目的IP为本机,故上送CPU处理。CPU对报文处理后得到“2.2.2.2—Mac2”将相关信息加入ARP表(CPU下发给L3表进行记录)。 ⒀ PC1向SW发送的第一个ICMP请求帧存储在内存中,此时交由CPU进行IP报文头部修改(TTL减1,FCS重新计算封装)和MAC封装(目的MAC地址改为PC2的MAC地址,源MAC地址改为SW三层MAC地址)并发送给PC2,如果超时则丢弃,CPU发送ICMP超时给PC1; ⒁ PC2收到PC1发来的ICMP请求后,回复ICMP应答帧,目的IP为PC1的IP 1.1.1.2,同样PC2发现该地址和自己不在同一子网,需要网关进行转发。之前PC2已学习到交换机接口Vlan20的ARP,此时根据该ARP将ICMP应答帧目的MAC地址填为网关MAC地址GwMac2发送出去。交换机收到帧后,发现目的MAC地址是网关地址,取出帧中的目的IP地址1.1.1.1查找路由。之前交换机已学习到该IP的路由,所以会查找到主机路由表中相应的路由并将帧目的MAC地址换成Mac1,源MAC地址换成网关MAC地址GwMac2,发送到端口Port1上。最终,PC1就收到PC2的ICMP应答。 ⒂ 经过以上流程后,PC1和PC2分别学到各自网关接口的ARP,交换机也有了分别到达PC1和PC2的路由。后续的报文不再通过路由,而直接由L3表中对应的表项进行硬件转发。 注意,此例步骤说明相比“路由器路由”一节稍为详细,所补充的部分并非差异。
|