SW2-e0/1-------access------pc2(192.168.1.2),e0/2-----access----pc3(192.168.1.3)
上面的拓扑是L2层之间vlan通信问题,两台2层交换机SW1、SW2分别连接了PC1-3三台主机,三台主机都是一个网段的。在sw1中配置了vlan2,vlan3并将连接pc1的e0/1接口划分到vlan2中,在sw2中配置了vlan2,vlan3并将连接pc2的e0/1接口划分到vlan2中,将连接pc3的e0/2接口划分到vlan3中。sw1与sw2通过access模式连接,并且sw1的e0/0口在自己的vlan2中,而sw2的e0/0口在自己的vlan3中。
此时pc1分别去发送数据给pc2、pc3,使用ping的结果是:1、在sw1和sw2没有配置vlan前全部互通
2、在完成上述拓扑后,pc1与pc3可以通信,而pc1与pc2无法通信。下面看一下数据转发过程:
首先、pc1发送一个数据包给pc3,第一个包L2目的mac没有封装失败,启动arp封装OK发出去,到达了sw1的e0/1口,sw1查看e0/1属于vlan2的,所以pc1发来的arp-request就被标记成vlan2,sw1记录完PC1的MAC到vlan和e0/1后查看vlan2对应的CAM表,没有找到pc3的目的mac,那就在vlan2里面flood,连接sw2的e0/0也是vlan2的收到flood的arp包后发给了sw2,整个发送过程没有修改过arp数据包的L2层吧,从e0/0出去的arp包还是一个以太网标准格式的包,传到sw2后,sw2先记录pc1的mac地址到CAM里面(对应vlan3和e0/0口),然后查看arp包中的目的MAC地址,由于是从自己的e0/0收到的,sw2查看了e0/0属于vlan3,所以应该是查看vlan3对应的CAM表,一看目的vlan3对应的CAM表中有arp包要给的目的MAC地址,是pc3的(因为pc3也是vlan3的,所以vlan3对应的CAM是可以学到pc3的MAC地址的,而学不到pc2的MAC地址),那么就把这个包通过e0/2口转发给了pc3,pc3记录pc1的arp表项后给pc1回复arp-reply相应,完成了pc1与pc3的通信。
因为pc2在sw2自己的vlan2中,所以sw2在转发的时候不会把自己vlan3的数据包flood或者单播到自己vlan2里面去的,所以pc2无法收到pc1发来的数据包。
但是如何让sw1的vlan2与sw2的vlan2通信呢:1、sw1连接sw2的口和sw2连接sw1的口都划分到vlan2中
2、让sw1与sw2相连的网线可以承载多个vlan信息,达到不同设备中的同一vlan相互通信,不同vlan不能通信的目的
第一种方法不可取的原因在于,如果有20以上的vlan,那么交换机端口不够用。
第二种方法是目前所使用的方法trunk(干道)技术,用于一根物理介质上(实际上是交换机端口,因为交换机看vlan信息只看流量进入的端口做确认,和网线、终端半毛钱关系都没有)承载多个vlan信息。
1、cisco交换机端口分类:分为二层端口和三层端口以及虚拟端口,其中二层端口又分为一下三个类型:
access类型:默认只能属于一个vlan
trunk类型:承载多个vlan信息,使用ISL协议或802.1Q协议来封装数据帧达到对多vlan的区分(协议见图)
QinQ类型:dot1q in dot1q ,double vlan技术是指将用户私网VLAN标签封装在公网VLAN标签中,使报文带着两层VLAN标签穿 越运营商的骨干网络,在公网中只根据外层VLAN标签传播,私网VLAN标签被屏蔽
trunk中的ISL协议:此协议是cisco私有,封装后原本的以太网帧加了30byte,大小可想而知!封装费劲转发慢
trunk中的802.1q协议:公有的,所有厂商的都支持。
OK,可以看到两个协议封装方式完全不同,ISL采用加头部的封装方式,802.1q采用中间插入tag位(2个都有尾部的FCS),但是802.1q所插入的tag一共是3Byte,而ISL是30Byte,相差10倍,封装速率和解封装速率可想而知,而且支持的vlan数量也是802.1q的多。(一半都采用802.1q协议来封装trunk)
这样交换机的互联的接口都被配置成trunk后就可以在一根网线中承载多个vlan信息了,交换机会根据封装的vlan ID信息区分vlan的编号。
这里有个区别:ISL协议,将所有的vlan都打上标记,没有特殊。
802.1q协议,将除了vlan1以外的vlan都打上标记,特殊vlan1不打标记(还是标准以太网帧)。
这个是ISL和802.1q最大的区别。在802.1q中vlan1又叫做本征vlan。
交换机相关配置命令:
1、接口access模式配置
SW1(config)#interface e0/3
SW1(config-if)#switchport mode access 配置接口access模式
SW1(config-if)#switchport access vlan 3 将接口加入vlan3
SW1(config-if)#end
SW1#show vlan brief 查看vlan对应的接口信息,没有的接口都在trunk中
2、接口trunk模式配置
SW1(config)#interface e0/2
SW1(config-if)#switchport trunk encapsulation dot1q 为trunk封装802.1q协议
SW1(config-if)#switchport mode trunk 配置为trunk模式
SW1(config-if)#end
SW1#show interfaces trunk 查看trunk接口信息,trunk口show vlan brief 看不到
Port Mode Encapsulation Status Native vlan
Et0/2 on 802.1q trunking 1
session 2 DTP协议
DTP全名dynamic trunk protocol动态trunk协议,是cisco私有的协议,此协议可以让Cisco交换机自动协商指定交换机之间的链路是否形成Trunk。非cisco交换机是没有DTP协议的,当cisco收不到DTP时,cisco交换机就认为是access模式,这个端口就被设置为access口。 下面具体说一下各种情况:拓扑为 SW1:e0/0---------连接----------e0/0:SW2
接口下:两端都采用sw2(config-if)#switchport trunk encapsulation negotiate 协商成ISL
其中一边设置了sw1(config-if)#switchport trunk encapsulation dot1q 协商为802.1q
其中一边设置了sw1(config-if)#switchport trunk encapsulation isl 协商为isl
而下面是双方都开启了协商模式都使用了sw2(config-if)#switchport trunk encapsulation negotiate命令后,接口的模式可以进行自动协商的配置,如果不配置接口的模式则按照上面的三种情况执行,如果接口配置了动态协商模式的话就按照下表执行:结果对照表和动态端口配置如下
sw1(config-if)#switchport mode dynamic ?
auto Set trunking mode dynamic negotiation parameter to AUTO
desirable Set trunking mode dynamic negotiation parameter to DESIRABLE
一般实际中都是直接人为制定了接口的模式和trunk的封装协议,这样做网络稳定安全,动态的协商基本用不到。而且考虑到安全性一般都关闭接口的DTP协议,关闭方法就是把接口access、trunk、shutdown自动就关闭了。
session 3 native本征vlan
dot1q协议里面规定的,在ISL中没有定义本征vlan一说都打标机,但是在dot1q中native vlan 1是不打tag的。
1、如果想让dot1q和isl对所有vlan包括native vlan 1也打标记的话,可以在交换机配置:
sw1(config)#vlan dot1q tag nativ 给本征vlan也打tag,这个需要交换机IOS支持,一般3550以上的都支持
2、可以在接口中修改native vlan的号
sw2(config-if)#switchport trunk native vlan 2 将vlan2改为native vlan
修改的只针对于当前接口生效,比如native vlan 是vlan2,那么在接口是access vlan3的接口上配置native vlan2没什么意义的。而当前接口时trunk或者就是vlan2的话就有意义,从这个接口出去的vlan2(现在是本征vlan)的数据帧将不会被封装dot1q协议,也就是说只要是vlan2的数据就不会有tag标记,而其余vlan会有tag的标记。(通过trunk通道的时候也一样,没有tag标记)。
实验:SW1中的vlan2是native vlan和SW2中的vlan3是native vlan可以L2层通信(PC都在一个网段),根据vlantag只看接口属于哪个vlan的原理来判断,如果不通那么是STP影响的,关闭STP就可以实验成功。
重点:vlan接口access、QinQ等在发的时候不打tag,只有收数据的时候才打tag