RYU実戦,REST APIフローチャート制御(2)


前言


RYU APIフローテーブル制御(1)では,RYUが提供するREST APIを介してフローテーブルプロジェクトを取得する方法を紹介し,この節では,RESTを用いてフローテーブルを追加,削除,修正する方法を探る.

じっけんトポロジー


コントローラ:RYU(192.168.1.1196)スイッチ:s 1,s 2ホスト:h 1,h 2,h 3,h 3接続性(直結):h 1 s 1;h2s1 h3s2;h 4 s 2 s 1 s 2トポロジーコードは以下の通りである.
__author__ = 'jmh081701'
from mininet.topo import Topo
class MyTopo(Topo):
    def __init__(self):
        Topo.__init__(self)
        left=[]
        left.append(self.addHost("h1"))
        left.append(self.addHost("h2"))
        right=[]
        right.append(self.addHost("h3"))
        right.append(self.addHost("h4"))
        switchs=[]
        switchs.append(self.addSwitch("s1"))
        switchs.append(self.addSwitch("s2"))

        self.addLink(left[0],switchs[0])
        self.addLink(left[1],switchs[0])
        self.addLink(right[0],switchs[1])
        self.addLink(right[1],switchs[1])
        self.addLink(switchs[0],switchs[1])


topos={'mytopo':(lambda : MyTopo())}

mnおよびコントローラの起動


しょきせつぞくしけん

(mininet)>pingall
 *** Ping: testing ping reachability
H1 -> H2 H3 H4 
H2 -> H1 H3 H4 
H3 -> H1 H2 H4 
H4 -> H1 H2 H3 
*** Results: 0% dropped (12/12 received)

ok.

現在のフロー・テーブルを取得し、特定のトポロジーを分析します。


現在のフロー・テーブルを削除するには、次の手順に従います。


URL:http://192.168.1.196:8080/stats/flowentry/clear/1方法:delete URL:http://192.168.1.196:8080/stats/flowentry/clear/2メソッド:delete

S 1のフローチャートを取得する:


h 1 ping h 2
mininet>h1 ifconfig
H1-eth0   Link encap:Ethernet  HWaddr f2:45:ed:50:45:f9  
          inet addr:10.0.0.1  Bcast:10.255.255.255  Mask:255.0.0.0
        ···
mininet>h1 ping h2

URL: http://192.168.1.196:8080/stats/flow/1方法:GET
{
    "1": [
        {
            "actions": [
                "OUTPUT:1"
            ],
            "idle_timeout": 0,
            "cookie": 0,
            "packet_count": 7,
            "hard_timeout": 0,
            "byte_count": 574,
            "duration_sec": 12,
            "duration_nsec": 58000000,
            "priority": 1,
            "length": 96,
            "flags": 0,
            "table_id": 0,
            "match": {
                "dl_dst": "f2:45:ed:50:45:f9",
                "in_port": 2
            }
        },
        {
            "actions": [
                "OUTPUT:2"
            ],
            "idle_timeout": 0,
            "cookie": 0,
            "packet_count": 6,
            "hard_timeout": 0,
            "byte_count": 532,
            "duration_sec": 12,
            "duration_nsec": 54000000,
            "priority": 1,
            "length": 96,
            "flags": 0,
            "table_id": 0,
            "match": {
                "dl_dst": "ba:d9:2d:31:ba:73",
                "in_port": 1
            }
        },
        {
            "actions": [
                "OUTPUT:CONTROLLER"
            ],
            "idle_timeout": 0,
            "cookie": 0,
            "packet_count": 52,
            "hard_timeout": 0,
            "byte_count": 5739,
            "duration_sec": 73,
            "duration_nsec": 68000000,
            "priority": 0,
            "length": 80,
            "flags": 0,
            "table_id": 0,
            "match": {}
        }
    ]
}

分析:「f 2:45:ed:50:45:f 9」(h 1)とS 1の1番口子直結「ba:d 9:2 d:31:ba:73」(h 2)とS 1の2番口子直結

取得S 2のフローテーブル

