1.作业要求:

作业链接

参考资料:

Ryu控制器的API文档:ryu.app.ofctl_rest

Ryu的拓扑展示

助教博客:基于RYU restful api实现的VLAN网络虚拟化

2.具体操作步骤与截图说明:

实验环境:

  • 虚拟机:VMware Workstation Pro

  • 操作系统:ubuntu-16.04

实验拓扑:

  • 给定的实验拓扑图如下所示:

  • 编写Python脚本mytopo.py,完成拓扑搭建,实验代码如下所示:
from mininet.topo import Topo
class Topo2( Topo ):
def __init__( self ):
# Initialize topology
Topo.__init__( self ) # add switches
s1 = self.addSwitch('s1')
s2 = self.addSwitch('s2') # add hosts
h1 = self.addHost('h1')
h2 = self.addHost('h2')
h3 = self.addHost('h3')
h4 = self.addHost('h4')
h5 = self.addHost('h5')
h6 = self.addHost('h6') # add links
self.addLink(h1,s1,1,1)
self.addLink(h2,s1,1,2)
self.addLink(h3,s1,1,3)
self.addLink(s1,s2,4,4)
self.addLink(h4,s2,1,1)
self.addLink(h5,s2,1,2)
self.addLink(h6,s2,1,3) topos = { 'mytopo': ( lambda: Topo2() ) }
  • 输入如下命令运行Python脚本sy6_topo.py,其结果如下所示:
sudo mn --custom ./sy6_topo.py --topo mytopo --controller=remote,ip=127.0.0.1,port=6653 --switch ovsk,protocols=OpenFlow13

  • 使用net查看端口连接情况并测试主机之间的连通性:



  • 进入ryu/ryu/app文件,打开终端运行如下命令,连接ryu控制器:
ryu-manager ofctl_rest.py

使用Ryu的REST API下发流表实现和第2次实验同样的VLAN:

  • 根据端口连接情况,编写脚本a.sh,脚本内容如下所示:
