在Linux上为指定IP端口模拟网络收发包延迟

  编写网络应用程序时,我们一般都是在网络状况良好的局域网甚至是本机内进行测试调试。有没有办法在网络状况良好的内网环境中,在不改动程序自身代码的前提下,为应用程序模拟复杂的外网环境——尤其是网络延迟呢?这是我在学校写网络程序时就有过的想法,只是一直没认真研究,直到最近在公司编写跨服代码。


  跨服涉及多台服务器之间,还有服务器与客户端之间的通讯,流程很复杂,其中每一步都要正确处理网络异常延迟与断开的情况。测试人员通过改代码或下断点的方式来测试网络延迟是极麻烦的,而且能模拟的延迟用例也很有限。因此如果有一个第三方工具为应用程序使用的某个socketIP端口)模拟网络延迟,那测试人员应该会非常喜欢的。


  最初找到的工具有Linux自带的tc命令(需要配合tc自带的模块netem)和一个第三方工具dummynet。前者概念很复杂,命令行参数也很复杂。后者跨平台,在Windows上也可用;但在Linux上安装非常麻烦,为了编译dummynet提供的内核模块,需要编译正确版本的Linux内核源代码——我在这一步卡了很久,一直没搞定。最终还是决定用tc。计划的方案是用tc为服务端端口分别设置收包和发包的网络延迟,这样可解决tc只能工作在Linux中的问题。tc手册和网上很多文章都提到tc只能设置发包延迟,而无法设置收包延迟。但只要配合Linux自带的ifbIntermediate Functional Block device)内核模块和一点小技巧,tc就可以设置收包延迟。


  其实tc可以很简单地为一块网卡设置网络延迟:


# tc qdisc add dev wlan0 root netem delay 1s


  这条命令给无线网卡wlan0发送的包设置了1秒网络延迟。


  可以通过ping局域网中的其它机器来验证:


# ping -c 4 192.168.1.5

PING 192.168.1.5 (192.168.1.5) 56(84) bytes of data.

64 bytes from 192.168.1.5: icmp_req=1 ttl=64 time=1002 ms

64 bytes from 192.168.1.5: icmp_req=2 ttl=64 time=1001 ms

64 bytes from 192.168.1.5: icmp_req=3 ttl=64 time=1002 ms

  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值