交換機原理
- 交換機基於數據的源mac地址進行學習
由於交換機可以學習mac地址,把學習到的mac地址,存放到mac-address table,每一個表項可以保存300秒,這個表也叫cam表,也可以叫mac地址表 - 基於數據的目的mac地址,查詢交換機的mac地址表,如果找到了,單播出去,如果沒有找到,則泛洪
- 交換機的一個接口可以學習多個mac地址
為什么一個接口會學習多個mac地址呢?因為接口還可以連另一個交換機,另一個交換機下面有好多pc。 - 一個mac地址只能被一個交換機接口學習
一台交換機的2個接口都接收到了相同的mac地址,把這個mac記錄到哪個接口呢?后到的優先。 - 如果3台交換機形成了一個環,就會產生廣播風暴,交換機有防環協議。
由糟糕的網絡設計,引出划分vlan的必要性
- 巨大的廣播域,導致泛洪驗證,性能低下
- 一台機器中了病毒,由於沒有隔離,會迅速傳染給網絡內的其他主機。
- 不方便管理

vlan概要
辦公樓有3層,每層都有IT部,HR部,銷售部。把在1,2,3層的IT划分成一個vlan;把在1,2,3層的HR部划分成一個vlan;在1,2,3層的銷售划分成一個vlan;這樣做的目的是便於管理。

vlan特點
相同vlan即便在不同的交換機下,也可以相互通信;不同vlan即便是在同一個交換機下也不能通信。
vlan運作
紅色的是一個vlan,黑色的是一個vlan,綠色的是一個vlan,它們都在交換機A里。
雖然紅色和黑色在同一個交換機下,但是它們之間不能通信。

紅色的是一個vlan,黑色的是一個vlan,綠色的是一個vlan,它們既在交換機A里,也在交換機B里。
即使不在同一個交換機下,紅色的vlan是可以跨交換機通信的。

交換機A和交換機B連接的2個接口,必須修改成Trunk接口。Trunk接口不屬於任何vlan,所以所有vlan的數據都能通過它傳輸。

那么trunk如何能夠識別vlan號的呢,出交換機A時,trunk接口在原來的報文的以太網頭部加一個4個字節的標記,標記里存放的是vlan號,然后傳到了交換機B的trunk接口后,trunk接口查看以太網頭部的標記,就知道了是哪個vlan過來的數據,然后把標記去掉后,傳遞個目標vlan。
打標記和去掉標記的協議有2種:
- ISL:cisco專有的協議,是在報文的以太網頭部在加一個ISL頭部,把vlan號放進去。
- 802.1Q:國際標准,所有廠商的交換機都支持。直接把vlan號放到報文的以太網頭部里。所有一般都使用此協議。

- cisco交換機下所有接口,默認都屬於vlan1
- 交換機最多支持4096個vlan號。范圍是0-4095.其中0號和4095號不能用。
- vlan1,vlan1002,vlan1003,vlan1004,vlan1005是交換機初始就有的vlan號,而且不能被刪除。vlan1能使用,其他4個不能使用,是保留的。
- 1-1001:標准vlan
- 1006-4094:擴展vlan。cisco 3560以上的型號才支持,vtp協議的transparent模式下可用。
實驗

