zoukankan      html  css  js  c++  java
  • SDN第七次上机作业

    ODL

    topology搭建代码

    sudo mn --topo=single,3 --controller=remote,ip=127.0.0.1,port=6633 --switch ovsk,protocols=OpenFlow13
    

    流表删除代码

    #!/usr/bin/python
    import requests
    from requests.auth import HTTPBasicAuth
    
    if __name__ == "__main__":
        url = 'http://127.0.0.1:8181/restconf/config/opendaylight-inventory:nodes/node/openflow:1/'
        headers = {'Content-Type': 'application/json'}
        res = requests.delete(url, headers=headers, auth=HTTPBasicAuth('admin', 'admin'))
        print (res.content)
    
    

    实现硬超时流表代码

    #!/usr/bin/python
    import requests
    from requests.auth import HTTPBasicAuth
    
    if __name__ == "__main__":
        url = 'http://127.0.0.1:8181/restconf/config/opendaylight-inventory:nodes/node/openflow:1/flow-node-inventory:table/0/flow/1'
        with open("./flowtable.json") as f:
            jstr = f.read()
        headers = {'Content-Type': 'application/json'}
        res = requests.put(url, jstr, headers=headers, auth=HTTPBasicAuth('admin', 'admin'))
        print (res.content)
    

    flowtable.json文件内容如下

    
      "flow": [
        {
          "id": "1",
          "match": {
            "in-port": "1",
            "ethernet-match": {
              "ethernet-type": {
                "type": "0x0800"
              }
            },
            "ipv4-destination": "10.0.0.3/32"
          },
          "instructions": {
            "instruction": [
              {
                "order": "0",
                "apply-actions": {
                  "action": [
                    {
                      "order": "0",
                      "drop-action": {}
                    }
                  ]
                }
              }
            ]
          },
          "flow-name": "flow1",
          "priority": "65535",
          "hard-timeout": "20",
          "cookie": "2",
          "table_id": "0"
        }
      ]
    }
    

    获取流表数代码

    #!/usr/bin/python
    import requests
    from requests.auth import HTTPBasicAuth
    
    if __name__ == "__main__":
        url = 'http://127.0.0.1:8181/restconf/operational/opendaylight-inventory:nodes/node/openflow:1/flow-node-inventory:table/0/opendaylight-flow-table-statistics:flow-table-statistics'
        headers = {'Content-Type': 'application/json'}
        res = requests.get(url,headers=headers, auth=HTTPBasicAuth('admin', 'admin'))
        print (res.content)
    

    Ryu

    Ryu硬超时代码

    #!/usr/bin/python
    import requests
    
    if __name__ == "__main__":
        url = 'http://127.0.0.1:8080/stats/flowentry/add'
        with open("./flowtable.json") as f:
            jstr = f.read()
        headers = {'Content-Type': 'application/json'}
        res = requests.put(url, jstr, headers=headers)
        print (res.content)
    

    flowtable.josn

    {
        "dpid": 1,
        "cookie": 1,
        "cookie_mask": 1,
        "table_id": 0,
        "hard_timeout": 20,
        "priority": 65535,
        "flags": 1,
        "match":{
            "in_port":1
        },
        "actions":[
    
        ]
     }
    

    搭建网络topo代码

    #!/usr/bin/env python
    from mininet.topo import Topo
    
    class MyTopo(Topo):
        def __init__(self):
            # initilaize topology
            Topo.__init__(self)
    
            self.addSwitch("s1")
            self.addSwitch("s2")
    
            self.addHost("h1")
            self.addHost("h2")
            self.addHost("h3")
            self.addHost("h4")
    
            self.addLink("s1", "h1")
            self.addLink("s1", "h2")
            self.addLink("s2", "h3")
            self.addLink("s2", "h4")
            self.addLink("s1", "s2")
    
    topos = {'mytopo': (lambda: MyTopo())}
    

    利用脚本实现VLAN划分

    curl -X POST -d '{
        "dpid": 1,
        "priority": 1,
        "match":{
            "in_port": 1
        },
        "actions":[
            {
                "type": "PUSH_VLAN",     # Push a new VLAN tag if a input frame is non-VLAN-tagged
                "ethertype": 33024       # Ethertype 0x8100(=33024): IEEE 802.1Q VLAN-tagged frame
            },
            {
                "type": "SET_FIELD",
                "field": "vlan_vid",     # Set VLAN ID
                "value": 4096            # Describe sum of vlan_id(e.g. 6) | OFPVID_PRESENT(0x1000=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",     # Push a new VLAN tag if a input frame is non-VLAN-tagged
                "ethertype": 33024       # Ethertype 0x8100(=33024): IEEE 802.1Q VLAN-tagged frame
            },
            {
                "type": "SET_FIELD",
                "field": "vlan_vid",     # Set VLAN ID
                "value": 4097            # Describe sum of vlan_id(e.g. 6) | OFPVID_PRESENT(0x1000=4096)
            },
            {
                "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",     # Push a new VLAN tag if a input frame is non-VLAN-tagged
                "ethertype": 33024       # Ethertype 0x8100(=33024): IEEE 802.1Q VLAN-tagged frame
            },
            {
                "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",     # Push a new VLAN tag if a input frame is non-VLAN-tagged
                "ethertype": 33024       # Ethertype 0x8100(=33024): IEEE 802.1Q VLAN-tagged frame
            },
            {
                "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",     # Push a new VLAN tag if a input frame is non-VLAN-tagged
                "ethertype": 33024       # Ethertype 0x8100(=33024): IEEE 802.1Q VLAN-tagged frame
            },
            {
                "type": "SET_FIELD",
                "field": "vlan_vid",     # Set VLAN ID
                "value": 4096            # Describe sum of vlan_id(e.g. 6) | OFPVID_PRESENT(0x1000=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",     # Push a new VLAN tag if a input frame is non-VLAN-tagged
                "ethertype": 33024       # Ethertype 0x8100(=33024): IEEE 802.1Q VLAN-tagged frame
            },
            {
                "type": "SET_FIELD",
                "field": "vlan_vid",     # Set VLAN ID
                "value": 4097            # Describe sum of vlan_id(e.g. 6) | OFPVID_PRESENT(0x1000=4096)
            },
            {
                "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",     # Push a new VLAN tag if a input frame is non-VLAN-tagged
                "ethertype": 33024       # Ethertype 0x8100(=33024): IEEE 802.1Q VLAN-tagged frame
            },
            {
                "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",     # Push a new VLAN tag if a input frame is non-VLAN-tagged
                "ethertype": 33024       # Ethertype 0x8100(=33024): IEEE 802.1Q VLAN-tagged frame
            },
            {
                "type": "OUTPUT",
                "port": 2
            }
        ]
     }' http://localhost:8080/stats/flowentry/add
    

    进阶要求

    #!/usr/bin/python
    import json
    
    import requests
    
    if __name__ == "__main__":
        url = 'http://127.0.0.1:8080/stats/flowentry/add'
        headers = {'Content-Type': 'application/json'}
        flow1 = {
            "dpid": 1,
            "priority": 1,
            "match":{
                "in_port": 1
            },
            "actions":[
                {
                    "type": "PUSH_VLAN",     # Push a new VLAN tag if a input frame is non-VLAN-tagged
                    "ethertype": 33024       # Ethertype 0x8100(=33024): IEEE 802.1Q VLAN-tagged frame
                },
                {
                    "type": "SET_FIELD",
                    "field": "vlan_vid",     # Set VLAN ID
                    "value": 4096            # Describe sum of vlan_id(e.g. 6) | OFPVID_PRESENT(0x1000=4096)
                },
                {
                    "type": "OUTPUT",
                    "port": 3
                }
            ]
        }
        flow2 = {
            "dpid": 1,
            "priority": 1,
            "match":{
                "in_port": 2
            },
            "actions":[
                {
                    "type": "PUSH_VLAN",     # Push a new VLAN tag if a input frame is non-VLAN-tagged
                    "ethertype": 33024       # Ethertype 0x8100(=33024): IEEE 802.1Q VLAN-tagged frame
                },
                {
                    "type": "SET_FIELD",
                    "field": "vlan_vid",     # Set VLAN ID
                    "value": 4097            # Describe sum of vlan_id(e.g. 6) | OFPVID_PRESENT(0x1000=4096)
                },
                {
                    "type": "OUTPUT",
                    "port": 3
                }
            ]
        }
        flow3 = {
            "dpid": 1,
            "priority": 1,
            "match":{
                "vlan_vid": 0
            },
            "actions":[
                {
                    "type": "POP_VLAN",     # Push a new VLAN tag if a input frame is non-VLAN-tagged
                    "ethertype": 33024       # Ethertype 0x8100(=33024): IEEE 802.1Q VLAN-tagged frame
                },
                {
                    "type": "OUTPUT",
                    "port": 1
                }
            ]
        }
        flow4 = {
            "dpid": 1,
            "priority": 1,
            "match": {
                "vlan_vid": 1
            },
            "actions": [
                {
                    "type": "POP_VLAN",  # Push a new VLAN tag if a input frame is non-VLAN-tagged
                    "ethertype": 33024  # Ethertype 0x8100(=33024): IEEE 802.1Q VLAN-tagged frame
                },
                {
                    "type": "OUTPUT",
                    "port": 2
                }
            ]
        }
        flow5 = {
            "dpid": 2,
            "priority": 1,
            "match": {
                "in_port": 1
            },
            "actions": [
                {
                    "type": "PUSH_VLAN",  # Push a new VLAN tag if a input frame is non-VLAN-tagged
                    "ethertype": 33024  # Ethertype 0x8100(=33024): IEEE 802.1Q VLAN-tagged frame
                },
                {
                    "type": "SET_FIELD",
                    "field": "vlan_vid",  # Set VLAN ID
                    "value": 4096  # Describe sum of vlan_id(e.g. 6) | OFPVID_PRESENT(0x1000=4096)
                },
                {
                    "type": "OUTPUT",
                    "port": 3
                }
            ]
        }
        flow6 = {
            "dpid": 2,
            "priority": 1,
            "match": {
                "in_port": 2
            },
            "actions": [
                {
                    "type": "PUSH_VLAN",  # Push a new VLAN tag if a input frame is non-VLAN-tagged
                    "ethertype": 33024  # Ethertype 0x8100(=33024): IEEE 802.1Q VLAN-tagged frame
                },
                {
                    "type": "SET_FIELD",
                    "field": "vlan_vid",  # Set VLAN ID
                    "value": 4097  # Describe sum of vlan_id(e.g. 6) | OFPVID_PRESENT(0x1000=4096)
                },
                {
                    "type": "OUTPUT",
                    "port": 3
                }
            ]
        }
        flow7 = {
            "dpid": 2,
            "priority": 1,
            "match": {
                "vlan_vid": 0
            },
            "actions": [
                {
                    "type": "POP_VLAN",  # Push a new VLAN tag if a input frame is non-VLAN-tagged
                    "ethertype": 33024  # Ethertype 0x8100(=33024): IEEE 802.1Q VLAN-tagged frame
                },
                {
                    "type": "OUTPUT",
                    "port": 1
                }
            ]
        }
        flow8 = {
            "dpid": 2,
            "priority": 1,
            "match": {
                "vlan_vid": 0
            },
            "actions": [
                {
                    "type": "POP_VLAN",  # Push a new VLAN tag if a input frame is non-VLAN-tagged
                    "ethertype": 33024  # Ethertype 0x8100(=33024): IEEE 802.1Q VLAN-tagged frame
                },
                {
                    "type": "OUTPUT",
                    "port": 1
                }
            ]
        }
        res1 = requests.post(url, json.dumps(flow1), headers=headers)
        res2 = requests.post(url, json.dumps(flow2), headers=headers)
        res3 = requests.post(url, json.dumps(flow3), headers=headers)
        res4 = requests.post(url, json.dumps(flow4), headers=headers)
        res5 = requests.post(url, json.dumps(flow5), headers=headers)
        res6 = requests.post(url, json.dumps(flow6), headers=headers)
        res7 = requests.post(url, json.dumps(flow7), headers=headers)
        res8 = requests.post(url, json.dumps(flow8), headers=headers)
    

    个人心得

    这次作业完全体现了SDN可编程的特性。在实验阶段,参考了老师的博客,完成了这次实验,在实验阶段也遇到了一些小挫折。在Ryu阶段,要调用ofctl_rest APP,才能实现流表下发等功能。

  • 相关阅读:
    NetCore入门篇:(十)Net Core项目使用Cookies
    NetCore入门篇:(九)Net Core项目使用Session及用Redis做分布式
    NetCore入门篇:(八)Net Core项目使用Controller之三
    NetCore入门篇:(七)Net Core项目使用Controller之二
    NetCore入门篇:(六)Net Core项目使用Controller之一
    NetCore入门篇:(五)Net Core项目使用静态文件
    NetCore入门篇:(四)Net Core项目启动文件Startup
    NetCore入门篇:(三)Net Core项目Nuget及Bower包管理
    NetCore入门篇:(二)Net Core项目创建
    NetCore入门篇:(一)Net Core环境安装
  • 原文地址:https://www.cnblogs.com/fcw245838813/p/15441257.html
Copyright © 2011-2022 走看看