本文是学习《HCNP路由交换学习指南》的学习笔记。
二层交换机的主要功能
- 维护MAC地址表,MAC寻址
- 数据帧的转发及过滤
- 二层环路避免及冗余性支持
MAC地址
- MAC地址有48位,通常被表示为点分十六进制数
- MAC地址全球唯一,由IEEE对这些地址进行管理和分配
- 每个地址由两部分组成,分别是供应商代码和序列号,其中前24位二进制代表该供应商代码。剩下的24位由厂商自己分配。
MAC地址分类
MAC地址分为三类:单播MAC地址,组播MAC地址,广播MAC地址。
- 单播MAC地址用于唯一标识一台设备的某个接口,这种MAC地址第1个字节的最低比特位是0。
- 组播MAC地址标识了一组设备,这种设备MAC地址第1个字节的最低比特位是1。组播或广播的MAC地址不能作为数据帧的源MAC地址,而只能作为目的MAC地址。
- 广播MAC地址的所有比特位全是1。(因此广播MAC地址就是ffff-ffff-ffff)
MAC地址表
MAC地址表是交换机能够正常工作的重要依据,它相当于交换机保存的一张"地图"。MAC地址表最重要的作用是作为交换机进行数据帧转发的依据。
以太网数据帧格式
以太网帧的格式有两种标准:一个是IEEE802.3格式,另一个是Ethernet II格式。一般Ethernet II格式用的比较多。
- Ethernet II格式:
DMAC(目的MAC地址):目的MAC地址。字段长度6个字节,标识帧的接收者;
SMAC(源MAC地址):源MAC地址。字段长度6个字节,标识帧的发送者;
Type(类型):类型字段,字段长度2个字节,用于标识数据字段种包含的高层协议;比如0x0800代表 IP协议帧;
0x0806代表ARP协议帧;
Data(载荷数据):数据字段是网络层数据,最小长度必须为46字节;
CRC:循环冗余校验字段,提供了一种错误检测机制,字段长度为4个字节
- IEEE 802.3格式:
二层交换的工作原理
当交换机在某个接口上收到一个单播数据帧时,它将首先读取数据帧的目的MAC地址,并且在自己的MAC地址表中查询该地址,如果查询不到匹配的表项,则将该数据帧进行泛洪(Flooding),所谓泛洪是指将数据帧从除了收到该帧的接口之外的所有接口都发送一份拷贝。如果能够在MAC地址表中找到匹配的表项,并且收到该帧的接口与该表项中对应的接口不同时,则将数据帧从该表项中对应的接口转发出去;如果收到该帧的接口与该表项中对应的接口相同时,则丢弃该数据帧。
此外,当交换机收到一个数据帧时,它还会读取数据帧的源MAC地址,如果该地址在MAC地址表中并不存在相关表项,则交换机将创建一个MAC地址表项,并将该MAC地址及收到该数据帧的接口记录在该表项中,这就是交换机的MAC地址学习能力。
VLAN介绍
为什么需要VLAN
- 缺省时,整台交换机的所有端口均属于同一个广播域
- 当网络中的交换机数量特别多时,广播域将变得特别庞大,网络中可能充斥着大量广播
- 无法根据业务需求灵活的规划网络逻辑单元。
VLAN(Virtual Local Area NetWork,虚拟局域网),可以解决上面的问题。它能够将一个物理的LAN在逻辑上划分成多个广播域。
- 一个VLAN中所有设备都是在同一广播域内,不同的VLAN为不同的广播域。
- VLAN之间相互隔离,广播不能跨越VLAN传播,因此不同VLAN之间的设备一般无法互访,不同VLAN间需要通过三层设备实现相互通信
- 一个VLAN一般为一个逻辑子网,由被配置为此VLAN成员的设备组成
- VLAN中成员多基于交换机的端口分配,划分VLAN就是对交换机的接口划分
- VLAN工作于OSI参考模型的第二层
- VLAN是二层交换机的一个非常根本的工作机制
802.1Q Tag(VLAN帧格式)
IEEE 802.1Q标准对以太帧格式进行了修改,在源MAC地址字段和协议类型字段之间加入4字节的802.1Q Tag。802.1Q Tag也称为VLAN Tag,带有VLAN Tag的以太帧称为 VLAN帧。
- 标签协议标识符(Tag Protocol Indentifier,TPI):表示数据帧的类型,如果该字段值为0x8100,则表示该数据帧时802.1Q帧。
- 优先级(Priority,PRI):表示帧的类型。该字段主要用于QoS(Quality of Service,服务质量)。
- 标准格式指示符(Canonical Format Indicator,CFI):在以太网环境中,这个字段始终为0.
- VLAN ID:该数据帧所属的VLAN-ID。
二层接口类型
二层接口类型可以一般可以分成:Access类型、Trunk类型、Hybrid类型。
- 交换机的接口"接收帧":是指数据帧从外部到达交换机的接口,并进入到交换机内部的过程。
- 交换机的接口"发送帧":是指数据帧被交换机从其内部往接口外发送的过程。
在交换机内部,数据帧一般携带Tag。
Access Port
Access接口接收帧
- 如果该帧不带tag,则接收帧并打上端口的PVID
- 如果该帧携带tag,则当VLAN-ID与PVID相同时,接收该报文,否则丢弃。
Access接口发送帧
当Access接口发送数据帧时,交换机会将数据帧中的Tag剥除,然后再将数据帧从该接口发送出去,也就是说Access接口发送出去的数据帧一定是无标记帧。
Trunk Port
Trunk类型的接口可以接收或者发送多个VLAN的数据帧的接口。Trunk类型的接口多见于交换机之间互联的接口,当然,两台交换机之间互联的接口未必就一定得是Trunk接口。
Trunk接口接收帧
- 若数据帧不带tag,则打上接口PVID,此时若PVID在允许通过的VLAN列表里,则接收该帧,否则丢弃。在华为以太网交换机上,缺省时Trunk端口的PVID为1,而且VLAN1缺省就已经在allow-pass VLAN列表中了。
- 若数据帧带tag,且其VLAN-ID在接口允许通过的VLAN-ID列表里,则接收该帧,否则丢弃。
Trunk接口发送帧
- 若VLAN-ID与接口PVID相同,且该VLAN-ID在allow-pass VLAN列表中,则去掉Tag,发送数据帧。
- 若VLAN-ID与接口PVID不同,且该VLAN-ID在allow-pass VLAN列表中,则保持原有Tag,发送该带tag的数据帧(标记帧)。
端口的缺省ID(PVID)
- 每个Access、Trunk、Hybrid类型的端口都可以配置一个缺省VLAN(PVID:Port Default VLAN ID),表示端口所属的VLAN。
- 对于Access类型端口,PVID的数值表示当前端口所属的VLAN。
- 对于Trunk、Hybrid类型端口,由于Hybrid类型端口和Trunk类型端口允许多个VLAN数据帧通过,也可理解为这两种类型的端口属于多个VLAN,所以需要配置PVID。
- PVID,在缺省情况下为VLAN 1。
交换机对数据帧的处理过程
举例一
如下图所示,PC1和PC3划分在VLAN10,PC2和PC4划分在VLAN20。应该如何配置两台交换机,使得相同的VLAN内的PC能够实现通信?
分析过程:由于LSW1的GE0/0/1、GE0/0/2,以及LSW2的GE0/0/1、GE0/0/2连着PC,因此将以上端口配置为Access类型,并加入相应的VLAN。LSW1和LSW2的GE0/0/24接口由于需要承载多个VLAN的数据,因此将这两个端口配置为Trunck类型,并允许VLAN10和VLAN20通过。
具体通信过程:
PC1发送了一份数据帧给PC3,该数据帧被PC1发出时,是传统的以太网数据帧,也被称为无标记帧(Untagged Frame),主机的网卡通常只能发送和接收无标记帧。当这个数据帧到达LSW1后,由于LSW1的GE0/0/1接口已经加入VLAN10,并且是Access类型的。因此它知道该数据帧归属VLAN10,于是它将在数据帧头部内插入Tag,在该Tag的VLAN-ID字段中填写数据帧的起源VLAN的ID:10,如此一来这个数据帧就变成了一个标记帧(Tagged Frame)。
在交换机内部,为了区分不同VLAN的数据帧,数据帧都是以标记帧的形式存在,至于该帧被交换机从某个接口发出去后是否携带Tag,则要视情况而定。
接下来,交换机在其MAC地址表中查询数据帧的目的MAC地址(只查询与VLAN10关联的表项),最终它发现该数据帧要从GE0/0/24接口发送出去,而这个接口类型是Trunk口,它发现该数据帧携带Tag,并且该VLAN-ID在允许通过的VLAN列表中,因此,它将数据帧以标记帧的形式发送出去。
LSW2的GE0/0/24接口连接着干道链路,并且也是Trunk类型的,而且该VLAN-ID在允许通过的VLAN列表中。因此LSW2的GE0/0/24接口收到这个标记帧后,通过读取Tag中相应的字段,也就知道了这个数据帧所属的VLAN,因此在MAC地址表中查询该帧的目的MAC地址时,只在与VLAN10关联的表项中查询。最后发送给LSW2的GE0/0/1。LSW2的GE0/0/1将数据帧中的Tag移除,将数据帧还原成无标记帧发送给PC3。
举例二
如下图所示,交换机SW1和SW2各下挂着一台PC(PC1与PC2使用相同的IP网段),此外二者还通过GE0/0/24接口互联。SW1的GE0/0/1和GE0/0/24都被配置为Access类型,并且均加入了VLAN10,SW2的GE0/0/1和GE0/0/24也都被配置为Access类型,并且均加入了VLAN20。那PC1和PC2能进行二层通信吗?
答案是:PC1和PC2是可以进行通信的。
具体通信过程:
假设PC1发送了一个数据帧给PC2,这个数据帧从PC1的网卡发送出时显然是一个无标记帧,随后它进入SW1的GE0/0/1接口,被打上Tag, VLAN-ID为10,接下来交换机在MAC地址表中查询这个数据帧的目的MAC地址(只在关联到VLAN10的表项中查询),找到匹配表项后将数据帧从GE0/0/24接口发出,由于这个接口是Access类型,而且最重要的是这个接口也加入了VLAN10,因此数据帧的Tag被剥除然后再从该接口发出。接着SW2在GE0/0/24接口上收到这个数据帧,该帧进入交换机后被打上Tag,VLAN-ID为20,然后SW2在MAC地址表中查询数据帧的目的MAC地址(只在关联到VLAN20的表项中查询),找到匹配表项后将数据帧从GE0/0/1口发出,此时数据帧的Tag被剥除。最终,PC1发出来的数据帧是能够到达PC2的。
如果将上面做一下小改动,如下图所示,SW1及SW2的GE0/0/24接口均变成了Trunk类型,而且分别允许VLAN10和VLAN20的流量通过。那PC1和PC2还能通信吗?
答案是:经过这个改动后,PC1和PC2将无法互访。
分析过程:以PC1访问PC2的数据帧为例,这些数据帧会从SW1的GE0/0/24接口发出,由于是Trunk类型,且VLAN ID不是PVID,因此会携带VLAN10的Tag,也就是说,数据帧将以标记帧的形式在SW2的GE0/0/24接口上到达,而SW2的GE0/0/24却并未允许VLAN10的流量通过,因此数据帧被丢弃,即便是该接口允许VLAN10的流量通过,数据帧在进入SW2内部后(携带的VLAN-ID为10)也依然无法从GE0/0/1接口发出,因为GE0/0/1接口加入的是VLAN20。
VLAN间通信
一个VLAN即是一个广播域,相同的VLAN内的设备可以直接进行二层通信,而不同VLAN的设备无法进行二层通信。要实现VLAN之间的通信,需要借助三层设备(具备路由功能的设备),例如路由器,三层交换机等。
通过路由器实现VLAN之间的通信
要实现VLAN间的通信,最直接的想法是在网络中增加路由器来实现,因为路由器具备路由功能,能连接不同的广播域,实现数据的三层转发。如下图所示,交换机创建了两个VLAN:VLAN10和VLAN20,并将GE0/0/1接口加入VLAN10,将GE0/0/2加入VLAN20,所以PC1和PC2无法进行二层通信。现在网络中增加一个路由器,由于要连接两个广播域(VLAN),因此路由器需要两个物理接口与交换机对接。其中,GE0/0/0接口配置与PC1相同网段的IP地址,而GE0/0/1接口则配置与PC2相同网段的IP地址。交换机的GE0/0/23接口配置为Access接口并且加入VLAN10,GE0/0/24接口配置为Access接口并且加入VLAN20。通过以上配置,PC1和PC2就可以进行三层通信了。
但是上面有一个问题,一个VLAN就需要占用路由器的一个物理接口,那如果VLAN很多的话,就需要占用对应多的物理接口了。但是路由器的接口资源是非常宝贵的。所以上面的实现不太合理。
通过以太网子接口实现VLAN之间的通信
上面的问题可以用以太网子接口(Sub-Interface)解决。以太网子接口指的是基于以太网物理接口所创建的逻辑接口。子接口是软件的、逻辑的接口,是物理上并不存在的,它的状态又依赖对应的物理接口。可以在一个物理接口上创建多个子接口,每个子接口即可与一个VLAN对接,从而缓解上面的问题。在物理接口上创建子接口,就像是在一个大管道里开设许多小管道,这些小管道都依赖于大管道,并且彼此之间互不干扰。
路由器在一个物理接口上部署子接口从而实现多个VLAN互通的场景,也称为**“单臂路由”**。其中单臂指的是路由器的一个物理接口,或者一条物理链路。而当路由器使用多个物理接口,并且每个物理接口单独与某个VLAN对接的场景,则被称为"多臂路由"。
上面的单臂路由相比多臂路由,可扩展性更高、更经济。但是单臂路由也存在一定的短板。比如路由器与交换机之间的链路由于序承载所有VLAN间的通信数据,因此它的负载将变得非常高,尤其是当VLAN的数量特别多、VLAN间通信的流量特别大时,这段链路将变得不堪重负。另外,单臂链路也不具备冗余性,一旦链路发生故障,VLAN之间的通信也就无法再正常进行。
使用VLANIF实现VLAN之间的通信
第三种方法就是使用三层交换机(Layer 3 Switch)。三层交换机除了能够实现二层交换机所有功能,还支持路由功能。三层交换机除了拥有二层接口外,还有三层接口。VLANIF(VLAN Interface, VLAN接口)就是一种三层接口,这是一种逻辑接口,物理上并不存在。
下面是一个三层交换机的逻辑图。在三层交换机上创建了两个VLAN:10和20,同时为两个VLAN的vlanif分配了地址作为各自VLAN的用户网关,这样一来,这台交换机的路由表里就有了两个VLAN网段的路由。那么当两VLAN之间要互访时,VLAN10的用户将数据丢给自己的网关,也就是vlanif10,数据到了vlanif10之后,三层交换机查看数据包的目的地址IP并在路由表中进行匹配,发现目的地是VLAN20的所在网段,因此将数据从VLAN20扔出去,最终抵达目的地的VLAN20的PC。
参考文献:《HCNP路由交换学习指南》