交换机自学习功能:
交换机的自学原理是指交换机能够自动学习网络中MAC地址,并将其添加到MAC地址表中,实现自动构建和更新MAC地址表,以便下次转发数据时直接转发到对应的端口。
模拟代码:
class Switch:
def __init__(self, name):
self.name = name
self.MAC_table = {} # 初始化MAC表
def receive(self, address, port):
destination_mac = address["目的地址"]
if destination_mac in self.MAC_table: # 如果目的MAC地址在MAC表中,转发帧
self.forward(address, port)
else: # 否则,广播帧
print(f"交换机 {self.name} - 广播数据包 {address} 从端口 {port} 到其他端口")
self.learn_address(address["源地址"], port) # 自学习,存储源MAC地址和接收端口
def forward(self, address, in_port): # 转发帧
out_port = self.MAC_table[address["目的地址"]]
print(f"交换机 {self.name} - 转发数据包 {address} 从端口 {in_port} 到端口 {out_port}")
def learn_address(self, source_mac, port): # 学习源MAC地址和端口
self.MAC_table[source_mac] = port
print(f"交换机 {self.name} - 自学习:{source_mac} -> {port}")
if __name__ == "__main__":
switchB1 = Switch("switchB1")
switchB2 = Switch("switchB2")
network_topology = {
'switchB1': {'switchB2': ['a', 'b', 'c', 'd']},
'switchB2': {'switchB1': ['e', 'f']}
}
switches = {
'switchB1': switchB1,
'switchB2': switchB2
}
for switch, connections in network_topology.items():
for connected_switch, ports in connections.items():
if connected_switch in switches:
for port in ports:
switches[switch].MAC_table[connected_switch] = port
switchB1.receive({"源地址": "123456", "目的地址": "ABCDEF"}, "a")
switchB1.receive({"源地址": "ABCDEF", "目的地址": "123456"}, "e")
print("交换机", switchB1.name, "交换表", switchB1.MAC_table)
print("交换机", switchB2.name, "交换表", switchB2.MAC_table)
设计思路:
1. 网络拓扑结构:
网络拓扑结构用一个字典来表示,其中键表示设备的标识符,值表示与之相连的设备标识符。
2. 交换机类:
包括交换机的编号、MAC地址表等属性,以及接收数据包并处理的方法。
3. 数据包传输模拟:
定义一个发送序列,模拟数据包从一个设备发送到另一个设备的过程。针对每个发送信息,找到对应的发送方交换机,调用其接收数据包的方法进行模拟传输过程。
4. 主函数:
初始化网络拓扑结构、交换机对象,并调用数据包传输模拟的过程。
最后,输出每个交换机的MAC地址表内容。
实验结果:
备注:欢迎各位大佬给出指导和建议😊