论文部分内容阅读
[摘要]介绍常用的网络程序测试的几种方法,并利用linux的流量控制功能搭建一个网络仿真器用以对嵌入式设备的网络功能进行测试,最后对该仿真器的实际仿真效果进行检验。
[关键词]嵌入式设备 网络仿真 流量控制 tc netem
中图分类号:TP3 文献标识码:A 文章编号:1671-7597(2009)0120053-02
一、引言
随着嵌入式技术发展成熟,各种嵌入式设备由于其自身拥有体积小、功耗低、可靠性好、集成度高等优点,逐渐深入到生产生活中的方方面面,承担着各种重要角色。但由于其应用场合比较特殊,为测试带来了许多新的挑战。对于嵌入式设备,其工作时的网络环境常常和开发时的实验室网络环境相差很远,所以为了对嵌入式设备上网络程序的功能性能以及可靠性等指标进行测试,我们必须采用与普通网络设备测试不同方法。
二、网络应用程序测试方法概述
一般测试网络应用程序的主要过程可以概括成观察应用程序在网络上运行时的执行方式。通常用于测试网络的方法有以下几种:
(一)利用测试网络
测试网络是网络应用程序开发时最常用到的方法。开发时经常利用实验室中的电脑和网络设备搭建一个测试环境,有时甚至直接使用实验室的局域网进行一些基本功能的测试验证。但是,通常的情况是网络应用程序能在实验室网络环境中正常的工作,一旦拿到实际的使用的生产网络环境中就容易出错。大多数测试网络无法顾及同实际生产网络相关的问题。
(二)利用生产网络
生产网络就是网络应用程序最终工作时所处的网络。测试网络应用程序最精密的方法就是在生产网络环境中实际运行程序,和实际的情况完全一样。但是,这种方法也有其不利的一面。首先,开发人员通常无法接触最终的使用环境,几乎所有的商业网络应用程序都是这样。其次,即使开发人员能够使用最终的生产网络,直接使用生产网络进行测试也是一种不安全的行为。被测程序一旦失控,比如耗尽了所有的带宽影响的别的程序,破坏了其他的有用数据,后果都将是灾难性的。
(三)利用网络仿真
折中的方案就是网络仿真器。网络仿真器在一台设备中对整个生产网络建立模型,生产网络中发现的所有问题以及网络的大部分特性都将复制在网络仿真器仿真出来的测试网络环境中。网络仿真的关键是可以对真实的网络行为进行细致的仿真,把实际网络中的问题再现在测试网络中。
如图1所示,网络仿真器通常被安插在被测网络应用程序的客户端与服务器之间。用以模拟实际生产网络中处在客户端与服务器之间的所有网络对数据包产生的影响。例如通信一端在另一个网络,客户端在本地,网络仿真器模拟的就是广域网对数据包的影响;又比如通信的两端在局域网,那么网络仿真器模拟的就是本地局域网。当数据包进入网络仿真器之后,仿真器就会按照实际被仿真的网络的模型按照一定的策略对数据包进行处理。常见的如带宽限制、延时、错误、丢包、重复等等。
通过对比以上几种网络应用程序测试的方法,可以看出用网络仿真构建的测试环境相对来说有近似度高、成本低、安全性好的优点,非常适合对于嵌入式设备的网络功能进行测试。本文将要介绍一种利用linux内建的流量控制(Traffic Control,TC)功能搭建一个网络仿真平台的方法。
三、Linux的流量控制机制在网络仿真平台中的应用
Linux从内核2.1版本开始尝试支持流量控制(Traffic Control,TC),之后发布的2.2版本内核是第一个支持流量控制的稳定版本。TC成为Linux下的流量控制工具,用户可以通过TC工具包提供的接口控制内核进行流量控制。
目前的从2.4版本的内核开始,流量控制可以在入口(Ingress)队列和出口(egress)队列进行。
TC对数据包进入入口和出口队列的控制主要由三个关键部分实现:队列规则(Queue Discipline,qdisc)、类别(Class)、过滤器(Filter)。
如图2,数据包在进入入口队列或出口队列前会由过滤器按照用户给定的筛选方法分类,每一个分类对应一个队列规则。在某一类中的数据包全部按照该队列规则排队等候处理或发送。
(一)带宽控制的实现
具体的排队规则分为可分类的和不可分类的两种。不可分类的包括TBF(Token Bucket Filter,令牌桶过滤器)、pfifo_fast(Third Band First In First Out Queue,先进先出队列)、SFQ(Stochastic Fairness Queuing,随机公平队列)。可分类的包括CBQ(Class Based Queuing,基于类别排队)、HTB(Hierarchical Token Bucket,分层令牌桶)、PRIO。
在进行网络仿真过程中,我们需要对网络的带宽进行控制。在上面介绍的排队规则中可以选择TBF令牌桶过滤器来进行流量整形。
令牌桶只允许不超过事先设定的速率到来的数据包通过。实际中的桶是一个缓冲器,这个“桶”不断被恒定速率的虚拟数据“令牌”(Token)填充着,到来的数据包只有拿到令牌才可以从桶里发送出去。
(二)丢包率、时延的仿真
在2.6.7之后版本的Linux中引入了netem模块,这个模块是Stephen Hemminger在QOS(Quality of Service)和di_serv(Differentiated Services)的基础上开发的工具。Netem是作为TC的一个排队规则(qdisc)来使用的,通过netem的接口可以非常灵活方便地对所有离开特定网络端口的数据分组进行以下几种处理:
延迟(delay) 按照某种统计模型延迟每一个分组
丢弃(loss) 按照一定百分比丢弃某些分组
复制(duplication) 按照一定百分比复制一些相同的分组
重排序(reordering) 对一组分组中某一个进行延迟以打乱最终接收到的顺序
综合利用tc和netem提供的这些功能的组合可以对网络的基本参数进行仿真。
四、应用举例
工作中需要对一个车载的移动嵌入式设备的网络功能性能进行测试。实际工作中的设备工作在移动的列车上,通过无线网络与地面中心通信。我们利用一台电脑对无线网络的传输率丢包延时等进行仿真。
实现如上图,用一台装有双网卡的运行Linux的机器作为无线网络的仿真器。具体配置如下:
车载移动被测设备
IP address eth0: 10.0.1.2
Netmask: 255.255.255.0
Gateway: 10.0.1.1
地面中心
IP address eth0: 10.0.0.2
Netmask: 255.255.255.0
Gateway: 10.0.0.1
无线网仿真器
IP address eth0: 10.0.0.1
IP address eth1: 10.0.1.1
Netmask: 255.255.255.0
以下操作都在作为仿真器的电脑上完成,首先打开Linux的路由转发功能:
# echo 1>/proc/sys/net/ipv4/ip_forward
再加入两条路由:
# route add net 10.0.1.0 netmask 255.255.255.0 dev eth0
# route add net 10.0.0.0 netmask 255.255.255.0 dev eth1
下面用tc配置eth0端口的带宽丢包率等:
# tc qdisc add dev eth0 root handle 1: netem loss 20%
# tc qdisc add dev eth0 parent 1:1 handle 10: delay 30ms
# tc qdisc add dev eth0 parent 10:1 handle 20: tbf rate 1mbit latency 200ms burst 128k
数据包先经过TBF进行带宽限制处理,再通过netem进行丢包率和时延的处理。这样配置之后带宽被限制在1Mbps,延迟为30ms,平均丢包率20%。
然后检测一下仿真效果。用ping命令ping 10.0.0.2
--- 10.0.0.2 ping statistics ---
83 packets transmitted, 73 received, 12% packet loss, time 82006ms
rtt min/avg/max/mdev = 31.218/31.744/54.061/2.646 ms
延迟平均在31.744。
利用iperf的upd测试丢包率
0.0-30.3 sec234 KBytes63.3 Kbits/sec0.063 ms 43/206 (21%)
丢包率平均在21%。
再用iperf的tcp测试带宽
0.0-30.2 sec2112 KBytes573 Kbits/sec
带宽在受到丢包的影响之后为573kbps,在只使用令牌桶的情况下可以达到1Mbps。
五、结束语
本文介绍了一种利用linux的流量控制功能搭建网络仿真平台对嵌入式网络设备进行测试的方法,在实际使用中发现tc参数只能在开始仿真之前静态手动设置好,而不能在使用过程中动态自动调节。我们希望找到一种方法能够在仿真过程中实时调整延迟、丢包等参数,更加逼真的对如基站切换造成的周期性网络性能变化进行仿真。
参考文献:
[1]Hubert B,Gregory Maxwell,van Mook R.“Linux Advanced Routing & Traffic Control HOWTO”.http://lartc.org/lartc.pdf.2003.
[2]S.Hemminger,“Network Emulation with NetEm”in Proceedings of Linux Conf Au 2005,2005.
[3]NetEm:http://developer.osdl.org/shemminger/netem.
[4]R.Blum,Network Performance Open Source Toolkit:Using Netperf,Tcptrace,NIST Net,and SSFNet(Wiley,2003).
[5]菜文郁、金心宇、张昱,基于Linux的网络流量控制机制,2006-08.
作者简介:
高岚,男,汉,山东泰安,同济大学,电子与信息工程学院,硕士研究生,研究方向:嵌入式系统及应用。
[关键词]嵌入式设备 网络仿真 流量控制 tc netem
中图分类号:TP3 文献标识码:A 文章编号:1671-7597(2009)0120053-02
一、引言
随着嵌入式技术发展成熟,各种嵌入式设备由于其自身拥有体积小、功耗低、可靠性好、集成度高等优点,逐渐深入到生产生活中的方方面面,承担着各种重要角色。但由于其应用场合比较特殊,为测试带来了许多新的挑战。对于嵌入式设备,其工作时的网络环境常常和开发时的实验室网络环境相差很远,所以为了对嵌入式设备上网络程序的功能性能以及可靠性等指标进行测试,我们必须采用与普通网络设备测试不同方法。
二、网络应用程序测试方法概述
一般测试网络应用程序的主要过程可以概括成观察应用程序在网络上运行时的执行方式。通常用于测试网络的方法有以下几种:
(一)利用测试网络
测试网络是网络应用程序开发时最常用到的方法。开发时经常利用实验室中的电脑和网络设备搭建一个测试环境,有时甚至直接使用实验室的局域网进行一些基本功能的测试验证。但是,通常的情况是网络应用程序能在实验室网络环境中正常的工作,一旦拿到实际的使用的生产网络环境中就容易出错。大多数测试网络无法顾及同实际生产网络相关的问题。
(二)利用生产网络
生产网络就是网络应用程序最终工作时所处的网络。测试网络应用程序最精密的方法就是在生产网络环境中实际运行程序,和实际的情况完全一样。但是,这种方法也有其不利的一面。首先,开发人员通常无法接触最终的使用环境,几乎所有的商业网络应用程序都是这样。其次,即使开发人员能够使用最终的生产网络,直接使用生产网络进行测试也是一种不安全的行为。被测程序一旦失控,比如耗尽了所有的带宽影响的别的程序,破坏了其他的有用数据,后果都将是灾难性的。
(三)利用网络仿真
折中的方案就是网络仿真器。网络仿真器在一台设备中对整个生产网络建立模型,生产网络中发现的所有问题以及网络的大部分特性都将复制在网络仿真器仿真出来的测试网络环境中。网络仿真的关键是可以对真实的网络行为进行细致的仿真,把实际网络中的问题再现在测试网络中。
如图1所示,网络仿真器通常被安插在被测网络应用程序的客户端与服务器之间。用以模拟实际生产网络中处在客户端与服务器之间的所有网络对数据包产生的影响。例如通信一端在另一个网络,客户端在本地,网络仿真器模拟的就是广域网对数据包的影响;又比如通信的两端在局域网,那么网络仿真器模拟的就是本地局域网。当数据包进入网络仿真器之后,仿真器就会按照实际被仿真的网络的模型按照一定的策略对数据包进行处理。常见的如带宽限制、延时、错误、丢包、重复等等。
通过对比以上几种网络应用程序测试的方法,可以看出用网络仿真构建的测试环境相对来说有近似度高、成本低、安全性好的优点,非常适合对于嵌入式设备的网络功能进行测试。本文将要介绍一种利用linux内建的流量控制(Traffic Control,TC)功能搭建一个网络仿真平台的方法。
三、Linux的流量控制机制在网络仿真平台中的应用
Linux从内核2.1版本开始尝试支持流量控制(Traffic Control,TC),之后发布的2.2版本内核是第一个支持流量控制的稳定版本。TC成为Linux下的流量控制工具,用户可以通过TC工具包提供的接口控制内核进行流量控制。
目前的从2.4版本的内核开始,流量控制可以在入口(Ingress)队列和出口(egress)队列进行。
TC对数据包进入入口和出口队列的控制主要由三个关键部分实现:队列规则(Queue Discipline,qdisc)、类别(Class)、过滤器(Filter)。
如图2,数据包在进入入口队列或出口队列前会由过滤器按照用户给定的筛选方法分类,每一个分类对应一个队列规则。在某一类中的数据包全部按照该队列规则排队等候处理或发送。
(一)带宽控制的实现
具体的排队规则分为可分类的和不可分类的两种。不可分类的包括TBF(Token Bucket Filter,令牌桶过滤器)、pfifo_fast(Third Band First In First Out Queue,先进先出队列)、SFQ(Stochastic Fairness Queuing,随机公平队列)。可分类的包括CBQ(Class Based Queuing,基于类别排队)、HTB(Hierarchical Token Bucket,分层令牌桶)、PRIO。
在进行网络仿真过程中,我们需要对网络的带宽进行控制。在上面介绍的排队规则中可以选择TBF令牌桶过滤器来进行流量整形。
令牌桶只允许不超过事先设定的速率到来的数据包通过。实际中的桶是一个缓冲器,这个“桶”不断被恒定速率的虚拟数据“令牌”(Token)填充着,到来的数据包只有拿到令牌才可以从桶里发送出去。
(二)丢包率、时延的仿真
在2.6.7之后版本的Linux中引入了netem模块,这个模块是Stephen Hemminger在QOS(Quality of Service)和di_serv(Differentiated Services)的基础上开发的工具。Netem是作为TC的一个排队规则(qdisc)来使用的,通过netem的接口可以非常灵活方便地对所有离开特定网络端口的数据分组进行以下几种处理:
延迟(delay) 按照某种统计模型延迟每一个分组
丢弃(loss) 按照一定百分比丢弃某些分组
复制(duplication) 按照一定百分比复制一些相同的分组
重排序(reordering) 对一组分组中某一个进行延迟以打乱最终接收到的顺序
综合利用tc和netem提供的这些功能的组合可以对网络的基本参数进行仿真。
四、应用举例
工作中需要对一个车载的移动嵌入式设备的网络功能性能进行测试。实际工作中的设备工作在移动的列车上,通过无线网络与地面中心通信。我们利用一台电脑对无线网络的传输率丢包延时等进行仿真。
实现如上图,用一台装有双网卡的运行Linux的机器作为无线网络的仿真器。具体配置如下:
车载移动被测设备
IP address eth0: 10.0.1.2
Netmask: 255.255.255.0
Gateway: 10.0.1.1
地面中心
IP address eth0: 10.0.0.2
Netmask: 255.255.255.0
Gateway: 10.0.0.1
无线网仿真器
IP address eth0: 10.0.0.1
IP address eth1: 10.0.1.1
Netmask: 255.255.255.0
以下操作都在作为仿真器的电脑上完成,首先打开Linux的路由转发功能:
# echo 1>/proc/sys/net/ipv4/ip_forward
再加入两条路由:
# route add net 10.0.1.0 netmask 255.255.255.0 dev eth0
# route add net 10.0.0.0 netmask 255.255.255.0 dev eth1
下面用tc配置eth0端口的带宽丢包率等:
# tc qdisc add dev eth0 root handle 1: netem loss 20%
# tc qdisc add dev eth0 parent 1:1 handle 10: delay 30ms
# tc qdisc add dev eth0 parent 10:1 handle 20: tbf rate 1mbit latency 200ms burst 128k
数据包先经过TBF进行带宽限制处理,再通过netem进行丢包率和时延的处理。这样配置之后带宽被限制在1Mbps,延迟为30ms,平均丢包率20%。
然后检测一下仿真效果。用ping命令ping 10.0.0.2
--- 10.0.0.2 ping statistics ---
83 packets transmitted, 73 received, 12% packet loss, time 82006ms
rtt min/avg/max/mdev = 31.218/31.744/54.061/2.646 ms
延迟平均在31.744。
利用iperf的upd测试丢包率
0.0-30.3 sec234 KBytes63.3 Kbits/sec0.063 ms 43/206 (21%)
丢包率平均在21%。
再用iperf的tcp测试带宽
0.0-30.2 sec2112 KBytes573 Kbits/sec
带宽在受到丢包的影响之后为573kbps,在只使用令牌桶的情况下可以达到1Mbps。
五、结束语
本文介绍了一种利用linux的流量控制功能搭建网络仿真平台对嵌入式网络设备进行测试的方法,在实际使用中发现tc参数只能在开始仿真之前静态手动设置好,而不能在使用过程中动态自动调节。我们希望找到一种方法能够在仿真过程中实时调整延迟、丢包等参数,更加逼真的对如基站切换造成的周期性网络性能变化进行仿真。
参考文献:
[1]Hubert B,Gregory Maxwell,van Mook R.“Linux Advanced Routing & Traffic Control HOWTO”.http://lartc.org/lartc.pdf.2003.
[2]S.Hemminger,“Network Emulation with NetEm”in Proceedings of Linux Conf Au 2005,2005.
[3]NetEm:http://developer.osdl.org/shemminger/netem.
[4]R.Blum,Network Performance Open Source Toolkit:Using Netperf,Tcptrace,NIST Net,and SSFNet(Wiley,2003).
[5]菜文郁、金心宇、张昱,基于Linux的网络流量控制机制,2006-08.
作者简介:
高岚,男,汉,山东泰安,同济大学,电子与信息工程学院,硕士研究生,研究方向:嵌入式系统及应用。