理论上,VLAN可以扩展到WAN上,但是,这是不明智的做法,因为VLAN允许广播包发送出去,而且它没有很好的路由算法,经常是以广播的形式转发数据包,这样,毫无疑问,极大地浪费了WAN的宝贵的带宽,所以说,将基于端口的,MAC地址和网络地址的VLAN扩展到WAN,是不合理的,而基于多播的VLAN概念则可以灵活有效的扩展到WAN。一般的以太网交换机实现的都是基于端口的VLAN,个别的会实现基于MAC地址和网络层地址的VLAN,而路由器中可以通过IGMP多播协议实现所谓的组播形式的VLAN 。

  802.1Q协议定义了基于端口的VLAN模型,这是使用得最多的一种方式。下面我们重点讲述一下交换机芯片是如何实现VLAN的,如果想了解更细节的内容,可以参考802.1Q协议,由于协议文本讲的非常抽象,所以,我们以TI公司的交换芯片为例来讲述,更便于理解。例子中的TNETX4090提供了8个100M以太网口和1个1G以太网口。

  如图1所示,每一个支持802.1Q协议的主机,在发送数据包时,都在原来的以太网桢头中的源地址后增加了一个4字节的802.1Q桢头,之后接原来以太网的长度或类型域,关于以太网桢头的封装格式,参见以太网方面的培训教材。
802.1Q VLAN协议和802.1P协议的实现_802.1q




  图1 带有802.1Q标签头的以太网桢
  这4个字节的802.1Q标签头包含了2个字节的标签协议标识(TPID--Tag Protocol Identifier,它的值是8100),和两个字节的标签控制信息(TCI--Tag Control Information),TPID是IEEE定义的新的类型,表明这是一个加了802.1Q标签的本文,图2显示了802.1Q标签头的详细内容。
802.1Q VLAN协议和802.1P协议的实现_vlan_02


  图2 802.1Q标签头
 
该标签头中的信息解释如下:
  LAN Identified( VLAN ID ): 这是一个12位的域,指明VLAN的ID,一共4096个,每个支持802.1Q协议的主机发送出来的数据包都会包含这个域,以指明自己属于哪一个VLAN,目前TNETX 3270只支持32个VLAN。

  Canonical Format Indicator( cfi ):这一位主要用于总线型的以太网与FDDI、令牌环网交换数据时的桢格式,TNETX 3270忽略此位。

  Priority:这3 位指明桢的优先级。一共有8种优先级,主要用于当交换机阻塞时,优先发送哪个数据包。TNETX 3270和TNETX 4090只支持一种优先级,所以这一位也没有用,

  不难看出,802.1Q标签头的4 个字节是新增加的,目前我们使用的计算机并不支持802.1Q,即我们计算机发送出去的数据包的以太网桢头还不包含这4个字节,同时也无法识别这4个字节,将来会有软件和硬件支持802.1Q协议的。 对于交换机来说,如果它所连接的以太网段的所有主机都能识别和发送这种带802.1Q标签头的数据包,那么我们把这种端口称为Tag Aware 端口;相反,如果该交换机端口说连接的以太网段有只要有一台主机不支持这种以太网桢头,那么交换机的这个端口我们称为Access端口,从目前的情况可以看出,所有的交换机的端口都属于后一种。

  那么,在现在的情况下,交换机是如何支持VLAN的呢?是这样的,比如交换机的1~4端口属于同一个VLAN,那么当 1 端口进来一个数据包是,交换机看到该数据包没有802.1Q标签头,那么,它会根据1号端口所属的VLAN组,自动给该数据包添加一个该VLAN的标签头,然后再将数据包交给数据库查询模块,数据库查询模块会根据数据包的目的地址和所属的VLAN进行路由,之后交给转发模块,转发模块看到这是一个包含标签头的数据包,而实际上发送的端口所连的以太网段的计算机不能识别这种数据包,所以,它会再将数据包进来是交换机给添加的标签头再去掉。如果计算机支持这种标签头,那么就不需要交换机添加或删除标签头了,至于到底是添加还是删除要看交换机所连的以太网段的主机是否识别这种数据包,即该交换机的端口是哪种类型的端口。当然,对于两个交换机互连的端口一般都是Tag Aware端口,这样,交换机和交换机之间交换数据包时是无须去掉标签头的。

  一般交换机的连接方式如图3所示
802.1Q VLAN协议和802.1P协议的实现_职场_03



  图3 多个交换机的组网图
  图中虚线是Tag Aware端口,实线是Access端口。

  以太网交换机处理数据包的流程如图4所示。
802.1Q VLAN协议和802.1P协议的实现_休闲_04



  图4 数据包处理流程
  处理流程包括3个步骤:
接收过程:该过程负责接收数据包,数据包可以是带标签头的,也可以不带标签头,如果不带,交换机会知道根据该端口所属的VLAN添加上相应的标签头。
查找/路由过程:该过程根据数据包的目的MAC地址、VLAN 标识已经数据库中注册的信息决定把数据包发送到哪个端口。
发送过程:将数据包发送到以太网段上,如果该网段的主机不能识别802.1Q标签头,那么就将该标签头去掉,如果是与其他交换机互连的端口,一般不去掉。
  具体的接收、查询和发送过程可以参考TNETX 3270的相关资料,下面是一个无标签头的数据包的接收到发送的过程。

802.1Q VLAN协议和802.1P协议的实现_休闲_05


  图5 一个无标签头的数据包的处理流程
  其中具体的路由过程参考TNETX 3270资料。图6 是另外的一个例子。
802.1Q VLAN协议和802.1P协议的实现_职场_06



  图6 一个互连的例子
  以图6为例,假如Chris 发送一个数据包给Jackie,那么,处理的过程如下:
Chris 发送一个数据包给Jackie。
  数据包到达交换机1的端口9,这是一个无标签头的包,所以交换机1 给该数据包添加一个VLAN ID。
  根据目的MAC地址和VLAN ID,查询数据库,知道该数据包需要发送到24(或25、26号端口,这3 个端口被捆绑到一起,对上层来说,这3 个端口就好象一个端口,实际上交换机会根据3 个端口的流量来决定是从哪个端口往外发送)。如果不知道,则该数据包还会被发送到端口6,当然,在发送到端口6 的以太网段时,会先将标签头去掉,Altaf收到后会丢弃这个数据包,因为目的地址不是它。由于端口24是Tag Aware端口,所以,发送到24 好端口的数据包的标签头不去掉。
  TNETX 4090交换机收到这个数据包后,根据VLANID和目的MAC 地址在它的数据库中查找路由,最后,它知道该数据包应该发送到端口4(5或6),标签头仍然不去掉。
  交换机2收到后,根据VLAN ID和目的MAC地址,在它的数据库中查找路由,知道该数据包需要发送到端口2。于是将该数据包发送出去。注意,发送出去的数据包需要去掉标签头。

  以上我们讨论了VLAN收发数据包的过程,它的具体实现已经由以太网交换机的交换芯片实现了,有兴趣者可参考交换芯片的技术资料。
  
  二、802.1P协议

  802.1p协议定义了优先级的概念,对于那些实时性要求很高的数据包,主机在发送时就在前面提到MAC桢头增加的3位优先级中指明该数据包优先级高,这样,当以太网交换机数据流量比较多时,它就会考虑优先转发这些优先级高的数据包。

  目前部分以太网交换机所采用的交换芯片只支持2种优先级,也有一些能支持4个优先级。

  802.1p协议还定义了GARP--Generic Attribute Registration Protocol。这里的Attribute是指组播MAC地址、端口过滤模式和VLAN等属性,GARP协议实际上可以定义很多交换机应该具有的特性,目前,它定义了GMRP--GARP Multicast Registration Protocol和GVRP--GARP VLAN Registration Protocol两个协议,以后会根据网络发展的需要定义其他的特性。GARP定义了以太网交换机之间交换这些特性信息的方法,如何发送数据包,接收的数据包如何处理等等。

  GMRP协议是一个动态二层组播注册协议,它的很多方面跟IGMP(三层组播协议)类似,对于IP地址来说,D类IP地址是组播地址,实际上,对于每一个IP组播地址,都有一个组播MAC地址跟它对应,802.1p协议就是根据组播MAC地址来在以太网交换机上注册和取消组播成员身份的,而IGMP是根据组播IP来管理的。当然,如果以太网交换机没有实现GMRP协议,那么就只能通过静态配置来实现组播了。

  关于为什么需要二层组播协议?我们在详细讨论一下。与协议IGMP一样,如果我们在自己的局域网内成立一个组播组,可能我们的局域网包含了很多交换机,如果这些交换机没有实现二层组播协议的话,那么,某个组员给其他组员发送数据包时,交换机就会将该数据包向所有的端口广播,因为交换机不知道哪个端口有人加入了该组播组,唯一的解决办法就是管理员配置交换机,这样,才能将这种广播转发数据包的发送方式限制住,而组播本身是动态的,所以,通过这种靠管理员的配置来实现组播的方式是不现实的。因此,就需要有一个二层组播协议来动态管理组员。这就是为什么需要二层组播协议的原因,目前,许多高档的交换机都把实现802.1p和802.1Q协议作为一个主要的性能指标。

  GVRP是VLAN协议,由于它与GMRP都是基于GARP之上的,所以它们之间的关系很紧密,它们都要对交换机的数据库进行操作,这个协议的具体定义在802.1Q中。