- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我是OpenFlow和SDN的新手。我需要在Ubuntu或Debian机器上设置Ryu OpenFlow控制器的帮助,并且了解基本的Ryu应用程序。
注意:这个问题已经有答案。
最佳答案
这可能是我在Stack Overflow上写的最长的文章之一。我一直在学习有关OpenFlow,SDN和Ryu的知识,并希望在这里为初学者记录我的知识。如果需要,请更正/编辑我的帖子。
本简短指南假定您已经了解计算机网络和主要的网络协议。本指南将帮助您从系统设置程序开始使用OpenFlow。
1.什么是OpenFlow和SDN?
请阅读SDN / OpenFlow | Flowgrammable。
进一步阅读:The Future of Networking, and the Past of Protocols by Scott Shenker and Software-defined Networking, IEEE INFOCOM 2009。
在你开始之前:
基础设施层包括网络核心内的路由器和交换机。
控制层包括运行OpenFlow控制器以及其本身的PC。
应用程序层包括在该控制器之上运行的应用程序。在Ryu中,这些应用程序是用Python编写的。
OpenFlow是一种协议,基础结构和控制层使用该协议进行交互。 OpenFlow本身不提供API。它是一种开放源代码协议,供开发支持OpenFlow的交换机的供应商以及编写控制器的开发人员(如Ryu)使用。 API由控制器提供。
2.在Debian 8上设置Ryu OpenFlow控制器
先决条件
您需要上网。如果您在虚拟机中运行Debian,请发出以下命令以通过NAT自动配置以太网接口:
su
dhclient eth0
su
apt-get install sudo # you might need to do apt-get update first!
nano /etc/sudoers
yourusername ALL=(ALL:ALL) ALL
exit
cd /media/cdrom
mkdir ~/VBOXGUEST
cp * ~/VBOXGUEST
cd ~/VBOXGUEST
chmod 755 *
sudo ./VBoxLinuxAdditions.run
sudo shutdown -r now
sudo apt-get install git
cd ~ # if you are in some other directory
git clone git://github.com/mininet/mininet
cd mininet
git tag # this will list available versions
git checkout -b 2.2.1 2.2.1 # replace 2.2.1 with the version you wish to install
cd ..
mininet/util/install.sh -a # default installation, includes all components, recommended
mininet/util/install.sh -h
sudo mn --test pingall
cd ~
git clone git://github.com/osrg/ryu.git
sudo apt-get install wireshark
cd ~/ryu
sudo apt-get install python-dev python-pip python-setuptools
sudo pip install .
sudo pip install webob
sudo pip install eventlet
sudo pip install paramiko
sudo pip install routes
sudo mn --topo single,3 --mac --switch ovsk --controller remote
cd ~/ryu
PYTHONPATH=. ./bin/ryu-manager ryu/app/simple_switch_13.py
cd ~
sudo mn --topo single,3 --mac --switch ovsk --controller remote
cd ~/ryu
PYTHONPATH=. ./bin/ryu-manager ryu/app/simple_switch_13.py
mininet> xterm h1 h2 h3
tcpdump -XX -n -i h2-eth0
tcpdump -XX -n -i h3-eth0
h1: 10.0.0.1
h2: 10.0.0.2
h3: 10.0.0.3
ping 10.0.0.2
ping 10.0.0.3
ping 10.0.0.7
ab:cd:ef:12:34:56
(以十六进制表示)。仅通过端口号识别端口。例如,具有4个端口的交换机具有端口1、2、3和4。
from ryu.base import app_manager
from ryu.controller import ofp_event
from ryu.controller.handler import MAIN_DISPATCHER
from ryu.controller.handler import set_ev_cls
class L2Switch(app_manager.RyuApp):
def __init__(self, *args, **kwargs):
super(L2Switch, self).__init__(*args, **kwargs)
@set_ev_cls(ofp_event.EventOFPPacketIn, MAIN_DISPATCHER)
def packet_in_handler(self, ev):
msg = ev.msg
dp = msg.datapath
ofp = dp.ofproto
ofp_parser = dp.ofproto_parser
actions = [ofp_parser.OFPActionOutput(ofp.OFPP_FLOOD)]
out = ofp_parser.OFPPacketOut(
datapath=dp, buffer_id=msg.buffer_id, in_port=msg.in_port,
actions=actions)
dp.send_msg(out)
from ryu.base import app_manager
class L2Switch(app_manager.RyuApp):
def __init__(self, *args, **kwargs):
super(L2Switch, self).__init__(*args, **kwargs)
ryu.base.app_manager.RyuApp
import(在第一行中导入)。在Ryu API手册中,
app_manager
类是Ryu应用程序的中央管理。它加载Ryu应用程序,为其提供上下文并在Ryu应用程序之间路由消息。
packet_in_handler
添加到
L2Switch
类。当Ryu收到OpenFlow
packet_in
消息时调用此方法。当Ryu收到
packet_in
消息时,将引发
ofp_event.EventOFPPacketIn
事件。
set_ev_cls
装饰器告诉Ryu何时应调用相关函数
packet_in_handler
。
set_ev_cls
装饰器的第一个参数表示使函数调用的事件。如您所料,每次引发
ofp_event.EventOFPPacketIn
事件时,都会调用此函数。
packet_in
消息。使用
MAIN_DISPATCHER
作为第二个参数表示仅在协商完成后才调用此函数。
MAIN_DISPATCHER
表示开关的正常状态。在初始化阶段,开关处于
HANDSHAKE_DISPATCHER
状态!
msg = ev.msg
dp = msg.datapath
ofp = dp.ofproto
ofp_parser = dp.ofproto_parser
ev.msg
是包含接收到的数据包的数据结构。
msg.dp
是该数据结构内的一个对象,代表一个数据路径(开关)。
dp.ofproto
和
dp.ofproto_parser
是代表Ryu和交换机协商的OpenFlow协议的对象。
actions = [ofp_parser.OFPActionOutput(ofp.OFPP_FLOOD)]
out = ofp_parser.OFPPacketOut(
datapath=dp, buffer_id=msg.buffer_id, in_port=msg.in_port,
actions=actions)
dp.send_msg(out)
OFPActionOutput
类与
packet_out
消息一起使用,以指定要从中发送数据包的交换机端口。由于在此简化的应用程序中没有转发数据库,因此我们将数据包泛洪到所有端口,因此使用常量
OFPP_FLOOD
。
OFPPacketOut
类用于构建
packet_out
消息。
datapath
类的
send_msg
方法,可以将OpenFlow消息对象发送到action变量中定义的端口。在这种情况下,我将重复进行操作,以使目标包括所有端口。
EventOFPPacketIn
消息时引发
packet_in
)。前面我们讨论了OpenFlow是一种协议,控制器(Ryu,PC)和基础结构(或交换机)使用该协议进行通信。像
packet_in
这样的消息正是使用OpenFlow协议实现两者之间的通信的样子!
关于ubuntu - 了解Ryu OpenFlow Controller,mininet,WireShark和tcpdump,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37998065/
我想用mininet测试一个带有一些非对称链路的小型网络,但是我没有找到任何相关资料。有人能想到模拟这类链接吗。 最佳答案 可以对同一链路的不同接口(interface)设置不同的限制。作为this
我是 Mininet 和 ODL 的新手,所以请指导我当我在 mininet 中使用以下命令创建简单拓扑时,即 sudo mn –topo=single,2 –mac –controller=remo
我无法运行命令 $ sudo ~/mininet/examples/miniedit.py或 $ sudo python ~/mininet/examples/miniedit.py在 mininet
我是 mininet 和 python 的新手。我想在mininet中执行python脚本,但我不知道如何在mininet中运行python脚本以及在哪里存储.py文件以便从mininet调用。 请问
我是 mininet 的新手,我尝试了两种安装最新 mininet 的方法: sudo apt-get install mininet 通过源代码安装mininet 我收到此消息:设置资源限制时出错。
我有一个类似于下图所示的网络。 这是网络的 python 代码: net.addLink(s1, s2) net.addLink(s2, s3) net.addLink(s3, s4) net.add
我尝试首先打开终结器,然后以 sudo 身份执行 mininet,但我无法在终结器中为拓扑中的每个 mininet 节点创建新 session 。 script -f MININET_NODE_TTY
我想就最好的开源SDN Controller 获取您的建议。我想实现并测试我研究中的一些想法,因此需要使用Mininet之类的模拟。实际上,我熟悉mininet并且能够处理它。但是,Mininet使用
我正在尝试在 mininet 中创建拓扑,但是如果主机通过不同交换机有两条路径,则主机无法相互连接。 我是否缺少某种路由配置?我必须手动创建路径和路由吗?我以为 Controller 是自己做的。 我
我是使用 Mininet 的新手,想知道如何配置 Switch(最好在 python 中使用 native Switch 类)以便复制连接到主机的特定端口上的所有流量,并启动 Wireshark 以便
我对 Mininet 拓扑有疑问。我正在尝试在 h3 和 h4 之间进行 ping。它们连接到同一个开关 s4。但是它们无法 ping 通,它们在不同的子网中,所以我试图为 s4 制作一个流表,但没有
我刚刚设置了一个 mininet 拓扑。现在我想通过 Ubuntu 中的接口(interface)将 Mininet 中交换机上的一个端口连接到外部端口。Ubuntu 服务器有两个端口: ens33
给定一个 Mininet 网络,我想模拟流,例如使用 iperf。为此,我可以运行以下命令: h5 iperf3 -s -p 1337 & h6 iperf3 -s -p 1338 & h1 iper
我想在 Mininet OVS 上运行 iptables。 我这样做 'xterm s1' s1 终端上的“iptables -A INPUT(或 FOWARD 或 OUTPUT)-i s1-eth1
只是想知道是否有任何方法可以检查:使用 Mininet python API 两个节点(交换机)之间是否存在链接? 最佳答案 您可以从 mininet 提示符中使用 API:示例: mininet>
我正在尝试使用 Mininet 启动 scapy 并收到此错误: IOError : [Errno 99] Cannot assign requested address 错误发生在 linux.py
这是一个名为 mininet 的流行网络模拟器的拓扑文件 我创建了一个 MultiSwitch() 类,我想将其传递给我的 Topology 类以用作默认开关 有没有办法做到这一点?我对Python不
是否可以 ping mininet ip?我发现 mininet 的 ip 以 10.0.2.15 开头。我可以从 mininet ping 到其他人。但是,我无法 ping 通其他地方的 minin
当我尝试安装 Mininet 时出现以下错误: Installing Mininet core ~/mininet ~ cc -DVERSION=\"PYTHONPATH=. bin/mn --ver
我需要模拟一个由交换机连接的 n 台主机的网络。最完美的工具似乎是 mininet。问题是我需要在每个使用主机名的主机上运行一个 python 脚本。脚本根据主机名的不同而有所不同,所以这对我来说非常
我是一名优秀的程序员,十分优秀!