#交换机s1的脚本:
#交换机s1接收从1号端口发送来的数据包,从4号端口将其转发给s2
curl -X POST -d '{
"dpid": 1, #dpid代表交换机的编号,“1”代表交换机s1
"priority":1,
"match":{
"in_port":1
},
"actions":[
{
"type": "PUSH_VLAN", # 给进入交换机的包打上vlan_tag
"ethertype": 33024 # 帧类型0x8100(=33024): 表示IEEE 802.1Q的VLAN数据帧
},
{
"type": "SET_FIELD",
"field": "vlan_vid", # 设置VLAN ID
"value": 4096 # 设置vlan_id的值
},
{
"type": "OUTPUT",
"port": 4
}
]
}' http://127.0.0.1:8080/stats/flowentry/add
#交换机s1接收从2号端口发送来的数据包,从4号端口将其转发给s2
curl -X POST -d '{
"dpid": 1,
"priority":1,
"match":{
"in_port":2
},
"actions":[
{
"type": "PUSH_VLAN", # 给进入交换机的包打上vlan_tag
"ethertype": 33024 # 帧类型0x8100(=33024): 表示IEEE 802.1Q的VLAN数据帧
},
{
"type": "SET_FIELD",
"field": "vlan_vid", # 设置VLAN ID
"value": 4097 # 设置vlan_id的值
},
{
"type": "OUTPUT",
"port": 4
}
]
}' http://127.0.0.1:8080/stats/flowentry/add
#交换机s1接收从3号端口发送来的数据包,从4号端口将其转发给s2
curl -X POST -d '{
"dpid": 1,
"priority":1,
"match":{
"in_port":3
},
"actions":[
{
"type": "PUSH_VLAN", # 给进入交换机的包打上vlan_tag
"ethertype": 33024 # 帧类型0x8100(=33024): 表示IEEE 802.1Q的VLAN数据帧
},
{
"type": "SET_FIELD",
"field": "vlan_vid", # 设置VLAN ID
"value": 4098 # 设置vlan_id的值
},
{
"type": "OUTPUT",
"port": 4
}
]
}' http://127.0.0.1:8080/stats/flowentry/add #交换机s1将收到的数据包根据其对应的vlan_tag从端口1转发
curl -X POST -d '{
"dpid": 1,
"priority":1,
"match":{
"dl_vlan": "0"
},
"actions":[
{
"type": "POP_VLAN", # 给进入交换机的包去除 vlan_tag
},
{
"type": "OUTPUT",
"port": 1
}
]
}' http://localhost:8080/stats/flowentry/add
#交换机s1将收到的数据包根据其对应的vlan_tag从端口2转发
curl -X POST -d '{
"dpid": 1,
"priority":1,
"match":{
"dl_vlan": "1"
},
"actions":[
{
"type": "POP_VLAN", # 给进入交换机的包去除 vlan_tag
},
{
"type": "OUTPUT",
"port": 2
}
]
}' http://localhost:8080/stats/flowentry/add
#交换机s1将收到的数据包根据其对应的vlan_tag从端口3转发
curl -X POST -d '{
"dpid": 1,
"priority":1,
"match":{
"dl_vlan": "2"
},
"actions":[
{
"type": "POP_VLAN", # 给进入交换机的包去除 vlan_tag
},
{
"type": "OUTPUT",
"port": 3
}
]
}' http://localhost:8080/stats/flowentry/add #交换机s2的脚本:
#交换机s2接收从1号端口发送来的数据包,从4号端口将其转发给s1
curl -X POST -d '{
"dpid": 2, #dpid代表交换机的编号,“2”代表交换机s2
"priority":1,
"match":{
"in_port":1
},
"actions":[
{
"type": "PUSH_VLAN", # 给进入交换机的包打上vlan_tag
"ethertype": 33024 # 帧类型0x8100(=33024): 表示IEEE 802.1Q的VLAN数据帧
},
{
"type": "SET_FIELD",
"field": "vlan_vid", # 设置VLAN ID
"value": 4096 # 设置vlan_id的值
},
{
"type": "OUTPUT",
"port": 4
}
]
}' http://127.0.0.1:8080/stats/flowentry/add
#交换机s2接收从2号端口发送来的数据包,从4号端口将其转发给s1
curl -X POST -d '{
"dpid": 2,
"priority":1,
"match":{
"in_port":2
},
"actions":[
{
"type": "PUSH_VLAN", # 给进入交换机的包打上vlan_tag
"ethertype": 33024 # 帧类型0x8100(=33024): 表示IEEE 802.1Q的VLAN数据帧
},
{
"type": "SET_FIELD",
"field": "vlan_vid", # 设置VLAN ID
"value": 4097 # 设置vlan_id的值
},
{
"type": "OUTPUT",
"port": 4
}
]
}' http://127.0.0.1:8080/stats/flowentry/add
#交换机s2接收从3号端口发送来的数据包,从4号端口将其转发给s1
curl -X POST -d '{
"dpid": 2,
"priority":1,
"match":{
"in_port":3
},
"actions":[
{
"type": "PUSH_VLAN", # 给进入交换机的包打上vlan_tag
"ethertype": 33024 # 帧类型0x8100(=33024): 表示IEEE 802.1Q的VLAN数据帧
},
{
"type": "SET_FIELD",
"field": "vlan_vid", # 设置VLAN ID
"value": 4098 # 设置vlan_id的值
},
{
"type": "OUTPUT",
"port": 4
}
]
}' http://127.0.0.1:8080/stats/flowentry/add #交换机s2将收到的数据包根据其对应的vlan_tag从端口1转发
curl -X POST -d '{
"dpid": 2,
"priority":1,
"match":{
"dl_vlan": "0"
},
"actions":[
{
"type": "POP_VLAN", # 给进入交换机的包去除 vlan_tag
},
{
"type": "OUTPUT",
"port": 1
}
]
}' http://localhost:8080/stats/flowentry/add
##交换机s2将收到的数据包根据其对应的vlan_tag从端口2转发
curl -X POST -d '{
"dpid": 2,
"priority":1,
"match":{
"dl_vlan": "1"
},
"actions":[
{
"type": "POP_VLAN", # 给进入交换机的包去除 vlan_tag
},
{
"type": "OUTPUT",
"port": 2
}
]
}' http://localhost:8080/stats/flowentry/add
#交换机s2将收到的数据包根据其对应的vlan_tag从端口3转发
curl -X POST -d '{
"dpid": 2,
"priority":1,
"match":{
"dl_vlan": "2"
},
"actions":[
{
"type": "POP_VLAN", # 给进入交换机的包去除 vlan_tag
},
{
"type": "OUTPUT",
"port": 3
}
]
}' http://localhost:8080/stats/flowentry/add
  • 编写好脚本之后,打开终端用下列命令运行脚本文件a.sh:
sudo bash a.sh

  • 在RYU控制器端可以查看到下发的流表已经被接收:

  • 再次测试主机之间的连通性:

  • 在下发完所有流表后,查看s1的流表如下所示:

  • 在下发完所有流表后,查看s2的流表如下所示:

从主机之间连通性的测试结果中可以看出,我们得到了和第2次实验同样的VLAN。

(3)对比两种方法,写出你的实验体会:

相比于使用Ryu的REST API下发流表和直接在Open vSwitch下发流表这两种方法,使用Ryu的REST API下发流表会更简单一些,直接编写然后运行一个shell脚本,就能按照需求自动配置好所有的设备,比Open vSwitch一一配置更容易修改,也更容易理解和实现。

实验中先在Win 10系统中的EditPlus中编写脚本,再转入Linux运行,因为格式问题导致一直报错导致运行不了,下次应该直接再Linux的gedit中编写,这样能避免不必要的错误。

