tag报文结构是在源mac地址和目的mac地址之后,加上了4bytes的vlan信息,普通的PC网卡是不能识别 的。
Access端口只属于1个VLAN,一般用于连接计算机端口。
Trunk类型的端口可用于多VLAN通信。
Hybrid类型的端口允许多VLAN通过,可以接收发送多VLAN报文,可用于交换机与交换机的连接,也可用于交换机和计算机的连接。
Hybrid类型的端口和trunk端口在处理数据包时,方法是一样的。唯一不同之处在于发送数据包时,hybrid端口可以允许多个VLAN的数据包发送时不打标签,而truck端口只允许缺省vlan(native vlan或者default vlan)的数据包发送时不打标签。
Access端口只属于一个vlan, 所以它的缺省VLAN就是它所在的VLAN, 不用设置。hybrid 端口 和trunk端口属于多个VLAN, 所以需要设置缺省VLAN, 默认情况下,它们的缺省VLAN是VLAN 1.
如果设置了端口的缺省VLAN ID, 当端口接收到不带VLAN tag的数据包之后,则将数据包转发到缺省VLAN 所在的交换机端口;当端口发送带有VLAN tag的数据包时,如果该数据包的VLAN ID与端口缺省VLAN相同,则交换机将去掉数据包携带的VLAN tag, 然后转发到该端口。
华为交换机的缺省VLAN 被称为PVID, 思科交换机则称为Native VLAN.
交换机端口处理进出数据包过程如下:
Access 端口接收数据包:
收到一个数据包,判断是否有VLAN信息,如果没有则打上端口的Native VLAN ID, 并进行交换转发。
有人问了:如果有VLAN信息呢?一般情况下不应该将access端口与带有vlan的另一端口相连,因为access本来就是为接入普通计算机而设计的,而普通计算机的网卡发送数据包是不带vlan的。如果由于配置错误将其连到了对端trunk端口,或者现在有些计算机的网卡已经可以收发带有VLAN tag数据包,在这两种情况下,我的理解是,如果trunk端口发来的数据的VLAN ID与Access端口的native vlan相同,则交换机转发该数据包。如果trunk端口发来的数据包的VLAN ID与access端口的native vlan不同,则交换机丢弃该数据包。
Access 端口发送数据包:
将数据包的VLAN信息剥离,直接发送出去。
Trunk端口接收数据包:
收到一个数据包,判断是否有VLAN信息,如果没有则打上端口的Native VLAN ID,并进行交换转发。
如果有VLAN信息,则判断该trunk端口是否允许该VLAN的数据包进入,如果允许则转发,否则丢弃。
Trunk端口发送数据包:
比较端口的Native VLAN和发送数据包的VLAN信息,如果两者相等则剥离VLAN信息,然后发送。如果不相等,则直接发送。
Hybrid端口接收数据包:
收到一个数据包,判断是否有VLAN信息, 如果没有则打上端口的Native VLAN ID, 并进行交换转发。
如果有VLAN信息,则判断该hybrid端口是否允许该VLAN的数据包进入,如果允许则转发,否则丢弃。
Hybrid端口发送数据包:
判断该VLAN在本端口配置的属性,如果属性是untag, 则剥离VLAN tag再进行转发。如果属性是tag, 则直接发送。
有一点必须清楚,就是交换机内部在处理数据包时,所有的数据包一定是打上VLAN tag的,知道了这一点,那么交换机处理VLAN的具体过程就很容易理解了。
举例1:
两台交换机,一台端口配置trunk, native vlan为100, 另一台端口配置access, native vlan 为默认的1.
问: 连接到两台交换机的PC, 能互通吗? 为毛?
答案:通。 因为,trunk端口发出去的native vlan数据包中的vlan tag会被剥离,则另一交换机的access口收到的数据包是untag的,它当然能处理, 它收到后只在内部使用native vlan 1, 等一出交换机,由于是access端口,vlan tag就会被剥离掉,并送到trunk端口,而trunk端口再重新打上自己的native vlan 100进行转发。
这个例子说明,中继端口发送native vlan数据包时是剥离tag的,即使两个链路配置了不同的native vlan, 也能互通。但是这时交换机的console口一般会报错:“Mismatched Native VLAN". 呵呵,是不是很神奇?
本文转自 拾瓦兴阁 51CTO博客,原文链接:http://blog.51cto.com/ponyjia/1675328