mininet>h3 ifconfig
H3-eth0   Link encap:Ethernet  HWaddr 6e:32:5b:d2:a5:cb  
          inet addr:10.0.0.3  Bcast:10.255.255.255  Mask:255.0.0.0
        ···
mininet>h3 ping h4

スイッチ2のフローテーブルエントリURLは、H 3とH 4を相互接続して取得する:http://192.168.1.196:8080/stats/flow/2方法:GET
{
    "2": [
        {
            "actions": [
                "OUTPUT:2"
            ],
            "idle_timeout": 0,
            "cookie": 0,
            "packet_count": 3,
            "hard_timeout": 0,
            "byte_count": 182,
            "duration_sec": 7,
            "duration_nsec": 981000000,
            "priority": 1,
            "length": 96,
            "flags": 0,
            "table_id": 0,
            "match": {
                "dl_dst": "6e:32:5b:d2:a5:cb",
                "in_port": 3
            }
        },
        {
            "actions": [
                "OUTPUT:3"
            ],
            "idle_timeout": 0,
            "cookie": 0,
            "packet_count": 2,
            "hard_timeout": 0,
            "byte_count": 140,
            "duration_sec": 7,
            "duration_nsec": 978000000,
            "priority": 1,
            "length": 96,
            "flags": 0,
            "table_id": 0,
            "match": {
                "dl_dst": "8a:4f:1b:f4:b0:93",
                "in_port": 2
            }
        },
        {
            "actions": [
                "OUTPUT:CONTROLLER"
            ],
            "idle_timeout": 0,
            "cookie": 0,
            "packet_count": 55,
            "hard_timeout": 0,
            "byte_count": 6187,
            "duration_sec": 382,
            "duration_nsec": 843000000,
            "priority": 0,
            "length": 80,
            "flags": 0,
            "table_id": 0,
            "match": {}
        }
    ]
}

結論:
"6e:32:5b:d2:a5:cb"h3)  S2 2     
"8a:4f:1b:f4:b0:93" (h4)  S2 3     

結論


上の作業は意味がないわけではないが,フローチャートにより,各ホストのMacアドレスと,各ホストとスイッチの直結ポートの関係が得られ,これは次の実験にとって重要である.特に一致フィールド

フローテーブルの追加と変更


フローテーブルの追加


URL:http://192.168.1.196:8080/stats/flowentry/add方法:POST属性:dpid:データパスiD、簡単に理解するとスイッチのID、int table_id:フローテーブルエントリが存在するターゲットフローテーブルID、簡単に理解すると、このフローテーブルエントリをそのテーブルに追加し、int idle_timeout:このフロー・テーブル・アイテムはどのくらい空いているかで失効します.int hard_timeout:このフロー・テーブル・アイテムがどのくらい生きているか、int priority:フロー・テーブル実行の優先度、int match:マッチング・フィールド、dict action:マッチング後のフローが取る動作、list of dictの重要な属性:dpid、priority、match、action例:h 1をh 2に追加する遮断メッセージ、すなわちh 1をh 2にpingできない
{
    "dpid": 1,
    "cookie": 1,
    "cookie_mask": 1,
    "table_id": 0,
    "idle_timeout": 30,
    "hard_timeout": 3000,
    "priority": 11111,
    "flags": 1,
    "match":{
        "eth_src":"f2:45:ed:50:45:f9",
        "eth_dst":"ba:d9:2d:31:ba:73"
    },
    "actions":[

    ]
 }

ここでこのactionは空であり、h 1からh 2へのメッセージテストh 1とh 2との間の接続性を遮断することができる.
mininet>H1 ping H2
mininet> H1 ping H2
PING 10.0.0.2 (10.0.0.2) 56(84) bytes of data.
From 10.0.0.1 icmp_seq=1 Destination Host Unreachable
From 10.0.0.1 icmp_seq=2 Destination Host Unreachable

OK,H 1からH 2への既成抵抗端

フロー・テーブルの変更


ファジイ修正


