1.learning_switch 说明.
学习型的交换机,原理即“最初,交换机简单对其接收到的包广播到其所有的邻居。
对于它所看到的每个包, 它将记住包进入时发送者 S 的端口. 接下来,如果它接收到包
的目的是 S, 它仅转发包到之前从 S 中接收过包的端口.”
我们有了 NetVis 这样的可视化的...模拟器,就能看到包是怎样去传播的。开始老
师告诉我们,给我一个包,不是给我的我就泛滥,是我的我就留下,记住再发回。老
师还告诉我们,这些函数都给你写的差不多了,就是主要去了解数据结构。于是我便
在 basis.py 中这样写:
if packet.dst is not self :
self.send(packet,packet.dst,flood=True)
这样不就是:不是我的我就泛滥嘛,但是 NetVis 上的包越来越多,最后简直就是洪
流。后来我发现,交换机交换机,我们写的函数只适用于 S 开头的 switch,至于其他用户,
他们只是把不是给自己包扔回去。当时我忽略了返回的包 pong 的 src 正好是我们要找的
dest,所以 swich 会一直 flows。实际上,正确的方法是,当它收到第一个 pong 时,转
发表更新,就不 flows 了。
参考 Basics.py 中的 RoutingUpdate 函数,我也创建了一个转发表用来记录包的
源和端口,这期间我不知道定义一个数据是要加 self.的,而且不会用 global,所以老
是 xxx is not defined。定义好之后就比较简单了,没有的转发路径就去记:
if packet.src not in self.forwardingtable:
self.forwardingtable[packet.src] = port
路由器只会记住收到的包而不会去记发送的包,因为这毫无意义。开始时,泛滥是必
要的:
if packet.dst not in self .forwardingtable:
self.send(packet, port, True)
Return
反向泛滥,不会泛滥到收到的包的端口。后来, h2b 用户收到了泛滥的 Ping,他就
Pong 一个回来。Pong 我没有细看,NetVis 显示它总是会原路返回。这个 Pong 经过的
所有 Swich 都知道了通向 h2b 用户的路,这样,这些 Swich 收到了一个 src 并储存了端
口和 src,当他们再次遇到游荡的有效的通往 h2b 的包后:
if packet.dst not in self.forwardingtable:
跳出了上面的话,执行下面语句,这时就是定点发送而不是泛滥了。
else:
self.send(packet, self.forwardingtable[packet.dst])
这样,整个学习型的交换机就实现完毕了。