基于ODL与Pica8交换机端到端的限速实验

一、介绍

本实验中,使用OpenDaylight控制器的REST APIs来控制Pica8交换机。使用flow table与meter table(OF1.3的特性)来达到端到端限速的目的。没有实体交换机的同学可以使用CPqD与Mininet来完成实验(安装指南见参考资料1)。目前,OpenvSwitch 2.5不支持meter。

1.1 OF1.3 Meter简介

Meter Table是在OF1.3中引入的一个新概念。个人认为它最与众不同的地方是用它可以实现per-flow的QoS,例如本次实验展示的就是rate-limiting。OVSDB也具有限流功能,但OVSDB的限流只能针对端口(不知道有没有小伙伴成功使用过OVSDB限流的,在本机上测试可行,但是用两台实体机操作暂时还未成功)。

每一个Meter Table表项由三元组构成,Meter Identifier,Meter Bands和Counters。这里介绍一下Meter Bands,在Meter Bands中定义了这个Meter的速率(rate)以及busrt size。不同交换机在拥有相同Meter rate的情况下,不同的burst size会带来不同的限流结果。在某台交换机上,使用rate=8000,burst size=200的时候,实际限流效果为7000多左右,而在另一台交换机上,使用rate=8000,burst size=8000的时候,实际限流效果才为7000多左右。

Band由四元组构成Band Type、Rate、Counters、Type specific arguments。OF1.3中只定义了drop与dscp remark两种类型的band。前者就是当包的速率超过一个阈值的时候,会丢包。dscp remark,当包的速率超过一定阈值的时候,会减少包IP头中的DSCP域的值。上述这个阈值即为rate。

每一个flow entry可以在其instruction域里对应一个meter。

二、实验环境

OpenDaylight distribution-karaf-0.4.1-Beryllium-SR1
Pica8 Switch (p3, p4)
    FW Version: 2.6.5/24714
    OF Version: 1.3
    OVS Version: 2.3
    Switch ID in OpenDaylight:
        p3: openflow:6790870225108767794
        p4: openflow:6790870225108767797
Iperf Server (SR1)
    IP: 1.1.1.1 (eth2)
Iperf Client (SR2)
IP: 1.1.1.2 (eth3)

2.1 实验拓扑

2.2 步骤与结果

注意1:必须先下meter然后才能下flow entry! 注意2:在写request的时候要记得填写authorization,默认用户名和密码都是admin!

A. 配置交换机P3

往交换机P3上加meter

方法: PUT

URI: http://{controller-IP}:8181/restconf/config/opendaylight-inventory:nodes/node/{node-id}/meter/{meter-id}

这个URI很好理解,就是往一个id为{node-id}的交换机上添加一个id为{meter-id}的meter。Request body中的中的meter-kbps和meter-burst特别重要,因为ODL默认发送的rate的单位是package per second。Meter-burst也一定要填,是因为不填的时候限速没效果。

<meter xmlns="urn:opendaylight:flow:inventory">
    <meter-id>5</meter-id>
    <flags>meter-kbps meter-burst</flags>
    <container-name>abcd</container-name>
    <meter-band-headers>
        <meter-band-header>
            <band-id>0</band-id>
            <meter-band-types>
                <flags>ofpmbt-drop</flags>
            </meter-band-types>
            <drop-rate>8000</drop-rate>
            <drop-burst-size>100</drop-burst-size>
            </meter-band-header>
    </meter-band-headers>
    <meter-name>Foo</meter-name>
</meter>

B. 往交换机P3上加带有meter的flow entry (从源IP到目的IP)

方法: PUT

URI: http://{controller-IP}:8181/restconf/config/opendaylight-inventory:nodes/node/{node-id}/table/{table-id}/flow/{flow-id}

通过这个可以看出一个简单的OF1.3的flow table表项是由match和instructions构成的(当然还有priority、couter、timeout和cookie)。Instructions由instruction构成,然后每一个instruction又由一个或多个action构成。

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<flow xmlns="urn:opendaylight:flow:inventory">
    <priority>1</priority>
    <flow-name>Foo</flow-name>
    <match>
        <ethernet-match>
            <ethernet-type>
                <type>2048</type>
            </ethernet-type>
        </ethernet-match>
        <in-port>48</in-port>
    </match>
    <id>2</id>
    <table_id>0</table_id>
    <instructions>
        <instruction>
            <order>0</order>
            <apply-actions>
                <action>
                   <order>0</order>
                   <output-action>
                <output-node-connector>68</output-node-connector>
                   </output-action>
                </action>
            </apply-actions>
        </instruction>
        <instruction>
            <order>1</order>
            <meter>
                <meter-id>5</meter-id>
            </meter>
        </instruction>
    </instructions>
</flow>

C. 往交换机P3上加从目的IP到源IP的flow entry

方法: PUT

