RYU 灭龙战 second day(内容大部分引自网络)
写好的markdown重启忘了保存。。。再写一次RLG
巨龙的稀有装备—RYU代码结构
- app
在RYU控制器上面运行的应用,基于控制器完成特定的功能。其中的拓扑图应用,就在该文件夹下,app/gui_topology/gui_topology.py,使用方法可参照[RYU_firstday]>>(http://www.cnblogs.com/wpqwpq/p/6464225.html)
- base
该文件夹目录下的app_manager.py是RYU应用的管理中心。用于加载RYU应用程序,接受从APP发送过来的信息,同时也完成消息的路由。
其中定义了其主要的函数有app注册、注销、查找,Runapp类以及AppManager类。Runapp类包含了name, threads, events, event_handlers和observers等成员,以及对应的许多基本函数。如:start(), stop()等。
AppManager基类,用于管理APP。定义了加载APP等函数。
- cmd
定义了RYU的命令系统
- contrib
开源社区贡献者的代码
- controller
包含处理OpenFlow功能的一系列文件。例如,来自交换机的数据包,生成flows,处理网络事件,汇总状态信息等与OpenFlow相关的数据处理。
controller文件夹中许多非常重要的文件,如events.py,ofp_handler.py,controller.py等。其中controller.py中定义了OpenFlowController基类。用于定义OpenFlow的控制器,用于处理交换机和控制器的连接等事件,同时还可以产生事件和路由事件。其事件系统的定义,可以查看events.py和ofp_events.py。
ofp_handler.py中定义了基本的handler,完成了基本的如:握手,错误信息处理和keep alive 等功能。
在dpset.py文件中,定义了交换机端的一些消息,如端口状态信息等,用于描述和操作交换机。如添加端口,删除端口等操作。
- lib
lib中定义了我们需要使用到的基本的数据结构,如dpid,mac和ip等数据结构。在lib/packet目录下,还定义了许多网络协议,如ICMP,DHCP,MPLS和IGMP等协议内容。而每一个数据包的类中都有parser和serialize两个函数。用于解析和序列化数据包。
lib目录下,还有ovs,netconf,of_config,xflow目录,对应的目录下有一些定义好的数据类型。
- ofproto
包含了OpenFlow 1.0到1.5的基本数据结构,其中ofproto_v1_x_parser.py定义了1.x版本的协议编码和解码。
- services
完成了BGP、vrrp、ovsdb的实现。
- tests
目录下存放了单元测试以及整合测试的代码
- topology
包括关于OpenFlow交换机相关的拓扑发现的代码以及对于和拓扑发现相关的信息的处理(例如ports, links等)。内部使用LLDP协议进行拓扑发现
包含了switches.py等文件,基本定义了一套交换机的数据结构。event.py定义了交换上的事件。dumper.py定义了获取网络拓扑的内容。最后api.py向上提供了一套调用topology目录中定义函数的接口
恶龙与人类的沟通方式—WSGI
WSGI:Web Server Gateway Interface
学习方式,基于廖雪峰老师教程WSIG接口读呈神源码,并做相应实践,会比较好理解
from cgi import parse_qs
from cgi import escape
import logging
#hello_world为make_server相应函数
#environ:一个包含有所有HTTP请求信息的字典对象
#start_response:一个发送HTTP响应的函数
def hello_world(environ, start_response):
parameters = parse_qs(environ.get('QUERY_STRING', ''))
if 'subject' in parameters:
subject = escape(parameters['subject'][0])
else:
subject = 'World.'
#start_response()函数接收两个参数,一个是HTTP响应码,一个是一组list表示的HTTP Header,每个Header用一个包含两个str的tuple表示。
#
#通常情况下,都应该把Content-Type头发送给浏览器。其他很多常用的HTTP Header也应该发送。
start_response('200 OK', [('Context-Type', 'text/html')])
return ['''Hello %(subject)s
Hello %(subject)s!''' %{'subject': subject}]
#运行WSGI服务
if __name__ == '__main__':
from wsgiref.simple_server import make_server
IP = 'localhost'
port = 8080
# 创建一个服务器,IP地址为localhost,端口是8080,处理函数是application
server = make_server(IP, port, hello_world)
logging.basicConfig(level=logging.INFO)
LOG = logging.getLogger('wsgi')
LOG.info('listening on %s: %d'%(IP, port))
# 开始监听HTTP请求:
server.serve_forever()