• 基于Open vSwitch的传统限速和SDN限速--实验


    申明: 未经许可,禁止以任何形式转载,若要引用,请标注链接地址。 全文共计7677字,阅读大概需要5分钟
    更多学习内容,欢迎关注我的个人公众号:不懂开发的程序猿

    基于Open vSwitch的传统限速和SDN限速–实验

    学习内容

    1.下载与安装

    • 实验需要用到的工具有:安装Docker和Open vSwitch

    2.配置实验环境

    3.实验过程

    4.实验数据

    5.实验分析与总结

    1.下载与安装

    1.1 安装Docker

    整个安装与运行在超级管理员权限下最好,命令:su root

    安装Docker:

    journalctl -u docker.service
    
    • 1

    在这里插入图片描述

    桥接模式sudo ip link add name docker0 type bridge

    添加IP地址:sudo ip addr add dev docker0 172.1.0.1/16

    重启服务器service docker restart

    再次运行

    sudo docker run hello-world
    
    • 1

    发现成功

    在这里插入图片描述

    我这里的Java环境是:

    OpenJDK Runtime Environment (build 1.8.0_312-8u312-b07-0ubuntu1~20.04-b07)

    java -version
    
    • 1

    在这里插入图片描述

    1.2 Open vSwitch的安装

    http://www.openvswitch.org/download/中下载想要安装的版本,我这里下的版本是:openvswitch-2.13.6

    在这里插入图片描述

    解压在桌面、生成Makefile、编译、安装

    tar zxvf openvswitch-2.13.6.tar.gz
    
    cd openvswitch-2.13.6
    
    ./configure 
    
    make -j4
    
    sudo make install
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    坑:

    如果在./configure时,报错如下

    checking whether /usr/bin/python2.7 has six library… configure: error: Missing Python six library or version too old.

    在这里插入图片描述

    尝试再安装一遍:pip install six

    发现:

    Defaulting to user installation because normal site-packages is not writeable Requirement already satisfied: six in /usr/lib/python3/dist-packages (1.14.0)

    在这里插入图片描述

    因为系统是在这个目录下找/usr/bin/six 的库,而我的six环境变量在/usr/lib/python3/dist-packages,因此将其加入PYTHON环境变量中即可解决报错,输入以下命令:

    export PYTHONPATH=$PYTHONPATH:/usr/lib/python3/dist-packages
    
    • 1

    再次./configure可以看到编译成功

    在这里插入图片描述

    将openvswitch模块载入到内核中

    sudo modprobe openvswitch
    
    • 1

    可以通过下面的命令来验证是否成功

    sudo lsmod | grep openvswitch
    
    • 1

    在这里插入图片描述

    openvswitch有几个脚本放在/usr/local/share/openvswitch/scripts下,为了方便使用,可以设置PATH路径。由于运行需要root权限,可以切换到root,再设置PATH

    export PATH=$PATH:/usr/local/share/openvswitch/scripts
    ovs-ctl start
    
    • 1
    • 2

    在这里插入图片描述

    验证是否开启

    ps -e | grep ovs
    
    • 1

    在这里插入图片描述

    启动

    export PATH=$PATH:/usr/local/share/openvswitch/scripts
    ovs-ctl start
    
    • 1
    • 2

    启动ovs-vswitchd

    ovs-ctl --no-ovs-vswitchd start
    
    • 1

    启动ovsdb-server

    ovs-ctl --no-ovsdb-server start
    
    • 1

    在这里插入图片描述

    2.配置实验环境

    配置ovsdb的数据库

    mkdir -p /usr/local/etc/openvswitch
    
    ovsdb-tool create /usr/local/etc/openvswitch/conf.db \
    
    ​    vswitchd/vswitch.ovsschema
    
    mkdir -p /usr/local/var/run/openvswitch
    
    ovsdb-server --remote=punix:/usr/local/var/run/openvswitch/db.sock \
    
    ​    --remote=db:Open_vSwitch,Open_vSwitch,manager_options \
    
    ​    --private-key=db:Open_vSwitch,SSL,private_key \
    
    ​    --certificate=db:Open_vSwitch,SSL,certificate \
    
    ​    --bootstrap-ca-cert=db:Open_vSwitch,SSL,ca_cert \
    
    ​    --pidfile --detach --log-file
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    在这里插入图片描述

    使用ovs-vsctl初始化数据库

     ovs-vsctl --no-wait init
    ovs-vswitchd --pidfile --detach --log-file
    
    • 1
    • 2

    在这里插入图片描述

    检查是否配置成功

    sudo ovs-vsctl --version
    sudo ovs-vsctl show
    
    • 1
    • 2

    在这里插入图片描述

    在这里插入图片描述

    3.实验步骤

    3.1启动floodlight控制器

    cd floodlight/
    java -jar target/floodlight.jar //运行floodlight控制器,该窗口请不要关闭
    
    • 1
    • 2

    在这里插入图片描述

    3.2创建拓扑

    sudo mn --topo single,6 --controller=remote,ip=127.0.0.1,port=6633 --switch ovs,protocols=OpenFlow13
    
    • 1

    在这里插入图片描述

    在这里插入图片描述

    拓扑设备分工如下:

    设备限速方法
    h1, h2网卡限速
    h3, h4队列限速
    h5, h6meter表限速

    打开终端

    xterm h1 h2
    
    • 1

    查看两个主机h1和h2的ip地址

    ifconfig
    
    • 1

    iperf测试带宽

    h1:

    iperf -s
    
    • 1

    h2

    iperf -c 10.0.0.1
    
    • 1

    在这里插入图片描述

    测得在正常情况下,本环境中的网络带宽是12.8Mbits/sec

    这里可以再次查看Open vSwitch的端口

    在这里插入图片描述

    3.3网卡限速

    原理

    Open vSwitch本身并不具备QoS功能,网卡限速是基于Linux内核来完成,而Open vSwitch所做的是对Linux内核的限速功能进行配置。Linux内核中接收数据包使用的方法叫策略(policing),用于限制网卡上接收分组(ingress)的速率,当速率超过了配置速率,就简单的把数据包丢弃。Policing通过简单的丢包机制实现接口速率的限制,它既可以作用于物理接口,也可以作用于虚拟接口。

    查看h1和h2的网卡

    在这里插入图片描述

    对两个网卡做策略

    当两个网卡接收到的数据包超过5000kb时,数据包就直接丢弃掉

    ovs-vsctl set interface s1-eth1 ingress_policing_rate=5000
    ovs-vsctl set interface s1-eth2 ingress_policing_rate=5000
    
    • 1
    • 2

    ingress_policing_rate:为接口最大收包速率,单位kbps,超过该速度的报文将被丢弃,默认值为0表示关闭该功能

    在这里插入图片描述

    验证带宽

    以h1为服务端,以h2为客户端,通过iperf打流来测试网络带宽。选择UDP传输,客户端以10M的带宽去发送流量,由于网卡被限速,服务器端会显示相应的带宽

    xterm h1
    iperf -u -s
    
    • 1
    • 2
    xterm h2
    iperf -u -c 10.0.0.1 -b 10M
    
    • 1
    • 2

    在这里插入图片描述

    带宽:10.5 Mbit/s

    抖动:15.649 ms

    丢包率:4063/8918=46%

    3.4队列限速

    原理

    数据包队列是任何一个网络栈的核心组件,数据包队列实现了异步模块之间的通讯,提升了网络性能。 Linux可以将网络数据包缓存起来,然后根据用户的设置,在尽量不中断连接(如 tcp)的前提下来平滑网络流量。内核通过某个网络接口发送数据包,它都需要按照这个接口的队列规则把数据包加入队列。由于Linux对接收队列的控制不够好,所以一般只用发送队列,即”控发不控收”。shaping用于实现出口流量的控制,使用队列queue,可以缓存和调度数据包发送顺序,比policing更加精确和有效。在ovs的数据表中主要使用QoS和Queue两张表。

    在这里插入图片描述

    队列原理图

    在网卡s1-eth4上限制创建队列

    ovs-vsctl set port s1-eth4 qos=@newqos -- \
    
    	--id=@newqos create qos type=linux-htb queues=0=@q0 -- \
    
    	--id=@q0 create queue other-config:max-rate=5000000
    
    • 1
    • 2
    • 3
    • 4
    • 5

    在这里插入图片描述

    为s1-eth4创建qos,名称为newqos

    创建qos,名称为newqos,类型为linux-htb,指定处理队列为q0

    创建队列q0,设置最大的速率为5000000bps,即5M

    查看队列具体信息

    查看网卡s1-eth4上的qos,qos的参数信息,最重要的是处理队列的uuid

    sudo ovs-vsctl list qos
    
    • 1

    在这里插入图片描述

    查看网卡s1-eth4上的队列的信息,最重要的是队列的最大速度

    sudo ovs-vsctl list queue
    
    • 1

    在这里插入图片描述

    验证带宽

    xterm h3
    iperf -u -c 10.0.0.4 -b 10M
    
    • 1
    • 2
    xterm h4
    iperf -u -s
    
    • 1
    • 2

    在这里插入图片描述

    带宽:10.5 Mbit/s

    抖动:1121.52us = 1.1ms

    丢包率:40%

    3.5 Meter表限速

    原理

    Meter表限速是SDN的限速方式。OpenFlow 1.3版本中增加了对单个数据流的计量功能,使得OpenFlow能够实现简单的QoS服务(例如流量限速),并且可以结合每个端口队列来实现更复杂的QoS框架(例如DiffServ)

    在这里插入图片描述

    Meter表的字段

    含义:

    • Meter Identifier 32位的无符号整数,用来唯一识别该计量表项
    • Merter Bands 由计量带组成的无序列表,其中每个计量带都指明了其速率及处理数据包的方式
    • Counters 用于在报文被计量表项处理时更新相关计数

    每个计量表项可能具有一个或多个计量带,每个计量带都指定了其所适用的速率和数据被处理的方式。每个Meter Band指明了带宽速率以及对数据包的处理行为。数据包基于其当前的速率会被其中一个Meter Band来处理。

    在这里插入图片描述

    Meter Band详细字段

    含义:

    • Band Type 定义了数据包怎样被处理(drop,dscp remark)
    • Rate 用于选择计量带,定义了带可以运行的最高速率
    • Counters 当数据报文被计量带处理时,更新计数器
    • Type specific arguments 带类型的可选参数

    Band Type:

    • Drop 通过丢弃数据包,定义带宽速率限制
    • Dscp remark 降低数据包的IP头中的DSCP字段丢弃的优先级

    限速过程

    查看交换机中的流表

    ovs-ofctl dump-flows s1 -O openflow13
    
    • 1

    在这里插入图片描述

    设置交换机的工作模式和协议版本

    ovs-vsctl set bridge s1 datapath_type=netdev
    ovs-vsctl set bridge s1 protocols=OpenFlow13
    
    • 1
    • 2

    在这里插入图片描述

    下发meter表

    ovs-ofctl add-meter s1 meter=1,kbps,band=type=drop,rate=5000 -O OpenFlow13
    
    • 1

    查看流表转发端口,为下发流表准备

    ovs-ofctl show s1
    
    • 1

    下发流表并查看

    ovs-ofctl add-flow s1 in_port=5,action=meter:1,output:6 -O openflow13
    ovs-ofctl dump-flows s1 -O openflow13
    
    • 1
    • 2

    在这里插入图片描述

    in_port=5:进端口为5

    action=meter:1,output:6:匹配的动作为先交给meter表1处理,然后转发给端口6

    流表的意思是将进端口为5的流量使用meter表限速,然后转发给6端口。

    验证带宽

    打开h5、h6终端,查看带宽

    xterm h5
    iperf -u -c 10.0.0.6 -b 10M
    
    • 1
    • 2
    xterm h6
    iperf -u -s
    
    • 1
    • 2

    在这里插入图片描述

    带宽:10.5 Mbit/s

    抖动:15.649 ms

    丢包率:7447/8917=84%

    4.三种方式数据对比

    限速方式带宽M/s抖动ms丢包率
    正常带宽12.8//
    网卡限速10.515.64946%
    队列限速10.51.140%
    Meter表限速10.515.6884%

    5.实验分析

    本实验是基于开源交换机Open vSwitch,仿真了从传统网络模式和SDN模式限流的功能,单从实验的数据来看,队列限速的表现最好,抖动最小,丢包率最少。

    Meter表作为SDN模式限速的代表,表现中规中矩,这可能和ovs交换的流表控制能力有关。交换机中流表的匹配,数据流计数,动作的执行等都是影响其控制力度的原因。软件实现的交换机对流表的控制肯定比不上硬件交换机,如果使用硬件交换机,其效率表现应该有所提高。

    6.总结

    限流是Qos中常用的一种技术手段,当网络过载或拥塞时,QoS能确保重要业务量不受延迟或丢弃,同时保证网络的高效运行。对于网络业务,服务质量包括:传输的带宽、传送的时延、数据的丢包率、网络抖动等。在网络中可以通过保证传输的带宽、降低传送的时延、降低数据的丢包率、降低网络抖动值等措施来提高服务质量。

    –end–

  • 相关阅读:
    mysql 事务的实用小实例
    部分SOP-8双运放选型参考
    TypeScript常用知识点及其最佳实践总结
    web前端面试题附答案039-css里插入js变量,scss最具创新的一个功能
    【python学习】基础篇-常用模块-shutil文件和目录操作
    详解python中的序列类型概述
    【正则表达式】正则表达式常见匹配模式
    被一位读者赶超,手摸手 Docker 部署 ELK Stack
    Java NIO模型(提供代码示例)
    python每日一练(4)
  • 原文地址:https://blog.csdn.net/qq_44807756/article/details/127958891