matchのみを照合し、URLを変更します.http://192.168.1.196:8080/stats/flowentry/add方法:Getの例:
{
    "dpid": 1,
    "cookie": 1,
    "cookie_mask": 1,
    "table_id": 0,
    "idle_timeout": 30,
    "hard_timeout": 3000,
    "priority": 11111,
    "flags": 1,
    "match":{
        "eth_src":"f2:45:ed:50:45:f9",
        "eth_dst":"ba:d9:2d:31:ba:73"
    },
    "actions":[
     { 
    "type": "OUTPUT",
    "port": 2
    }
    ]
 }

マッチングドメインを「eth_src”:”f2:45:ed:50:45:f9”,”eth_dst":"ba:d 9:2 d:31:ba:73"フローテーブル項目は、いずれも2番出口、すなわちH 1とh 2の間の連通を回復するように変更する.

厳密な照合


Matchとpriorityの2つの一致フィールドを一致させ、一致に成功しなければなりません.例:
{
    "dpid": 1,
    "cookie": 1,
    "cookie_mask": 1,
    "table_id": 0,
    "idle_timeout": 300,
    "hard_timeout": 4001,
    "priority": 11112,
    "flags": 1,
    "match":{
        "eth_dst":"ba:d9:2d:31:ba:73"
    },
    "actions":[
    ]
 }

TIP:削除するときはmatchフィールドとpriorityを記入すればいい

ストリームテーブルの削除


ファジイ削除フローテーブル


URL: http://192.168.1.196:8080/stats/flowentry/delete方法:POSTはあいまいな修正と類似して、matchフィールドは一致してすぐ

フロー・テーブルの厳密な削除


URL: http://192.168.1.196:8080/stats/flowentry/delete_strict方法:POSTは厳格な修正と類似しており、matchはpriorityと同時に一致して削除される.

すべてのフロー・テーブルの削除


上記の方法は、単一のフロー・テーブル・アイテムを削除するだけです.スイッチのすべてのフロー・テーブル・アイテムを削除する場合は、URL:http://192.168.1.196:8080/stats/flowentry/clear/xスイッチxのすべてのフロー・テーブル・アイテムを削除します.xはスイッチのdpidメソッドです.POST

一致フィールドの使用方法:


Openflow 1.3,1.1,1.2のいずれも使用可能

matchの各フィールドはdictで与えられる


主なキー:in_port:メッセージのエントリ、int dl_src:二層ソースアドレス(ソースMACアドレス),"ff:ff:ff:ff:ff"dl_dst:宛先MACアドレス、「ff:ff:ff:ff:ff」dl_vlan:2層サブネット番号int dl_vlan_pcp:二層サブネット優先度,int dl_type:IPプロトコル、IPv 6プロトコル、ARPプロトコルなどの3層プロトコルタイプ.int
dl_type(自己転入10進)
プロトコルのタイプ
0x0800
IPv4
0x86DD
IPv6
0x0806
ARP
nw_tos:ipサービスタイプ
nw_tos
サービス・タイプ
0
通常(Routine)
1
優先順位
2
即時送信(Immediate)
3
フラッシュ
4
稲妻より稲妻式(Flash Override)
5
CRI/TIC/ECP
6
ネットワーク間制御(Internetwork Control)
7
ネットワーク制御(Network Control)
nw_proto:ipプロトコルに搭載されているプロトコルタイプ、例えばTCP、UDP
nw_proto
プロトコルのタイプ
1
ICMP
2
IGMP
6
TCP
17
UDP
88
IGRP
89
OSPF
nw_src:ソースIPアドレス(IPv 4).str.点分10進法,"192.168.1.1"nw_dst:宛先ipアドレス(IPv 4)tp_src:ネットワーク層のソースポート.int tp_dst:ネットワーク層のポート.int
上位プロトコルの内容を一致させる場合は、たとえば、すべての宛先ポート番号80に一致するTCPメッセージ:match:{「dl_type」:2048、「nw_proto」:6、「tp_dst」:80}を一致させるには、まずTCPデータ・レポートであることを保証しなければなりません.そうしないと、フロー・テーブルは無効になります.