实验7:基于REST API的SDN北向应用实践

实验报告

1-1:搭建如下拓扑,连接OpenDatlight

实验7:基于REST API的SDN北向应用实践

  • 创建拓扑
    sudo mn --topo=single,3 --controller=remote,ip=127.0.0.1,port=6633 --switch ovsk,protocols=OpenFlow10
  • 连接OpenDatlight
    ./distribution-karaf-0.6.4-Carbon/bin/karaf

1-2:编写Python程序,调用OpenDaylight的北向接口下发指令删除s1上的流表数据。

实验7:基于REST API的SDN北向应用实践

1-3:编写Python程序,调用OpenDaylight的北向接口下发硬超时流表,实现拓扑内主机h1和h3网络中断20s。

  • 下发流表
    实验7:基于REST API的SDN北向应用实践
  • 流表
    实验7:基于REST API的SDN北向应用实践
  • 结果
    实验7:基于REST API的SDN北向应用实践

1-4:编写Python程序,调用OpenDaylight的北向接口获取s1上活动的流表数。

实验7:基于REST API的SDN北向应用实践

  • 结果
    实验7:基于REST API的SDN北向应用实践

2-1:编写Python程序,调用Ryu的北向接口,实现上述OpenDaylight实验拓扑上相同的硬超时流表下发。

  • 下发流表
    实验7:基于REST API的SDN北向应用实践
  • 流表
    实验7:基于REST API的SDN北向应用实践
  • 结果
    实验7:基于REST API的SDN北向应用实践

2-2:利用Mininet平台搭建下图所示网络拓扑,要求支持OpenFlow 1.3协议,主机名、交换机名以及端口对应正确。拓扑生成后需连接Ryu,且Ryu应能够提供REST API服务。

实验7:基于REST API的SDN北向应用实践

  • topo.py
    实验7:基于REST API的SDN北向应用实践
  • 连接ryu
    实验7:基于REST API的SDN北向应用实践
  • 构建拓扑
    实验7:基于REST API的SDN北向应用实践

整理一个Shell脚本,参考Ryu REST API的文档,利用curl命令,实现和实验2相同的VLAN。

VLAN_ID Hosts
0 h1 h3
1 h2 h4
  • 先运行指令删除流表
    curl -X DELETE http://localhost:8080/stats/flowentry/clear/1
    curl -X DELETE http://localhost:8080/stats/flowentry/clear/2
  • 编写shell脚本

curl -X POST -d '{
    "dpid": 1,
    "priority": 1,
    "match":{
        "in_port": 1
    },
    "actions":[
        {
            "type": "PUSH_VLAN",     
            "ethertype": 33024       
        },
        {
            "type": "SET_FIELD",
            "field": "vlan_vid",    
            "value": 4096            
        },
        {
            "type": "OUTPUT",
            "port": 3
        }
    ]
 }' http://localhost:8080/stats/flowentry/add

 curl -X POST -d '{
    "dpid": 1,
    "priority": 1,
    "match":{
        "in_port": 2
    },
    "actions":[
        {
            "type": "PUSH_VLAN",    
            "ethertype": 33024      
        },
        {
            "type": "SET_FIELD",
            "field": "vlan_vid",     
            "value": 4097           
        },
        {
            "type": "OUTPUT",
            "port": 3
        }
    ]
 }' http://localhost:8080/stats/flowentry/add

 curl -X POST -d '{
    "dpid": 1,
    "priority": 1,
    "match":{
        "vlan_vid": 0
    },
    "actions":[
        {
            "type": "POP_VLAN",    
            "ethertype": 33024       
        },
        {
            "type": "OUTPUT",
            "port": 1
        }
    ]
 }' http://localhost:8080/stats/flowentry/add

 curl -X POST -d '{
    "dpid": 1,
    "priority": 1,
    "match":{
        "vlan_vid": 1
    },
    "actions":[
        {
            "type": "POP_VLAN",    
            "ethertype": 33024      
        },
        {
            "type": "OUTPUT",
            "port": 2
        }
    ]
 }' http://localhost:8080/stats/flowentry/add

 curl -X POST -d '{
    "dpid": 2,
    "priority": 1,
    "match":{
        "in_port": 1
    },
    "actions":[
        {
            "type": "PUSH_VLAN",    
            "ethertype": 33024      
        },
        {
            "type": "SET_FIELD",
            "field": "vlan_vid",    
            "value": 4096          
        },
        {
            "type": "OUTPUT",
            "port": 3
        }
    ]
 }' http://localhost:8080/stats/flowentry/add

 curl -X POST -d '{
    "dpid": 2,
    "priority": 1,
    "match":{
        "in_port": 2
    },
    "actions":[
        {
            "type": "PUSH_VLAN",    
            "ethertype": 33024      
        },
        {
            "type": "SET_FIELD",
            "field": "vlan_vid",   
            "value": 4097           
        },
        {
            "type": "OUTPUT",
            "port": 3
        }
    ]
 }' http://localhost:8080/stats/flowentry/add

 curl -X POST -d '{
    "dpid": 2,
    "priority": 1,
    "match":{
        "vlan_vid": 0
    },
    "actions":[
        {
            "type": "POP_VLAN",    
            "ethertype": 33024      
        },
        {
            "type": "OUTPUT",
            "port": 1
        }
    ]
 }' http://localhost:8080/stats/flowentry/add

 curl -X POST -d '{
    "dpid": 2,
    "priority": 1,
    "match":{
        "vlan_vid": 1
    },
    "actions":[
        {
            "type": "POP_VLAN",    
            "ethertype": 33024      
        },
        {
            "type": "OUTPUT",
            "port": 2
        }
    ]
 }' http://localhost:8080/stats/flowentry/add

  • 运行shell脚本
    实验7:基于REST API的SDN北向应用实践
  • pingall结果
    实验7:基于REST API的SDN北向应用实践

实验总结

本次实验难度较大,需要编写大量代码来实现。由于没学过编写相关代码,做起来有点难度。在实验中遇到了挺多问题,在连接ryu的时候直接在ryu文件夹下调用连接指令,结果导致连接错误。在创建拓扑的时候,由于先连接ryu后创建拓扑,导致拓扑的pingall全不通。以及调用shell脚本时,没有用
curl -X DELETE http://localhost:8080/stats/flowentry/clear/1
curl -X DELETE http://localhost:8080/stats/flowentry/clear/2
来删除流表,导致出错。调用指令时显示curl未安装,调用
sudo apt-get install curl
安装解决问题
通过这次实验,学到了通过用编写程序用opendaylight或ryu对网络的北向接口进行控制,以及划分vlan网络

上一篇:python 正态分布


下一篇:nrf52832蓝牙开发踩过的坑