添加2個pc,給pc設置ip的命令:
PC1> ip 192.168.1.10 255.255.255.0
Checking for duplicate address...
PC1 : 192.168.1.10 255.255.255.0
添加一個交換機,查看vlan表show vlan brief
IOU2#show vlan brief
VLAN Name Status Ports
---- -------------------------------- --------- -------------------------------
1 default active Et0/0, Et0/1, Et0/2, Et0/3
Et1/0, Et1/1, Et1/2, Et1/3
Et2/0, Et2/1, Et2/2, Et2/3
Et3/0, Et3/1, Et3/2, Et3/3
1002 fddi-default act/unsup
1003 token-ring-default act/unsup
1004 fddinet-default act/unsup
1005 trnet-default act/unsup
創建vlan方法1:先進入創建模式vlan database,然后vlan vlan號。
但執行完vlan database后,不是立即創建vlan,必須使用exit,保存並退出后,才真正創建vlan。
IOU2#vlan database
% Warning: It is recommended to configure VLAN from config mode,
as VLAN database mode is being deprecated. Please consult user
documentation for configuring VTP/VLAN in config mode.
IOU2(vlan)#vlan 10
VLAN 10 added:
Name: VLAN0010
IOU2(vlan)#exit
APPLY completed.
Exiting....
IOU2#show vlan brief
VLAN Name Status Ports
---- -------------------------------- --------- -------------------------------
1 default active Et0/0, Et0/1, Et0/2, Et0/3
Et1/0, Et1/1, Et1/2, Et1/3
Et2/0, Et2/1, Et2/2, Et2/3
Et3/0, Et3/1, Et3/2, Et3/3
10 VLAN0010 active
1002 fddi-default act/unsup
1003 token-ring-default act/unsup
1004 fddinet-default act/unsup
1005 trnet-default act/unsup
修改vlan的名字:vlan 10 name NAME
IOU2(vlan)#vlan 10 name hr
VLAN 10 modified:
Name: hr
IOU2(vlan)#exit
APPLY completed.
Exiting....
IOU2#show vlan b
IOU2#show vlan brief
VLAN Name Status Ports
---- -------------------------------- --------- -------------------------------
1 default active Et0/0, Et0/1, Et0/2, Et0/3
Et1/0, Et1/1, Et1/2, Et1/3
Et2/0, Et2/1, Et2/2, Et2/3
Et3/0, Et3/1, Et3/2, Et3/3
10 hr active
1002 fddi-default act/unsup
1003 token-ring-default act/unsup
1004 fddinet-default act/unsup
1005 trnet-default act/unsup
創建vlan方法2:先進入全局模式conf t,然后vlan vlan號,然配置名字name Name
IOU2#conf t
Enter configuration commands, one per line. End with CNTL/Z.
IOU2(config)#vlan 20
IOU2(config-vlan)#name it
IOU2(config-vlan)#exit
IOU2(config)#exit
*Jan 16 16:36:48.962: %SYS-5-CONFIG_I: Configured from console by console
IOU2#show vlan brief
VLAN Name Status Ports
---- -------------------------------- --------- -------------------------------
1 default active Et0/0, Et0/1, Et0/2, Et0/3
Et1/0, Et1/1, Et1/2, Et1/3
Et2/0, Et2/1, Et2/2, Et2/3
Et3/0, Et3/1, Et3/2, Et3/3
10 hr active
20 it active
1002 fddi-default act/unsup
1003 token-ring-default act/unsup
1004 fddinet-default act/unsup
1005 trnet-default act/unsup
把接口設置成輸入接口
輸入接口只能連pc。下面的設置:把交換機的接口e0/0設置成了輸入接口
IOU2(config-if)#switchport mode access
IOU2(config)#int e0/0
IOU2(config-if)#switchport mode ?
access Set trunking mode to ACCESS unconditionally
dot1q-tunnel set trunking mode to TUNNEL unconditionally
dynamic Set trunking mode to dynamically negotiate access or trunk mode
private-vlan Set private-vlan mode
trunk Set trunking mode to TRUNK unconditionally
IOU2(config-if)#switchport mode access
把接口划分到某個vlan里
把接口e0/0划分到vlan 10里,
IOU2(config-if)#switchport access vlan 10
IOU2#show vlan brief
VLAN Name Status Ports
---- -------------------------------- --------- -------------------------------
1 default active Et0/1, Et0/2, Et0/3, Et1/0
Et1/1, Et1/2, Et1/3, Et2/0
Et2/1, Et2/2, Et2/3, Et3/0
Et3/1, Et3/2, Et3/3
10 hr active Et0/0
20 it active
雖然pc1和pc2在同一個局域網內,但由於pc1連接到了e0/0,pc2連接到了e0/1,e0/0和e0/1已經不在同一vlan里了,所有pc1和pc2已經不能互相通信了。
PC1> sho ip
NAME : PC1[1]
IP/MASK : 192.168.1.10/24
GATEWAY : 255.255.255.0
DNS :
MAC : 00:50:79:66:68:00
LPORT : 20004
RHOST:PORT : 127.0.0.1:20005
MTU: : 1500
PC1> ping 192.168.1.20
host (192.168.1.20) not reachable
PC2> show ip
NAME : PC2[1]
IP/MASK : 192.168.1.20/24
GATEWAY : 255.255.255.0
DNS :
MAC : 00:50:79:66:68:01
LPORT : 20006
RHOST:PORT : 127.0.0.1:20007
MTU: : 1500
PC2> ping 192.168.1.10
host (192.168.1.10) not reachable
把接口e0/1,划分到vlan 20
IOU2(config)#int e0/1
IOU2(config-if)#switchport mode access
IOU2(config-if)#switchport access vlan 20
IOU2(config-if)#exit
IOU2(config)#exit
IOU2#
*Jan 16 16:58:41.162: %SYS-5-CONFIG_I: Configured from console by console
IOU2#show vlan brief
VLAN Name Status Ports
---- -------------------------------- --------- -------------------------------
1 default active Et0/2, Et0/3, Et1/0, Et1/1
Et1/2, Et1/3, Et2/0, Et2/1
Et2/2, Et2/3, Et3/0, Et3/1
Et3/2, Et3/3
10 hr active Et0/0
20 it active Et0/1
由於pc1和pc2已經不在同一vlan里了,所以最好修改pc2的ip,和pc1不在一個網段里。
PC2> ip 192.168.2.10 255.255.255.0
Checking for duplicate address...
PC1 : 192.168.2.10 255.255.255.0
再添加一台交換機switch2,和2台pc,分別是pc3和pc4
在交換機switch2里,添加vlan 10和vlan 20.
switch2#vlan database
switch2(vlan)#vlan 10 name hr
VLAN 10 added:
Name: hr
switch2(vlan)#vlan 20 name it
VLAN 20 added:
Name: it
switch2(vlan)#exit
APPLY completed.
Exiting....
switch2#show vlan b
VLAN Name Status Ports
---- -------------------------------- --------- -------------------------------
1 default active Et0/0, Et0/1, Et0/2, Et0/3
Et1/0, Et1/1, Et1/2, Et1/3
Et2/0, Et2/1, Et2/2, Et2/3
Et3/0, Et3/1, Et3/2, Et3/3
10 hr active
20 it active
把交換機switch2的接口e0/1划分到vlan10;把e0/2划分到vlan20
switch2#conf t
Enter configuration commands, one per line. End with CNTL/Z.
switch2(config)#int e0/1
switch2(config-if)#switchport mode access
switch2(config-if)#switchport access vlan 10
switch2(config-if)#int e0/2
switch2(config-if)#switchport mode access
switch2(config-if)#swi acc vlan 20
switch2(config-if)#exit
switch2(config)#exit
switch2#show vlan b
VLAN Name Status Ports
---- -------------------------------- --------- -------------------------------
1 default active Et0/0, Et0/3, Et1/0, Et1/1
Et1/2, Et1/3, Et2/0, Et2/1
Et2/2, Et2/3, Et3/0, Et3/1
Et3/2, Et3/3
10 hr active Et0/1
20 it active Et0/2
配置pc3和pc4的ip,讓pc3和pc1在同一個網段,讓pc4和pc2在同一個網段
PC3> show ip
NAME : PC3[1]
IP/MASK : 192.168.1.20/24
GATEWAY : 255.255.255.0
DNS :
MAC : 00:50:79:66:68:02
LPORT : 20014
RHOST:PORT : 127.0.0.1:20015
MTU: : 1500
PC4> show ip
NAME : PC4[1]
IP/MASK : 192.168.2.20/24
GATEWAY : 255.255.255.0
DNS :
MAC : 00:50:79:66:68:03
LPORT : 20016
RHOST:PORT : 127.0.0.1:20017
MTU: : 1500
這時pc1和pc3能ping通嗎
是ping不通的,因為連接switch1(e0/2)和swtch2(e0/0)的接口,還並沒有划分在vlan 10里。
划分到vlan 10里后,pc1和pc3就能ping通了。
IOU2(config)#int e0/2
IOU2(config-if)#switchport access vlan 10
IOU2#show vlan b
VLAN Name Status Ports
---- -------------------------------- --------- -------------------------------
1 default active Et0/3, Et1/0, Et1/1, Et1/2
Et1/3, Et2/0, Et2/1, Et2/2
Et2/3, Et3/0, Et3/1, Et3/2
Et3/3
10 hr active Et0/0, Et0/2
switch2(config)#int e0/0
switch2(config-if)#switchport acc vlan 10
switch2#show vlan b
VLAN Name Status Ports
---- -------------------------------- --------- -------------------------------
1 default active Et0/3, Et1/0, Et1/1, Et1/2
Et1/3, Et2/0, Et2/1, Et2/2
Et2/3, Et3/0, Et3/1, Et3/2
Et3/3
10 hr active Et0/0, Et0/1
20 it active Et0/2
這時,pc2和pc4能ping通嗎?
不能ping通,因為連接switch1(e0/2)和swtch2(e0/0)的接口,划分在vlan 10里,而pc2和pc4划分在vlan 20里。
修改switch1(e0/2)和swtch2(e0/0)的接口,為trunk接口后,pc2和pc4就能ping通了。
執行:IOU2(config-if)#switchport mode trunk,會報下面的錯誤
Command rejected: An interface whose trunk encapsulation is "Auto" can not be configured to "trunk" mode.
錯誤原因:前面說過打標記和解標記有2個協議,一個是cisco特有的ISL,另一個是國際標准802.1Q,所以設置trunk接口時要明確告訴交換機用哪個協議。
告訴交換機用哪個協議:IOU2(config-if)#switchport trunk encapsulation dot1q
dot1q就是802.1Q。
IOU2(config)#int e0/2
IOU2(config-if)#switchport mode trunk
Command rejected: An interface whose trunk encapsulation is "Auto" can not be configured to "trunk" mode.
IOU2(config-if)#switchport trunk encapsulation dot1q
IOU2(config-if)#switchport mode trunk
switch2(config)#int e0/0
switch2(config-if)#swi
switch2(config-if)#switchport mo
switch2(config-if)#switchport mode tru
switch2(config-if)#switchport mode trunk
Command rejected: An interface whose trunk encapsulation is "Auto" can not be configured to "trunk" mode.
switch2(config-if)#switchport trunk encapsulation dot1q
switch2(config-if)#switchport mode trunk
這時pc1和pc3,pc2和pc4都能ping通了。
把switch1(e0/2)和swtch2(e0/0)設置成trunk接口后,它們就消失了。不屬於任何一個vlan。
在show vlan brief命令結果里消失的接口,有2種情況。一種是:它不屬於任何vlan了;另一種是它是trunk接口了。
IOU2#show vlan brief
VLAN Name Status Ports
---- -------------------------------- --------- -------------------------------
1 default active Et0/3, Et1/0, Et1/1, Et1/2
Et1/3, Et2/0, Et2/1, Et2/2
Et2/3, Et3/0, Et3/1, Et3/2
Et3/3
10 hr active Et0/0
20 it active Et0/1
switch2#show vlan b
VLAN Name Status Ports
---- -------------------------------- --------- -------------------------------
1 default active Et0/3, Et1/0, Et1/1, Et1/2
Et1/3, Et2/0, Et2/1, Et2/2
Et2/3, Et3/0, Et3/1, Et3/2
Et3/3
10 hr active Et0/1
20 it active Et0/2
到此為止,證明了:相同vlan即便在不同的交換機下,也可以相互通信;不同vlan即便是在同一個交換機下也不能通信。
查看哪個接口是trunk
IOU2#show interfaces trunk
Port Mode Encapsulation Status Native vlan
Et0/2 on 802.1q trunking 1
Port Vlans allowed on trunk
Et0/2 1-4094
Port Vlans allowed and active in management domain
Et0/2 1,10,20
Port Vlans in spanning tree forwarding state and not pruned
Et0/2 1,10,20
switch2#show interfaces trunk
Port Mode Encapsulation Status Native vlan
Et0/0 on 802.1q trunking 1
Port Vlans allowed on trunk
Et0/0 1-4094
Port Vlans allowed and active in management domain
Et0/0 1,10,20
Port Vlans in spanning tree forwarding state and not pruned
Et0/0 1,10,20
-
Encapsulation:802.1q:使用的協議
-
Native vlan:1.
這個1是vlan號。
trunk接口把過來的數據打上標記,對端的trunk接口讀這個標記。【Native vlan】指定的vlan號,經過trunk接口時,trunk接口不給它打標記。對端的trunk接口讀標記時,發現沒有標記,則把這個數據包給,自己這段的trunk接口里【Native vlan】定義的vlan里的主機。
對端的2個trunk接口的【Native vlan】一定要一樣!!!
設置【Native vlan】:switchport trunk native vlan vlan號
IOU2(config)#int e0/2
IOU2(config-if)#swi
IOU2(config-if)#switchport tr
IOU2(config-if)#switchport trunk na
IOU2(config-if)#switchport trunk native v
IOU2(config-if)#switchport trunk native vlan 2
IOU2#show interfaces trunk
Port Mode Encapsulation Status Native vlan
Et0/2 on 802.1q trunking 2
實驗【Native vlan】:

