交换机的端口有三种类型
- access
- trunk
- hybrid
对于交换机的每个端口可以设置pvid,表示该端口的默认tag(不一定等于该端口所属的vlan_id)
交换机的mac地址表只根据源mac地址来学习.
书上说那么多其实用伪代码来描述准确而简单.
class Port:
def __init(id,pvid=1,vlan_id=1):
self.id=id
self.pvid=pvid
self.vlan_id=vlan_id
self.link_type="access"
class Switcher:
def __init():
self.ports=[Port(id) for id in range(20)]
self.mac_table={}
self.interfaces={}
#向端口port发送frame数据帧
def send(frame,port):
if port.link_type=="access":
port.write(frame-tag)
elif port.link_type=="trunk":
if frame.tag.vlan_id==port.pvid:
frame-=tag
port.write(frame)
elif port.link_type=="hybrid":
if port.interfaces[frame.tag.vlan_id].isUnTagged:
frame-=tag
port.write(frame)
#在port端口收到frame数据帧
def onReceive(frame,port):
if not frame.isTagged:
frame+=tag(port.pvid)
elif frame.tag.vlan_id!=port.vlan_id:
delete(frame)
return
mac_table[frame.srcMac]=port
if mac_table[frame.desMac]==None:
for port in self:
send(frame,port)
elif mac_table[frame.desMac]==port:
delete(frame)
return
else:
send(frame,mac_table[frame.desMac])