三层交换机对链路层数据帧的处理

交换机的端口有三种类型

  • 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])
原文地址:https://www.cnblogs.com/weiyinfu/p/6081478.html