树莓派实现 “IP网络损伤仪”

【摘要】

树莓派作为近年来兴起的微型计算机设备具备造价低、体积小、接口丰富使用灵活等特点越来越多的被大家认可。本次实践本着边玩边学又能为项目产生效益的的原则,通过简单的动手和尝试便将树莓派改造成”IP网络损伤仪”。

【关键词】
树莓派、IP网络损伤仪、netem、TC

一、 问题的提出:

随着产品的多年发展和生命周期的更迭,在测试过程中我们发现越来越多的缺陷已经无法通过基本功能覆盖、CI冒烟的方式发现。但由于软件的复杂性当下依然有越来越多的异常场景、多种功能叠加、性能和其他非功能性产品缺陷泄露在外场。
我们也尝试借用”Sprient IP网络损伤仪”来模拟外场一些传输异常场景来进行ST测试,并在传输可靠性相关的测试方面取得了不错的效果。但Sprient 的设备造价昂贵在公司对于维护项目投资缩紧不可能购置的情况下我们需要想其他的办法来达到同样的测试效果。

二、 解决思路:

采用树莓派实现IP网络损伤仪,主要考虑并实现如下3个方面:

1.树莓派的组网:
IP网络损伤仪需要能够在不改变网络现有组网和IP地址规划的情况下,简单的串接的现有的测试网络中给测试人员带来0使用成本。

2.树莓派应实现的IP网络损伤需求:
我们在传输可靠性测试过程中需要模拟的恶劣传输因素包括:网络时延及时延抖动、报文丢弃、报文重放、报文篡改等等,以及这些因素的相互组合。

3.操作界面(本次实践尚未完成):
简化命令行操作,让IP损伤仪在树莓派上的构建通过脚本自动构建,给用户提供UI操作界面(这部门本次实践暂未完成)

三、 实践情况:
1.材料准备:

1>购置USB以太网网卡X2:
这里写图片描述
图1.1 USB以太网卡

网卡采用绿联USB转RJ45网卡两块,网卡工作模式是100Mbps的,不测试转发性能对于我来说是够用的。价格便宜两块也就90来块钱,关键它的优点是Linux下免驱,插上直接可用。

京东购买链接:https://item.jd.com/1192582.html

2>TF存储卡一张:
不要省钱,要买高速卡,容量至少16G吧,我购买的是闪迪(SanDisk)class 10 64GB TF卡:

这里写图片描述
图1.2 TF卡

京东购买链接:https://item.jd.com/1887526.html

3>树莓派3 一个:
这里写图片描述
图1.3 RaspberryPI

树莓派网上的介绍很多了,此处不做搬运工了京东价格约299元:
https://item.jd.com/11092662549.html

总体成本500+元,比Sprient 动不动几十万的设备相比,成本很低了:)

2.应用组网方案设计:

树莓派应用组网方案如下图所示:

将树莓派如上图所示的组网串接到现有测试网络中,不更改现有测试网元的配置。
这里写图片描述
图2.1 组网逻辑图
这里写图片描述
图2.2真实设备图

说明:
1 >由于公司禁用WIFI,树莓派的WIFI模块暂不使用。
2>Eth0为树莓派自带以太网接口,连接公司办公网以便使用者对于树莓派的登陆和配置。
3>Eth1、Eth2为新购置的USB 以太网接口卡,将其配置到虚拟网桥中。
4>eNodeB为被测设备。

3.树莓派的改造:

新购置的树莓派是一块裸板,需要 一切从0开始安装和配置,其过程大致如下文所示:

3.1下载和安装操作系统安装:
3.1.1下载Raspbian linux操作系统:

到树莓派官方网站下载最新Raspbian操作系统:https://www.raspberrypi.org/downloads/raspbian/

这里写图片描述
图3.1 Raspbian linux操作系统下载

3.1.2将Raspbian linux操作烧录到TF卡:

使用Win32 Disk Imager系统烧录软件,将下载的下载的Raspbian操作系统烧录到TF,这张TF卡即为树莓派的外存储器。烧录的方法参考:
https://mp.weixin.qq.com/s?__biz=MjM5NTY2MDQwMw==&mid=507626272&idx=2&sn=e3a2033dbe8021bef62adc029b96bfd4&mpshare=1&scene=1&srcid=11225XFJDhYQadGgSyxOpCcp#rd

3.1.2树莓派第一次启动的设置:

将烧录好的TF卡插入树莓派,上点进行一次启动设置,主要包括分区、密码、语言环境等等,参考:
https://mp.weixin.qq.com/s?__biz=MjM5NTY2MDQwMw==&mid=507626272&idx=3&sn=d01965d33baed80baaef5eed1c4a977c&mpshare=1&scene=1&srcid=1122wY1CAxYWuSDlJyGybDZO#rd

