• 异步编程经典 读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函数中有如下代码:

  • 相关阅读:
    好用的视频播放器
    如何屏蔽weGame今日推荐窗口
    存一个大佬的地图编辑器
    过渡页面,加载进度
    Lua中正弦,余弦函数的使用
    如何替换loadingBar的底图
    使用精灵帧缓存替换纹理
    setTexture和loadTexture之间的区别
    我胡汉三又回来了
    python中单斜杆和双斜杠的区别
  • 原文地址:https://www.cnblogs.com/lexus/p/2247510.html
Copyright © 2020-2023  润新知