URI: http://{controller-ip}:8181/restconf/config/opendaylight-inventory:nodes/node/{node-id}/table/{table-id}/flow/{flow-id}

本条流与上条流最大的区别就是在action中没有指定meter-id。

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<flow xmlns="urn:opendaylight:flow:inventory">
    <priority>1</priority>
    <flow-name>Foo</flow-name>
    <match>
        <ethernet-match>
            <ethernet-type>
                <type>2048</type>
            </ethernet-type>
        </ethernet-match>
        <in-port>68</in-port>
    </match>
    <id>2</id>
    <table_id>0</table_id>
    <instructions>
        <instruction>
            <order>0</order>
            <apply-actions>
                <action>
                   <order>0</order>
                   <output-action>
                       <output-node-connector>48</output-node-connector>
                   </output-action>
                </action>
            </apply-actions>
        </instruction>
    </instructions>
</flow>

D. 查看P3上的流表

其中最后两条是应用meter的flow entry。事实上只要指定单向流即可。

这个meter的结果是缺少meter-burst的。当你添加了meter-burst,这个结果会增加一项burst_size=100。

2.3 测试结果

在P3与P4都设置了8000Kbits/sec的限流。然后使用SR2来以10000Kbits/s的速度向SR1发送UDP。然后结果显示传输速率已经被限制为7767Kbits/s。

SR1 Server

SR2 client

三、遇到问题与解决方案

1.删除了一些流表项,但是他们过了一段时间又出现了。

据猜测,OpenDaylight会将一些流表项存在其data store中,他们不会被自动删除。而且就算在交换机端手动删除掉了流表,ODL里的这个流表还是存在的。故当ODL试图保持data store和交换机中的数据的一致性时,会再次下发这个流表。

2.配置了流表项和meter项,但是发送的限速的效果不好。

可能是由于没有设置burst size导致。解决方案就是设置burst size。经测试,如果多条flow entries使用了同一个meter,那么这个meter的效果会变差。多个meter同时存在的时候,那么meter的效果也没有有且只有一个meter的效果好。

参考资料

1.https://github.com/CPqD/ofsoftswitch13/wiki/OpenFlow-1.3-Tutorial

2.https://www.opennetworking.org/images/stories/downloads/sdn-resources/onf-specifications/openflow/openflow-spec-v1.3.0.pdf

原文发布于微信公众号 - SDNLAB(SDNLAB)

原文发表时间:2016-05-24

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏林冠宏的技术文章

关于Android中为什么主线程不会因为Looper.loop()里的死循环卡死?引发的思考,事实可能不是一个 epoll 那么 简单。

( 转载请务必标明出处:https://cloud.tencent.com/developer/user/1148436/activities) 前序 本文将...

36550
来自专栏Android 研究

APK安装流程详解12——PMS中的新安装流程上(拷贝)

从上面一片文章我们知道InstallAppProgress里面最后更新的代码是调用到PackageManager#installPackageWithVerif...

19710
来自专栏JMCui

Netty 系列八(基于 WebSocket 的简单聊天室).

    之前写过一篇 Spring 集成 WebSocket 协议的文章 —— Spring消息之WebSocket ,所以对于 WebSocket 协议的介绍...

42850
来自专栏知识分享

4-MSP430定时器_定时器中断

一开始没写好就上传了,,,,,,,,这次来个全的 自己学MSP430是为了写一篇关于PID的文章,需要430在proteus上做仿真,一则认为在自动控制算法上P...

38360
来自专栏晓晨的专栏

.NET Core 实现定时抓取博客园首页文章信息并发送到邮箱

10630
来自专栏Golang语言社区

Go语言开发RESTFul JSON API

也许我们之前有使用过各种各样的API, 当我们遇到设计很糟糕的API的时候,简直感觉崩溃至极。希望通过本文之后,能对设计良好的RESTful API有一个初步认...

1.4K30
来自专栏工科狗和生物喵

FreeRTOS-Qemu 实现三任务同步通信机制以及API信息

---- 1. 本次作业的考察要点: 作业地址:https://github.com/HustWolfzzb/STM32F429DiscoveryFreeRTO...

1.3K60
来自专栏码匠的流水账

jvm排查工具箱jvm-tools

本文主要介绍的是一款jvm排查工具箱:jvm-tools。除了对基本jvm封装外,还提供了jmx访问以及火焰图的生成。

15210
来自专栏Seebug漏洞平台

CVE-2017-16943 Exim UAF漏洞分析

作者:Hcamael@知道创宇404实验室 感恩节那天,meh在Bugzilla上提交了一个exim的uaf漏洞:https://bugs.exim.org/s...

43560
来自专栏逸鹏说道

我这么玩Web Api(一)

帮助页面或用户手册(Microsoft and Swashbuckle Help Page) 前言   你需要为客户编写Api调用手册?你需要测试你的Api接口...

32250

扫码关注云+社区

领取腾讯云代金券