Ryu 源码阅读
SimpleMonitor13,SimpleSwitchRest13 两个类都继承自 SimpleSwitch13,分别扩展了流量监控和北向 RESTful API 功能,这篇以实验+源码剖析的方式简单总结下。
我的新书《LangChain编程从入门到实践》 已经开售!推荐正在学习AI应用开发的朋友购买阅读!
Switching Hub
- 传统交换机
- 学习连接到传统交换机的主机的mac地址,并把其存在mac地址表中
- 对于已经记录下来的mac地址,若是收到送往该mac地址的数据包时,就往对应的端口进行转发
- 对于mac地址表中没有的数据包,则进行flooding
- OpenFlow 交换机实现传统交换机功能
- 对接收到的数据包向指定的端口转发
- 把接收到的数据包发送给控制器(Packet-In)
- 把从控制器接收到的数据包转发到指定的端口(Packet-Out)
1 | # simple_switch_13.py 实现一个带MAC地址学习功能的二层交换机 |
实验测试
mininet端执行
1 | $ sudo mn --topo single,3 --mac --switch ovsk,protocols=OpenFlow13 --controller remote |
ovs端执行
1 | $ sudo ovs-vsctl show |
因为此时的交换机中没有任何可匹配的转发策略,在mininet端执行pingall,结果全丢包
1 | mininet> pingall |
再开一个终端,开启ryu
执行ryu-manager --verbose ryu.app.simple_switch_13
在ovs端查看流表,Table-miss Flow Entry 已加入OVS
1
2
3$ sudo ovs-ofctl -O OpenFlow13 dump-flows s1
cookie=0x0, duration=28.824s, table=0, n_packets=0, n_bytes=0, priority=0 actions=CONTROLLER:65535mininet端
1
2
3
4
5
6
7
8mininet> h1 ping -c1 h2
PING 10.0.0.2 (10.0.0.2) 56(84) bytes of data.
64 bytes from 10.0.0.2: icmp_seq=1 ttl=64 time=5.18 ms
--- 10.0.0.2 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 5.183/5.183/5.183/0.000 msovs端再次查看OVS流表
1
2
3
4$ sudo ovs-ofctl -O OpenFlow13 dump-flows s1
cookie=0x0, duration=190.004s, table=0, n_packets=2, n_bytes=140, priority=1,in_port="s1-eth2",dl_dst=00:00:00:00:00:01 actions=output:"s1-eth1"
cookie=0x0, duration=190.003s, table=0, n_packets=1, n_bytes=42, priority=1,in_port="s1-eth1",dl_dst=00:00:00:00:00:02 actions=output:"s1-eth2"
cookie=0x0, duration=648.460s, table=0, n_packets=6, n_bytes=392, priority=0 actions=CONTROLLER:65535ryu端查看
1
2
3
4
5
6EVENT ofp_event->SimpleSwitch13 EventOFPPacketIn
packet in 1 00:00:00:00:00:01 ff:ff:ff:ff:ff:ff 1
EVENT ofp_event->SimpleSwitch13 EventOFPPacketIn
packet in 1 00:00:00:00:00:02 00:00:00:00:00:01 2
EVENT ofp_event->SimpleSwitch13 EventOFPPacketIn
packet in 1 00:00:00:00:00:01 00:00:00:00:00:02 1
Traffic Monitor
1 | from operator import attrgetter |
实验测试
- mininet端
执行sudo mn --topo single,3 --mac --switch ovsk,protocols=OpenFlow13 --controller remote
- ryu端
执行ryu-manager --verbose ryu.app.simple_monitor_13
- mininet端
执行h1 ping -c1 h2
,可观察到实时的流量检测
REST Linkage
RYU提供了一个类似WSGI的web服务器功能。借助这个功能,我们可以创建一个REST API,基于创建的REST API,可以快速的将RYU系统与其他系统或者是浏览器相连接。
1 | import json |
实验测试
- mininet端
执行sudo mn --topo single,3 --mac --switch ovsk,protocols=OpenFlow13 --controller remote
- ryu端
执行ryu-manager --verbose ryu.app.simple_switch_rest_13
- mininet端
执行h1 ping -c1 h2
,并观察ryu端的变化
使用curl调用 RESTful API 获取mac地址表curl -X GET http://127.0.0.1:8080/simpleswitch/mactable /0000000000000001
使用curl调用 RESTful API 进行mac地址表的注册curl -X PUT -d '{"mac" : "00:00:00:00:00:03", "port" : 3}' http://127.0.0.1:8080/simpleswitch/mactable/0000000000000001
查看流表可以看得到刚刚PUT的请求,也转化为流表的形式下发了