异步编程经典 读skipfish源码 转

http://blog.dccmx.com/2011/01/skipfish-src-reading/

异步编程经典 读skipfish源码

dccmx 于 2011年 一月 14日 发表 | 最后修改于 2011年 一月 14日

skipfish是google开源出来的一款安全检测工具(google真是好啊,开源了好多东东)。作者是个geek,写起程序来相当精干老道,项目主页上列举其特点之一:

High speed: pure C code, highly optimized HTTP handling, minimal CPU footprint – easily achieving 2000 requests per second with responsive targets.

一个单线程的程序如何能达到这个性能我们就来分析一下源码吧。

先从高处俯瞰一下整个程序:

整个程序分为一下几个模块:

http模块(http_client.c),数据管理模块(database.c),爬虫兼攻击模块(crawler.c,analysis.c)和报表模块(report.c)。

其中http模块主要负责http回话的的处理,包括url解析,请求的发送,响应的解析。这个模块没用三方库来处理,所有功能都自己实现,相当牛,也相当高效。

数据管理模块主要是管理爬虫需要的站点树和检查出的错误,不多说。

爬虫兼攻击模块负责在url里插入攻击向量,以及html解析和攻击结果的检查。

报表模块是最后生成网页报表的模块,就是把数据模块里的数据输出,不解释。

好,我们来仔细分析http模块和攻击模块。

我们仔细想下整个程序的性能问题就可以发现,攻击往往是顺序进行的。而网页的下载却有快有慢(更内容多少,即时网速都有关)。所以,如果将http的处理逻辑串到攻击逻辑里面必然会造成一会儿网卡忙cpu闲,一会儿cpu闲而网卡忙。这个问题在我前面一篇文章讨论过。解决方法毫无疑问,异步化,下面我们就来看看这两个逻辑是如何异步交互的。

从攻击的角度来看:一个url需要往往都要经过至少以下一些检查步骤:

1.url的类型检查

2.xss测试

3.sql注入测试

从http的角度来看,一个url意味着建立连接,发送请求,接收响应。

从http入手,如何将网卡的性能发挥到100%,并发!skipfish的并发采用了最简单的poll,你可能疑问为什么不用epoll,答案很简单,并发量不多(skipfish默认并发是40个连接),因为http的请求主要是下载,所以一个连接需要下载很多东西,几十个连接流量已经不小了。这不是关键,不多说了。整个skipfish的主循环也在http模块中:u32 next_from_queue(void)。在main函数中有如下代码:

你可能感兴趣的:(编程)