2019 SDN第6次上机作业的更多相关文章

  1. 2019 SDN第五次上机作业

    2019 SDN第五次上机作业 作业链接 1.浏览RYU官网学习RYU控制器的安装和RYU开发入门教程,提交对于教程代 码的理解,包括但不限于: 安装RYU控制器并测试 安装教程 安装过程及遇到各种问 ...

  2. 2019 SDN第四次上机作业

    作业博客链接:http://edu.cnblogs.com/campus/fzu/fzusdn2019/homework/10017 1. 解压安装OpenDayLight控制器(本次实验统一使用Be ...

  3. 2019 SDN第三次上机作业

    作业要求: 利用Mininet仿真平台构建给定的网络拓扑,配置主机h1和h2的IP地址(h1:10.0.0.1,h2:10.0.0.2),测试两台主机之间的网络连通性: 利用Wireshark工具,捕 ...

  4. 2019 SDN第3次上机作业

    0.报文类型与含义 1.Controller-to-Switch 报文 ​ Cortoller-to-Switch是由控制器初始化并下发给交换机的报文类型,其可能会要求交换机回复对应的报文,此类型报文 ...

  5. SDN第5次上机作业

    SDN第5次上机作业 实验目的 1.搭建如下拓扑并连接控制器 2.下发相关流表和组表实现负载均衡 3.抓包分析验证负载均衡 实验步骤 1.建立以下拓扑,并连接上ODL控制器. 提交要求:ODL拓扑界面 ...

  6. SDN 第三次上机作业

    SDN 第三次上机作业 1.创建拓扑 2.利用OVS命令下发流表,实现vlan功能 3.利用OVS命令查看流表 s1: s2: 4.验证性测试 5.Wireshark 抓包验证

  7. SDN第五次上机作业

    作业链接 1.建立拓扑,并连接上ODL控制器. 2.利用ODL下发组表.流表,实现建议负载均衡 查看s2接收的数据包都被drop掉了 在s1中下发组表 在s1中下发流表使组表生效 下发流表覆盖S2中d ...

  8. SDN第三次上机作业

    作业链接 1.创建以下拓扑(可采用任意方式) 2.利用OVS命令下发流表,实现VLAN功能 3.利用OVS命令查看流表 4.验证性测试 5.Wireshark抓包验证

  9. SDN第4次上机作业

    作业链接 1.建立以下拓扑,并连接上ODL控制器. ODL拓扑界面截图: 安装odl参考链接 2.利用ODL下发流表,使得h3在10s内ping不通h1,10s后恢复. 验证性连通性截图: 将hard ...

随机推荐

  1. Python进阶(九)----json模块, pickle模块, os模块,sys模块,hashlib模块

    Python进阶----json模块, pickle模块, os模块,sys模块,hashlib模块 一丶序列化模块 什么是序列化: ​ 将一种数据结构,转换成一个特殊的序列(特殊字符串,用于网络传输 ...

  2. python基础知识(二)

    python基础知识(二) 字符串格式化 ​ 格式: % 类型 ---- > ' %类型 ' %(数据) %s 字符串 ​ print(' %s is boy'%('tom')) ----> ...

  3. Node和浏览器端所支持的模块规范不同

  4. element-ui select多选情况下获取label和value

    直接上代码 <el-select v-model="value" multiple collapse-tags ref="select" @change= ...

  5. Java 之 Response 文件下载案例

    文件下载需求: 1. 页面显示超链接 2. 点击超链接后弹出下载提示框 3. 完成图片文件下载 分析过程: 1. 超链接指向的资源如果能够被浏览器解析,则在浏览器中展示,如果不能解析,则弹出下载提示框 ...

  6. Pod和Namespace的基本介绍

    namespace资源名称空间 删除namespace资源会级联删除其所包含的所有其它资源对象    名称空间仅仅只是用来限制资源名称的作用域      并不能实现Pod的通信隔离 在名称空间下操作s ...

  7. C++ primer学习笔记_6_函数---函数定义、参数传递

    1. 习题参考: 6.14 举一个形参应该是引用类型的例子,再举一个形参不能是引用类型的例子. 答: 形参使用引用类型的情况:(1)避免拷贝传递大对象的时候,这里的string对象s:(2)当需要从函 ...

  8. SolarWinds-改变端口

    Solarwinds配置文件,修改为80端口(默认为8123) C:\Program Files\SolarWinds\DPA\iwc\tomcat\conf\server.xml

  9. spring cloud (二) 服务提供者 EuekaClient

    1 创建一个springboot项目  spring-cloud-service-a  注册到eureka服务注册中心中 项目添加依赖 <dependency> <groupId&g ...

  10. LoadRunner 11的破解方法和license号

    安装过程中遇到“命令行选项语法错误键入命令 \?获得帮助”2005的安装问题,可参考本文:http://www.cnblogs.com/lelexiong/p/8974149.html解决 破解方法: ...