至此树莓派可以正常使用了。

3.2构建虚拟网桥:

上文提到了要将树莓派串到现有的测试网络中且不更改现有测试网元任何配置,那么就需要让组网图中所示的eth1、eth2走二层数据转发,而Linux操作系统默认的网络接口卡是走三层数据转发的。经过资料查阅得知Linux上实现二层数据转发的方式是“虚拟网桥”。下面是让 eth1、eth2加入虚拟网桥的方法:

3.2.1安装bridge-utils扩展包:

建议使用apt-get方式自动进行软件包的安装:
apt-get install bridge-utils

公司如果无法访问外网也没有服务器镜像,也可以下载软件包自行解压安装:
https://launchpad.net/+search?field.text=bridge-utils
这个网址可以搜索到不同Linux发行版本下的安装包。

3.2.2创建虚拟网桥:

执行如下命令创建虚拟网桥meter_bridge:
sudo brctl addbr meter_bridge

3.2.3将Eth1、Eth2加入虚拟网桥:

执行如下命令将eth1、eth2加入虚拟网桥 meter_bridge:
sudo brctl addif meter_bridge eth1
sudo brctl addif meter_bridge eth2

这里写图片描述
通过ifconfig命令确认meter_bridge网桥接口已经被添加。

3.2.4调试:

此时可以将被测设备和测试网络接到eth1、eth2。接上之后:

1>进行一下ping包确认网络连通性:
ping包大家都知道吧,此处略。

2>查询虚拟网桥的配置和Mac地址表:
sudo brctl show 查询网桥基本配置
这里写图片描述
从上图中可以看到 meter_bridge网桥中目前添加了两个物理端口eth1、eth2。bridge-utils支持STP生成树协议,这个是用于检测和解决二层以太网环路的协议,bridge id(桥id)也是生成树协议中的重要概念,有兴趣的同学可以继续查阅STP协议相关资料。

sudo brctl showmacs 查询MAC地址表
这里写图片描述
这个就是树莓派的Mac地址表了二层数据转发都是基于它,其中:ageing timer代表 mac地址表条目的老化时间;port 学习到的端口;is local为True的两个Mac地址是树莓派 eth1,eth2两块USB网卡自己的MAC地址。正常数据转发时树莓派应该能够将同一广播域内的相互通讯网元设备的MAC地址学习到MAC地址表中。

通过brctl –help 可以获取bridge-utils其他有用的操作命令。bridge-utils 感觉是简单而强大的,结合Linux原生的ifconfig、ip route等命令,甚至可以把树莓派做成一台三层交换机。
这里写图片描述

3.2.5网桥配置固化:

编写Python脚本固化网桥创建和网桥接口添加过程,并让树莓配开机自动运行:
python脚本:

from subprocess import call, PIPE,Popen
import pexpect


class Shell:
    @staticmethod
    def excute_cmd(cmd):
        err_code = call(cmd, shell=True, )
        screen = ''
        return err_code,screen

    @staticmethod
    def switch_usr(usr,psw):


        proc = pexpect.spawn('su %s'%usr)
        proc.expect('Password:')
        proc.sendline('%s\n' % psw)
        proc.interact()


class meter:
    bridge_if = ['eth1', 'eth2']
    bridge = 'meter_bridge'

    def __init__(self):
        pass

    def cfg_net_bridge(self):
      if not self.is_if_installed():
         return

      if not self.add_net_bridge():
         return

      if not self.add_if_to_bridge():
         return

    def add_net_bridge(self):

      # try to delete old net bridge
      Shell.excute_cmd('sudo ifconfig %s down' % meter.bridge)
      Shell.excute_cmd('sudo brctl delbr %s' % meter.bridge)

      err_code,screen = Shell.excute_cmd('sudo brctl addbr %s' % meter.bridge)

      if 1 == err_code:
            print('add net_bridge fail')
            return False
      return True


    def add_if_to_bridge(self):
        for net_if in meter.bridge_if:
            err_code,screen = Shell.excute_cmd('sudo brctl addif %s %s' % (meter.bridge, net_if))
            if 1 == err_code:
                print('if %s add to %s is Fail ' % (net_if,meter.bridge))

    def is_if_installed(self):
        for net_if in meter.bridge_if:
            err_code, screen = Shell.excute_cmd('ifconfig %s' % net_if)
            if 1 == err_code:
                print('bridge if:%s is not install!' % net_if)
                return False
        return True


