利用Dummynet模拟恶劣网络环境

来源:互联网 发布:origin点显示数据 编辑:程序博客网 时间:2024/05/01 01:49

利用Dummynet模拟恶劣网络环境

在之前的文章中提到了三种模拟恶劣网络环境调试代码的手段:

  1. 应用层或者传输层的代理服务器
  2. 传输层或者网络层控制数据包的驱动
  3. 网络层控制数据包的网关

同时在之前的文章中介绍了第一种手段,即利用应用层的HTTP代理Fiddler来模拟恶劣网络环境,这种方式简单且灵活,但是其处于应用层,限制较大,同时也没有办法从带宽和延时两个方面分别去精细化地对恶劣网络环境进行模拟,这里介绍第二种手段——Dummynet。

Dummynet简介

Dummynet的官网地址是:http://info.iet.unipi.it/~luigi/dummynet/,官网上对于dummynet的描述是这样的:dummynet is a live network emulation tool, originally designed for testing networking protocols, and since then used for a variety of applications including bandwidth management. 即Dummynet是一个实时的网络模拟工具,事实上dummynet是ipfw防火墙的一部分,ipfw是一个网络层的防火墙,并内建于FreeBSD之中。
利用ipfw的options DUMMYNET选项,可以设置一系列的pipes,从而做到对网络流量进行控制的目的。

Dummynet基本原理

enter image description here
如官网上提供的这张图所示,dummynet通过在两个网络层中(一般是在传输层和应用层之间或者网络层与传输层之间)建立一条条pipe的方式来控制网络流量,符合设定的规则中的网络流量会被引入这些管道中去,从而使得dummynet可以介入这些流量之中,控制带宽、延迟,甚至进一步控制丢包率等众多参数。

Dummynet安装(Windows)

Dummynet本身作为ipfw防火墙的一部分,其内建于FreeBSD,其本身支持FreeBSD,OSX,Linux,Windows多种操作系统下的安装和使用,在OSX和Linux下下载源码编译安装一般即可使用,这里主要介绍一下Windows下的Dummynet安装。
Dummynet在Windows下是作为一个网卡上的服务驱动存在的,在官方给出的二进制文件包中已经包含了该驱动的sys与inf文件,但是该驱动是没有包含数字签名的,在并没有引入驱动强制签名机制的Windows操作系统(如Windows XP)上时,直接到官网下载到最新的二进制包,然后依照之后的操作步骤进行安装即可以完成ipfw+dummynet服务驱动的安装,但是在引入了驱动强制签名机制(一般是Windows 7以后的Windows版本,或者设置了比较严格的组策略)的操作系统上,是无法安装ipfw+dummynet服务驱动的,要解决这个问题可以使用两种方案:

  1. 打开Windows的测试模式,关闭驱动强制签名机制,然后安装无签名的驱动
    这种方式的实现也有两种方式,一种是在启动Windows时启动选项中关闭驱动强制签名校验机制,可以参考这篇文章 http://jingyan.baidu.com/article/7c6fb42879543380642c9036.html ,另外一种方式则是进入Windows的测试模式,可以参考 http://jingyan.baidu.com/article/acf728fd21c3e7f8e510a3ef.html 文章中的说明。
  2. 为无签名的ipfw+dummynet服务驱动打上自签名或者可用的签名
    如何进行自签名或者打上可用的签名可以参考MSDN上的说明 https://msdn.microsoft.com/en-us/library/windows/hardware/ff544865(v=vs.85).aspx ,具体如何签名并不在本文的范畴内。
    本文主要使用第二种方式,为ipfw+dummynet服务驱动打上百度签名后,即可在Windows 7上正常安装。

安装的方式如下:

  1. 找到你需要限制带宽和流量的网卡,进入属性:
    这里写图片描述
  2. 点击下方的安装,选择服务,然后选择从磁盘安装,并在浏览中找到ipfw+dummynet服务驱动的inf安装文件:
    这里写图片描述
  3. 在“此连接使用下列项目”中看到ipfw+dummynet之后,即代表ipfw+dummynet服务驱动安装成功,如果安装成功后遇到网卡无法使用的情况,一般会是前一次卸载没有卸载完全,重启电脑可以解决。
    安装完成后可以以管理员权限运行binary目录下的testme.bat,如果运行结果中没有报警信息或者错误信息,则驱动安装是成功的:
    这里写图片描述

利用Dummynet模拟恶劣网络环境

利用dummynet的pipe,可以设置一些特定的规则,就可以达到模拟恶劣网络环境的目的,且这些设置对于在操作系统中运行的应用程序来说是透明的、自动生效的,不需要像在使用Fiddler来进行模拟时还需要设置http代理。

  1. 低带宽模拟
    恶劣网络环境最基础的模拟方式就是模拟较小带宽下的情况,利用dummynet中的pipe设置,可以将所有的tcp流和udp流的带宽限制在一定的级别上,运行一个管理员的命令行,并利用binary目录下的ipfw.exe文件就可以设置dummynet中的pipe,在命令行中执行以下命令:
    ipfw add pipe 2 in proto tcp
    ipfw pipe 2 config bw 2Mbit/s
    即可将tcp的下行流量限制在2Mbit/s的带宽上,这里采用和上一篇文章中采用的相同的测速网站speedtest.net来验证限制带宽的效果,在执行以下指令以前的测速结果如下:
    这里写图片描述
    在执行完上述指令以后的测速结果如下:
    这里写图片描述
  2. 高延时模拟
    在管理员权限的命令行中执行以下命令:
    ipfw add pipe 10 ip from any to any
    ipfw pipe 10 config delay 200
    这会使得所有的包都被延时200ms,这里利用ping命令来ping百度的方式来直接测试延时,命令执行以前结果如下:
    这里写图片描述
    命令执行以后结果如下:
    这里写图片描述
  3. 高丢包率模拟
    在管理员权限的命令行中执行以下命令:
    ipfw add pipe 10 ip from any to any
    ipfw pipe 10 config plr 0.1
    这里设置的是10%的丢包率,这里利用ping -t指令继续ping百度,来观察丢包率的变化:
    执行以前:
    这里写图片描述
    执行以后:
    这里写图片描述
  4. 更加精细化的设置
    可以看到相比Fiddler来说,利用dummynet可以更加精细化地从各个角度去设置一个恶劣网络环境的参数,上文中提到的带宽、延时和丢包率的模拟当然也可以组合起来使用,同时在设置pipe规则时还可以进一步设置更加精细的规则,比如指定的ip段,指定的协议等,比如这一段指令:
    ipfw add pipe 4 src-ip 10.1.2.0/24 in
    ipfw pipe 4 config bw 1Mbit/s delay 123 plr 0.1
    就设置了一个只会介入源ip来自10.1.2.0/24网段的数据包的pipe,并且这个pipe会限制1Mbit/s的带宽,延时123ms,并且有10%的丢包率,通过组合这些参数,可以模拟出很复杂的恶劣网络环境,从而满足开发和测试的需要。相关的设置参数的说明和设置方法可以参考官网的相关文档和其他的一些说明文档。

在最后,当完成模拟恶劣网络环境后,执行以下命令:
ipfw -q flush
ipfw -q pipe flush
来清除所有设定的pipe和规则,进一步如果需要还原原来的环境的话可以将驱动删除,并重启计算机即可。

0 0
原创粉丝点击