下面的内容摘自一年多来一直热销不断的《Cisco/H3C交换机配置与管理完全手册》图书。    

  许多朋友对Cisco交换机中的Access和Trunk二层端口的报文收发规则的理解都只停留在表面,根本没有真正理解其本质,这样一来在遇到问题时就无法从原理上来进行故障分析和排除。下面先介绍笔者自己总结的Access和Trunk端口报文收\发规则,然后再通过一个故障排除示例加深大家对这两种二层端口的报文收发规则的理解。

   Access端口的报文收发规则如下:
   Access端口在收到一个报文(
Access
端口通常是从终端
PC
中接收报文
)后,先判断该报文中是否有VLAN标记信息:如果没有VLAN标记,则打上该Access端口的PVID后继续转发(
毕竟
Access
端口收到报文后是向其他端口发送的,可以识别带有
VLAN
标记的报文
);如果有VLAN标记(
这个报文肯定是来自其他非
Access
端口和终端
PC
,因为
Access
端口和终端
PC
网卡不会发送带
VLAN
标记的报文
),则默认直接丢弃。

   Access端口上发送报文时,会先将报文中的VLAN信息去掉(因为Access端口发送报文一般是到终端PCPC中的网卡是不能识别VLAN标记的。还有一种情况是发送到另一个同VLAN中的Access端口,因为Access端口也不接受带有VLAN标记的报文),然后再直接发送,所以Access端口发关出去的报文都是不带VLAN标记的。4-1是根据上面介绍的Access端口接收或发送报文规则而例举的示例(表中的VLAN 2VLAN 3只是其中的两个VLAN例,实际上可为其他任意已激活的VLAN)。

  Trunk端口的报文收发规则如下:
在Trunk端口上发送报文时,先会将要发送报文的VLAN标记与Trunk端口的PVID进行比较,
如果与
PVID
相等,则从报文中去掉VLAN
标记再发送;如果与PVID
不相等,则直接发送。这样一来,如果将交换机级连端口都设置为Trunk,并允许所有VLAN通过后,默认情况下除VLAN 1外的所有来自其他VLAN中的报文将直接发送(因为这些VLAN不是Trunk端口的默认VLAN),而作为Trunk端口默认VLAN的VLAN 1,则需要通过去掉报文中的VLAN信息后再发送。
   在Trunk端口收到一个报文时,会首先判断是否有VLAN信息:
如果没有
VLAN
标记,则打上该Trunk
端口的PVID
,视同该帧是来自PVID
所对应的VLAN
转发到PVID
所对应的VLAN
接口上;如果有VLAN
标记,判断该Trunk
端口是否允许该VLAN
的报文进入,如果允许则直接转发,否则丢弃
   表4-2是根据上面介绍的Trunk端口接收或发送报文规则而例举的示例(表中的VLAN 2、VLAN 3只是其中的两个VLAN例,实际上可为其他任意已激活的VLAN)。

   下面通过一个因PVID设置不当造成的网络故障的排除方法来加深对Access和Trunk端口数据收发规则的理解。图4-1中,SW1与R1之间,SW1和SW2之间的连接链路都是Trunk链路,允许网络中所有VLAN的数据通过。并设置SW1的f0/2 Trunk接口的PVID=1,SW2的f0/1 Trunk接口的PVID=2,PC2~5各自属于自己的VLAN,为Access端口。现只有PC2无法上网。

            图4-1 Access和Trunk端口收发规则解析示例

   这时我们首先分析一下PC2在上网时发送的数据帧流程:首先PC2是向所连接的Access端口发送不带VLAN标记的帧,所连的Access端口接收到这个帧后打开它所属的VLAN 2的标记转发到达SW2的f0/1 Trunk端口,经过比较发现所收到的数据帧的VLAN标记(2)与SW2的f0/1 Trunk端口的PVID(2)一样,所以此时SW2的f0/1 Trunk端口会为把这个数据帧去掉VLAN标记转发到SW1的f0/2 Trunk端口。此时因为SW1的f0/2 Trunk端口收到的数据包没有VLAN标记,则直接把它打上与SW1的f0/2 Trunk端口PVID(1)对应的VLAN 1标记,然后错误地把它转发到VLAN 1所对应的VLAN接口上,所以造成PC2不能上网。
   现在再来看一下其他几台机为什么能正常上网,以PC3为例。
   PC3连接的也是SW2上的一个Access端口,发送的帧也是不带标记的,所连的Access端口接收到这个帧后打开它所属的VLAN 3的标记转发到达SW2的f0/1 Trunk端口,经过比较发现所收到的数据帧的VLAN标记(3)与SW2的f0/1 Trunk端口的PVID不一样,所以此时SW2的f0/1 Trunk端口会为直接转发这个数据帧到SW1的f0/2 Trunk端口。SW1的f0/2 Trunk端口再比较自己的PVID(1)与所收到的数据帧VLAN 标记(3),发现不一样,直接转发,所以PC3是能上网。其他的PC4、PC5与PC3的数据发送流程是一样。
  从以上分析可以看出,造成PC2不能上网的根本原因就在于从访问端口发送的数据帧的VLAN标记与SW2的f0/1 Trunk端口的PVID(2)一样,所以造成转发后的数据帧是不带VLAN标记的,最后被SW1的f0/2 Trunk端口错误地把这些数据帧直接转发到了它所属的VLAN中,而不是正确地发到对应的VLAN中。这时如果把SW2的f0/1 Trunk端口的PVID设置成其他PC机在VLAN的VLAN ID,则对应的VLAN中的PC机就不能上网了。所以在这种情况下,只有把SW2的f0/1 Trunk端口的PVID设置不包括网络中PC机所在VLAN的VLAN ID(本示例中如设置为1)就可以确保各VLAN中的PC都可以上网。这样就可以得出这样一条经验:要确保网络中所有VLAN用户都能上网,则需要把Trunk端口的PVID设置成非上网用户所在VLAN的VLAN ID。