最近刚刚对SDN产生了很大的兴趣,相对之前使用的POX控制器作出一个分析,了解控制器的机制,这样更好的理解SDN。
本文从https://openflow.stanford.edu/display/ONL/POX+Wiki官方网站中进行学习的。
首先从POX的自带的组件来分析:
其中:
forwarding作为转发应用,包括l2_learning、l2_pairs、l3_learning、l2_multi、l2_nx。
OpenFlow是控制驱动,包括of_01、discovery、debug、keepalive。
POX包括core部分和组件:
其中core部分包括:of_01和openflow。
POX处理的流程如下:
1、of_01监听到交换机消息;
2、握手消息自己处理,其他都触发事件;
3、在监听该事件的组件,触发相应函数处理该事件。
of_01 主要是运行一个线程,该线程不断与交换机进行TCP连接,当某交换机送来一个协议消息时,of_01会触发该消息所对应的事件。openflow则与所有的物理交换机相连,而控制器可以通过openflow控制所有的交换机。
POX伴随着组件一起启动,有些组件提供主要功能,而有些仅仅是一些例子。下面具体解释:
Py
让POX启动一个交互式的python解释器,方便调试和开发,这个默认就是启动控制器POX。
Forwarding.hub
为每一个交换机建立通配的洪泛规则,让交换机拥有hub的功能。
Forwarding.l2_learning
让OpenFlow交换机成为2层自学习交换机。当组件学习到2层地址时,流表会建立精确匹配。例如,不同的TCP连接会导致不同的流表建立。
Forwarding.l2_pairs
让OpenFlow交换机扮演2层自学习交换机。与l2_learning不同的是,只为MAC地址建立流表规则。
Forwarding.l3_learning
这既不是一个router,也不完全是2层交换机,只是个3层学习交换组件。主要功能是使用POX的数据包库来检查和构建ARP请求和回复。
一个使用场景是使用l3_learning来配置“fake gateways”即:
./pox.pyforwarding.l3_learning --fakeways=10.0.0.1,192.168.0.1
Forwarding.l2_multi
L2_multi使用openflow.discovery来学习整个网络中的拓扑结构。只要一个交换机学习到MAC地址,其他所有的交换机都会学习到。
Forwarding.l2_nx
使用Nicira扩展(即Open vSwitch)的L2 switch。
RunLike this:
./pox.pyopenflow.nicira –convert-packet-in forwarding.l2_nx
基于源MAC和目的MAC地址进行转发。因此交换机中有两张表:一张是源MAC,另一张是目的MAC。
forwarding.topo_proactive
为指定的IP地址建立转发规则。这些IP地址必须是DHCP分配的。
openflow.spanning_tree
组件使用发现组件建立网络拓扑,建立生成树,然后禁止交换机端口的洪泛,这个和生成树协议没什么关系。
组件有两个选项:
–no-flood 当交换机连接时,禁止所有端口flood;
–hold-down 当一个完整的发现过程未结束时,阻止改变flood控制。
web.webcore
在POX进程中启动一个web server。
Messenger
通过基于JSON的双向消息提供一个POX和外部进程通信的接口。
openflow.of_01
该组件和所有OpenFlow交换机通信(默认是1.0)。通常是默认启动(除非你指定–no-openflow选项),通常借助它来选择侦听端口等选项。
openflow.discovery
使用LLDP消息来发现网络拓扑,链路开启或关闭时会触发事件。
openflow.debug
生成pcap追踪消息,便于使用wireshark进行抓包分析。
openflow.keepalive
这个组件使POX定期发送回显请求到连接到的交换机。
支持以下命令行选项:
–interval=X 每X秒发送一个回显请求(default 20)
–timeout=X 期望X秒从交换机得到回复 (default 3)
proto.pong
主要用于ICMP回显和请求(ping)。
proto.arp_responder
一种arp工具可以学习到代理ARP,并且可以答复静态流表项。
例子:指定IP地址和MAC地址
proto.arp_responder--192.168.0.1=00:00:00:00:00:01--192.168.0.2=00:00:00:00:00:02
info.packet_dump
收集packet_in信息日志,类似于tcpdump。
proto.dns_spy
监测DNS回复并记录结果。其它组件能够检测它们通过访问core.DNSSpy.ip_to_name[<ip address>] 和core.DNSSpy.name_to_ip[<domainname>].
proto.dpcp_client
DHCP客户端,需要和其它组件一起使用。
proto.dhcpd
DHCP服务器。默认可以使用proto.arp_responder使192.168.0.254为代理ARP。如:
proto.dhcpd--network=10.1.1.0/24 --ip=10.1.1.1 --first=10 --last=None --router=None--dns=4.2.2.1
具体的可以参考wiki。
misc.of_tutorial
和 OpenFlowtutorial一起使用。
misc.full_payload
默认时,当一个数据包在交换机上丢失流表时,交换机可能只发送部分数据包到控制器(前128字节)。当发送一个全部的数据包时,这个组件需要在每个交换机上重新配置。
misc.mac_blocker
阻止MAC地址
misc.nat
NAT地址转换
misc.ip_loadbalancer
TCP负载均衡
./pox.pymisc.ip_loadbalancer –ip=<Service IP> –servers=<Server1IP>,<Server2 IP>,…
misc.gephi_topo
带有拓扑图的图形界面
./pox.pyopenflow.discovery misc.gephi_topo host_tracker forwarding.l2_learning
log
日志功能,POX使用python logging模块。下面有一些选项:
禁止控制台日志,日志格式,日志输出,日志颜色,日志级别等。可参考python logging。
samples.pretty_log
使用log.color和用户自定义的日志格式来优化控制台输出
tk
基于Tk的GUI
host_tracker
跟踪网络主机,通常会分发一个HostEvent。host_tracker通常会检查packet_in消息以及MAC地址表。
当然POX中也可以创建自己的组件,这点就要弄清楚POX组件是如何建立和加载的,这点需要分析POX中代码,在后面会给出相应的分析。
POX中from pox.core import core也可以建立许多接口来进行许多应用。额外补充一句在python中,如果import某个库文件,则会执行该库文件中除了def之外的可执行语句。这点可以复用代码。