if __name__ == '__main__':
    meter().cfg_net_bridge()

将脚本的执行命令写入/etc/rc.local实现树莓派自动自动配置网桥:

pi@raspberrypi:/etc $ cat rc.local
#!/bin/sh -e
#
# rc.local
#
# This script is executed at the end of each multiuser runlevel.
# Make sure that the script will "exit 0" on success or any other
# value on error.
#
# In order to enable or disable this script just change the execution
# bits.
#
# By default this script does nothing.


#cfg net bridge

python3.4 /home/pi/DamageMeter/Bridge.py &

exit 0

熟悉shell脚本的同学可以用shell脚本实现,此脚本基于Python3.X,需要额外安装解释器。另外记得给rc.local可执行属性,否则树莓派在启动过程中可能将无法执行该脚本。

3.2.6其他:

有的人可能会关心Linux网桥工作原理。本文重点介绍应用和实践过程,网桥工作原理介绍,可以参考这一篇CSDN博文:
http://blog.csdn.net/dolphin98629/article/details/42420827?locationNum=6&fps=1

3.3安装TC&netem模块及使用调试:
3.3.1TC&netem模块简介:

netem 是Linux 2.6 及以上内核版本提供的一个网络模拟功能模块。该功能模块可以用来在性能良好的局域网中,模拟出复杂的互联网传输性能,诸如低带宽、传输延迟、丢包等等情况。使用 Linux 2.6 (或以上) 版本内核的很多发行版 Linux 都开启了该内核功能,比如 Fedora、Ubuntu、Redhat、OpenSuse、CentOS、Debian 等等。 tc 是Linux系统中的一个工具,全名为 traffic control(流量控制)。tc 可以用来控制 netem 的工作模式,也就是说,如果想使用 netem ,需要至少两个条件,一个是内核中的 netem 功能被包含,另一个是要有 tc 。

3.3.2TC&netem模块安装?无需安装

直接尝试了一下,非常幸运 ,从树莓派官网上下载的Raspbian Linux发行版本直接包含了TC&netem模块。那么直接在树莓派上简单验证一下基本功能好了。

3.3.3传输时延/时延抖动功能验证

sudo tc qdisc add dev 接口 root netem delay 时延 抖动
上面是给网桥成员接口网卡添加单向时延和抖动的命令行接口基本形式,尝试的结果如下:

添加时延前的Ping包:
这里写图片描述
可以看到添加时延前 ping包时延 不到1ms

在eth1上添加单向100ms时延,无抖动:
这里写图片描述
可以看到ping包往返时延变为了100ms。

在eth1上添加单向100ms时延,抖动20ms
这里写图片描述
如上图所示,可以看到传输时延从85ms-115ms的跳变。

从上述的简单验证来看,树莓派已经具备了够着网络时延/抖动的能力

3.3.3传输报文丢弃功能验证

sudo tc qdisc add dev 接口* root netem loss 丢包率%*
上面是给网桥成员接口网卡添加单向丢包的命令行接口基本形式,尝试的结果如下:
这里写图片描述
……(ping过程略)
这里写图片描述
从上图看到设置网桥成员接口eth1 10%丢包率后,ping包100个丢弃7个(7%),这里说明一下,这个丢包率是针对整个物理接口的,而不是针对ping包数据的,由于整个物理接口中转发的不仅仅只有ping包所以ping包结果是正常的。从上面的尝试过程来看 树莓派已经具备了报文丢弃的损伤功能。关于丢包还有更多的命令行参数,比如指示丢包的分布模型,默认是采取均匀分布,可选的参数还有泊松分布、高斯分布等等,这里不一一尝试了。

3.3.3报文重放功能验证

sudo tc qdisc add dev 接口root netem duplicate 丢包率%*
上面是给网桥成员接口网卡添加单向重放的命令行接口基本形式,尝试的结果如下:
这里写图片描述
如上图,给网桥成员端口eth1增加 10%的报文重放。我们可以看到在ping包的过程中,出现了一些”DUP”(duplicate)字样。表示重放的设置生效了。

3.3.3其他

上述只简单的尝试了,时延、丢包、抖动的损伤功能,TC&netem模块功能异常强大除此之外还能够进行诸如:报文乱序、报文篡改,基于DiffSrv模型的Qos 等等,至此不再一一尝试,大家有兴趣请访问:
https://wiki.linuxfoundation.org/networking/netem
获取更多的信息

四、后续实践计划:

1>实现基于web的UI操作界面,给使用的测试人员提供更好的使用体验。
2>当前的IP损伤是基于物理端口的,后续尝试基于特定IP数据流的网络损伤的实现。

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值