来安利一下自己开发的 Mac OS 弱网络环境模拟与重现工具~

2016-03-26 16:33:09 +08:00
 FinalTheory

先贴 github 地址骗几个 star😂

https://finaltheory.github.io/wireless-network-reproduction/

然后解释一下这个命名为 WNR 的工具解决了怎样的问题。

事实上现在网络模拟工具已经有好多了,比如 Mac OS 上有 Apple 官方的 Network Link Conditioner , FaceBook 推出了基于 tc 的 ATC , Windows 上面有 Network Emulator for Windows Toolkit 以及非官方的 clumsy ,甚至 Chrome 都自带网络模拟功能……

正常情况下如果只是为了检查自己开发的 App 能否在低速网络下工作,那么上述这些工具基本都能够满足需求。但是在我们的实际工作中发现,有时候需要对一些特定的弱网络环境进行重现,从而进行针对性的改进。这个时候,现有的各种软件就统统派不上用场了。因此, WNR 这个东西,说白了就是用来从网络层( IP 协议)干扰数据传输的通用工具,能够真实地模拟出一切可能出现的客户端弱网环境,从而能够用于移动端 App 的深度网络优化。

WNR 模拟器主要提供以下这些弱网模拟功能:

并且具有如下高级特性:

WNR 可以针对性地干扰特定进程的网络传输,并且不影响其他进程的正常网络 IO 。假如 Mac 上跑着一个 GenyMotion 虚拟机,你就可以针对虚拟机的进程来进行网络模拟,然后把整个网络交互过程导出为 pcap 文件,来进行进一步的分析。也就是说,你可以从网络流量中筛选出你所感兴趣的那个进程,来查看它所发出 /收到的数据包。

下面举个简单的例子。百度地图在使用过程中,由于移动所造成的网络抖动,有时候会卡死在检索页上。由于网络抖动之类的特征是随着时间变化的,因此完全无法使用上述工具来模拟,但使用新开发的这套工具,则可以轻易复现这种环境。比如模拟一种带宽随着时间呈正弦波动的网络,那么实际的wget下载速度变化就会如下图所示:

另一方面,如果你开发了一种针对弱网络环境的优化策略,想要说明收益的时候,按照正常流程,你需要把功能先小流量上线,收集反馈数据,根据数据反馈调整策略,从而完成一轮次的优化迭代,这个过程是非常耗时的,而且收益情况还不一定符合你的预期。但如果使用这种本地重现网络环境的方式,你可以直接先把自己的策略在一些具有代表性的弱网环境上跑出结果,这样直接就得到了初步的收益评估。

说了这么多,接下来该简单说说这货怎么用了。其实非常简单:下载,解压,双击打开即可。配置文件的写法可以参考这里,就是简单的 json 文件,如果有人愿意试用的话,先看看示例配置即可上手,最近正在准备文档。

最后补充一句, WNR 里面用到了一个内核扩展来查询数据包的所属进程,然而我并非 iOS 开发者,没有用于内核签名的账号,导致使用 WNR 的话需要手动停用 Mac OS 的内核扩展签名检查,这带来了一定的安全隐患。这部分代码非常少,仅有不到 1k 行,并且以后基本不会再变动,因此希望能有 V 友帮忙签名一下,感激不尽!

10691 次点击
所在节点    程序员
26 条回复
UnisandK
2016-03-26 16:55:01 +08:00
卧槽正需要这个
感谢楼主分享
scys
2016-03-26 17:07:24 +08:00
好工具~已经 Star
FinalTheory
2016-03-26 17:13:58 +08:00
@UnisandK @scys 谢谢支持~有问题欢迎来这里留言或者提 issue ,以便及时改进
congeec
2016-03-26 17:37:14 +08:00
比自带的 Network Link Conditioner 好多了
owlsec
2016-03-26 17:45:57 +08:00
star 为敬
xi_lin
2016-03-26 19:37:43 +08:00
赞!功能很强啊
everettjf
2016-03-26 19:53:33 +08:00
学习了。看起来高大上啊。明天给公司产品试用下。
konakona
2016-03-26 23:12:16 +08:00
3Q!已 STAR !
其实想问下...如果要测 IOS APP 的话怎么使..
FinalTheory
2016-03-26 23:52:27 +08:00
@everettjf 注意最后一句哈,使用时需要手动禁用内核扩展签名,不然无法工作的……毕竟不是 iOS 研发,开发者帐号略贵😂
FinalTheory
2016-03-26 23:54:13 +08:00
@konakona 理论上只要知道 iOS 模拟器的进程名字就可以了,比如 VirtualBox 的进程名是 vboxheadless ,那么针对这个进程进行网络模拟即可。
auser
2016-03-27 08:26:56 +08:00
看了下内核扩展的实现 拿进程信息的方式真够霸气
作者对 darwin 源码掌握真好
想知道作者的技术方向有哪些
spance
2016-03-27 09:04:18 +08:00
好东西,正好可以用来考验下 suft.
以前用 clumsy 时候,加个丢包乱序之后 io 效率火爆下降,不知道 wnr 会不会也是。
FinalTheory
2016-03-27 12:19:51 +08:00
@auser 表示根本不是做 Mac OS 研发的,写这个都是硬着头皮参考各种资料外加自己 YY 出来的😂
wzxjohn
2016-03-27 18:13:26 +08:00
@FinalTheory 找了半天没找到怎么载入的 Kernel Extension 。。。虽然自己签了一个但是不知大怎么用=。=
konakona
2016-03-27 19:12:09 +08:00
@FinalTheory 呃,并没有用到 OSX 。直接是在 IOS 上干!
FinalTheory
2016-03-27 19:17:31 +08:00
@konakona 唔这样啊,那直接共享出 WiFi 就可以模拟啦
FinalTheory
2016-03-27 19:18:57 +08:00
@wzxjohn 是启动模拟器的时候自动载入的,只是由于没有签名,会提示你载入失败,然后需要先禁用内核签名检查
wzxjohn
2016-03-27 21:54:02 +08:00
@FinalTheory 我指的就是自动载入的部分。。。没找到具体载入的代码在哪ˊ_>ˋ
FinalTheory
2016-03-28 12:45:46 +08:00
@wzxjohn 用来载入内核扩展的实际上是一个 C 函数,然后由 Python 调用。 Python 调用的入口在这里: https://github.com/FinalTheory/wireless-network-reproduction/blob/master/macdivert/macdivert.py#L139 然后调用的 C 函数在这里: https://github.com/FinalTheory/libdivert/blob/master/divert_kext.c
wzxjohn
2016-03-28 15:48:13 +08:00
@FinalTheory 看到了。。。可是我在你打包的 dmg 里面完全没看到这个 PacketPID.kext 文件夹?

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/266492

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX