交换集线器具有多种功能。在这里,我们来看一下具有以下简单功能的交换集线器。
1.学习连接到hub端口的主机的MAC地址,并保留在hub的MAC地址表中。
2.当接收到已经学习到目的主机MAC地址的数据包时,将它们传送到连接到该主机的端口上。
3.当接收到未知目的主机MAC地址的数据包时,执行洪泛。
好了,现在我们用Ryu来实现具有这样一个hub功能的交换机。
OpenFlow交换机可以通过接收来自OpenFlow控制器(如Ryu)的指令来执行以下操作。
1.重写接收到的数据包的地址或从指定端口传输数据包。
2.将接收的数据包传输到控制器(Packet-In)。
3.通过控制器从指定端口转发数据包(Packet-Out)。
接下来我们来实现具有这些功能组合的交换集线器。
首先,我们需要使用Packet-In功能来学习MAC地址。控制器可以使用Packet-In功能从交换机接收数据包。交换机分析收到的报文,学习主机的MAC地址和所连接端口信息。学习后,交换机会转发收到的报文。交换机调查报文的目的MAC地址是否属于已经学习到的主机。根据调查结果,交换机进行以下处理。
如果是已经学习了MAC地址的主机,则使用分组输出功能从连接的端口传输数据包。
如果是未学习MAV地址的主机,使用Packet-Out功能执行洪泛。
1.初始状态
这是流表为空的初始状态。
假设主机A连接到端口1,主机B连接到第4部分,主机C连接到端口3。
2.主机A - >主机B
当报文从主机A发送到主机B时,交换机发送一个Packet-In报文给控制器,并通过端口1学习主机A的MAC地址。由于主机B的端口尚未被发现,报文被泛洪并被主机B和主机C接收
Packet-In:
in-port 1
eth-dst=Host B
eth-src=Host A
Packet-Out:
action:OUTPUT:Flooding
3.主机B - >主机A
当数据包从主机B返回到主机A时,将一个条目添加到流表中,并将数据包传输到端口1.因此,主机C不接收到数据包。
Packet-In:
in-port 4
eth-dst=Host A
eth-src=Host B
Packet-Out:
action:OUTPUT:port1
4.主机A - >主机B
再次,当从主机A向主机B发送数据包时,将一个条目添加到流表中,并将数据包传输到端口4。
Packet-In:
in-port1
eth-dst=Host B
eth-src=Host A
Packet-Out:
action:OUTPUT:Port4
接下来,我们来看看使用Ryu实现的交换中心的源代码。