《Web性能实践日志》一第1章 WebPageTest内部原理1.1 函数拦截

本节书摘来自异步社区《Web性能实践日志》一书中的第1章,第1.1节,作者【加拿大】Stoyan Stefanov,更多章节内容可以访问云栖社区“异步社区”公众号查看

第1章 WebPageTest内部原理

Web性能实践日志
作者:Patrick Meenan

我想借着今年的这次机会向大家介绍一下WebPageTest是如何从浏览器获取性能数据的。虽然它与Windows下一些工具的技术原理大同小异,但本章介绍的内容并不能代表这些工具的工作原理。

首先,请看图1-1,这张图可以帮助我们从浏览器端理解Windows的网络堆栈。


《Web性能实践日志》一第1章 WebPageTest内部原理1.1 函数拦截

不管是什么浏览器,只要运行在Windows下,体系结构几乎就如图1-1描述的一样,所有的传输都是通过Windows Socket API完成的,即Windows下几乎所有应用程序都使用TCP/IP协议,如图1-1描述。

1.1 函数拦截

WebPageTest工作的关键是能够拦截任意函数调用和检查,甚至可以中途改变请求和响应(也可以选择完全不传输)。很幸运,有人已经做了绝大部分重要的工作,并且提供了一个非常优秀的开源库(http://newgre.net/ncodehook),有了这个库,你就不需要关注实现的细节了,但你还是可以了解一下工作原理。

  • 在内存中找到目标函数(如果从dll导出会比较零碎)。
  • 把函数的前几个字节复制下来(确保x86指令完好无损)。
  • 使用跳转指令(jmp)重写函数入口让它指向到一个新函数。
  • 提供一个替代函数,这个函数包含刚才从源函数复制下来的字节以及用于指向剩余代码的跳转指令(jmp)。

这是一件非常细致的事情,稍不留神就会出岔子,但是使用定义良好的函数(如全部的Windows API),你就可以轻松地拦截任何你想拦截的内容。

这么做有一个缺点,就是你只能把调用重定向到运行在同一个进程下的代码,如果这些代码是你自己写的,那就没什么问题,但如果你要监测那些不受自己控制的软件的话就不太好了,反而可能还会带来一些麻烦。

上一篇:数据科学“内战”:统计vs.机器学习


下一篇:带你走近AngularJS - 体验指令实例