添加pc5和pc6,pc5連switch1的接口e0/3,把e0/3的vlan設置從vlan 2;pc6連switch2的接口e0/3,使用接口e0/3默認的vlan號,就是vlan 1.
把pc5和pc6的ip設置到同一網段。pc5和pc6雖然在不同的vlan,但居然可以ping通了。原因就是對端的2個trunk接口的【Native vlan】不一樣導致的。switch1的【Native vlan】是vlan2,所以vlan2下的主機通過此trunk時,沒有被打上標記,傳遞到對端的trunk后,對端的trunk接口發現沒有標記,則直接傳遞個自己的【Native vlan】,是vlan1,所以導致了不同vlan也能通信的現象。
IOU2(config)#int e0/3
IOU2(config-if)#
*Jan 16 18:27:37.386: %CDP-4-NATIVE_VLAN_MISMATCH: Native VLAN mismatch discovered on Ethernet0/2 (2), with switch2 Ethernet0/0 (1).
IOU2(config-if)#sw mo acc
IOU2(config-if)#sw acc v
IOU2(config-if)#sw acc vlan 2
% Access VLAN does not exist. Creating vlan 2
PC5> ip 192.168.3.10 255.255.255.0
Checking for duplicate address...
PC1 : 192.168.3.10 255.255.255.0
PC6> ip 192.168.3.20 255.255.255.0
Checking for duplicate address...
PC1 : 192.168.3.20 255.255.255.0
PC5> ping 192.168.3.20
84 bytes from 192.168.3.20 icmp_seq=1 ttl=64 time=0.783 ms
84 bytes from 192.168.3.20 icmp_seq=2 ttl=64 time=0.985 ms
84 bytes from 192.168.3.20 icmp_seq=3 ttl=64 time=0.777 ms
84 bytes from 192.168.3.20 icmp_seq=4 ttl=64 time=2.228 ms
84 bytes from 192.168.3.20 icmp_seq=5 ttl=64 time=1.446 ms
PC6> ping 192.168.3.10
84 bytes from 192.168.3.10 icmp_seq=1 ttl=64 time=0.950 ms
84 bytes from 192.168.3.10 icmp_seq=2 ttl=64 time=1.014 ms
84 bytes from 192.168.3.10 icmp_seq=3 ttl=64 time=0.703 ms
84 bytes from 192.168.3.10 icmp_seq=4 ttl=64 time=0.498 ms
84 bytes from 192.168.3.10 icmp_seq=5 ttl=64 time=2.023 ms
實驗加個路由器R1,實現用單臂路由(vlan間路由),連通vlan10和vlan20下的pc

實現思路:把vlan10和vlan20下的主機里的網關,都指定到路由器R1的接口e0/0下,網關在同一個接口下,那么2個vlan的跨網段請求都發送到了同一個接口,那么路由器就能夠知道怎么轉發請求了。
那就出現個問題,在一個接口下怎么配置2個網關ip呢?
先啟用接口e0/0
R1(config)#int e0/0
R1(config-if)#no sh
在接口e0/0下建立2個子接口e0/0.1和e0/0.2。
子接口可以建立多少個?ip地址有多少個就能創建多少個。所以2個網關的地址問題解決了。
那么子接口如何知道,過來的數據是來自哪個vlan呢?
嘗試在e0/0.1接口下,添加網關ip add 192.168.1.1 255.255.255.0,但提示下面的錯誤。
錯誤的意思是要提供:用什么協議打標記和解標記,和vlan號。
R1(config)#int e0/0.1
R1(config-subif)#ip add 192.168.1.1 255.255.255.0
% Configuring IP routing on a LAN subinterface is only allowed if that
subinterface is already configured as part of an IEEE 802.10, IEEE 802.1Q,
or ISL vLAN.
提供vlan號,就是告訴這個子接口,來自這個vlan的數據,歸你管了。
提供dot1Q,就是告訴這個子接口,用哪個協議去解包,得到vlan號。
給子接口指定了vlan號和協議后,再添加網關就ok了。
R1(config-subif)#encapsulation dot1Q 10
R1(config-subif)#ip add 192.168.1.1 255.255.255.0
接口e0/0.2同樣配置
R1(config)#int e0/0.2
R1(config-subif)#encapsulation dot1Q 20
R1(config-subif)#ip add 192.168.2.1 255.255.255.0
添加pc1-4的網關:
PC1> ip 192.168.1.10 255.255.255.0 192.168.1.1
Checking for duplicate address...
PC1 : 192.168.1.10 255.255.255.0 gateway 192.168.1.1
PC2> ip 192.168.2.10 255.255.255.0 192.168.2.1
Checking for duplicate address...
PC2 : 192.168.2.10 255.255.255.0 gateway 192.168.2.1
PC3> ip 192.168.1.20 255.255.255.0 192.168.1.1
Checking for duplicate address...
PC3 : 192.168.1.20 255.255.255.0 gateway 192.168.1.1
PC4> ip 192.168.2.20 255.255.255.0 192.168.2.1
Checking for duplicate address...
PC4 : 192.168.2.20 255.255.255.0 gateway 192.168.2.1
到此為止,vlan10和vlan20能通信了嗎?不能?
由於路由器R1的e0/0配置了解包的協議和vlan號,但是交換機switch1的接口e0/3還不是trunk接口,那么從switch1的接口e0/3出來的數據包里,就沒有vlan號,那么路由器R1就無法得到vlan號,所以就丟棄過來的數據了。
設置switch1的接口e0/3為trunk接口
IOU2(config)#int e0/3
IOU2(config-if)#switchport trunk encapsulation dot1q
IOU2(config-if)#switchport mo tr
現在vlan10和vlan10下的pc之間就可以互相通信了。
# c/c++ 學習互助QQ群:877684253  # 本人微信:xiaoshitou5854