zoukankan      html  css  js  c++  java
  • 异步编程经典 读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函数中有如下代码:

  • 相关阅读:
    人月神话阅读笔记之二
    人月神话阅读笔记之三
    人月神话阅读笔记之一
    清楚浮动的10种方法
    WEB颜色值得设定
    文件上传 FileReader()
    Git学习笔记(三)
    Git学习使用笔记(二)
    Git使用学习笔记 (一)
    小知识点(JS)
  • 原文地址:https://www.cnblogs.com/lexus/p/2247510.html
Copyright © 2011-2022 走看看