在C#中使用并行处理来测试网站抵御DDOS的能力。

问题描述 投票:1回答:2

我有一个网站,我也在探索C#中的并行处理,我想这将是一个好主意,看看我是否可以写我自己的DDOS测试脚本,看看网站将如何处理DDOS攻击.然而,当我运行它时,似乎只有13个线程在使用,并且它们总是返回200个状态码,从来没有任何东西表明响应不快不准确,当进入网站并在脚本运行的同时刷新时,网站加载很快。

我知道有一些工具可以进行渗透测试等等,但我只是想知道为什么我不能使用Parallel loop来对网站进行足够多的并发HTTP请求,使其难以快速加载并返回响应。似乎我从Twitter Rush中得到的问题更多,仅仅是通过在网站上推送一个新页面的链接,以及100多个BOTS都并发地冲到网站上进行抓取、扫描、检查等,而不是任何我可以使用Parallel循环扔给它的东西。

是我做错了什么,限制了并发线程的数量,还是我无法控制。我可以直接抛出许多长篇大论的搜索查询,我知道这些查询会扫描整个DB,在每个请求中返回0个结果,因为我已经看到了这种情况,根据要扫描的数据大小和搜索查询的复杂性,它可能会导致CPU峰值和缓慢的负载。

所以,如果不讲究使用其他工具,有没有办法抛出100多个并行请求来加载一个页面,而不是最大13个线程,它可以完美地处理。

下面是代码,URL和要做的HTTP请求数是作为命令行参数传递进来的。

static void Attack(string url, int limit)
{
    Console.WriteLine("IN Attack = {0}, requests = {1}", url, limit);
    try
    {
        Parallel.For(0, limit, i =>
        {

            HttpWebRequest webRequest = (HttpWebRequest)WebRequest.Create(url);
            webRequest.ServicePoint.ConnectionLimit = limit;
            HttpWebResponse webResponse = webRequest.GetResponse() as HttpWebResponse;

            int statuscode = Convert.ToInt32(webResponse.StatusCode);

            Console.WriteLine("iteration {0} on thread {1} Status {2}", i,
                                Thread.CurrentThread.ManagedThreadId, statuscode);
        });
    }
    catch (AggregateException exc)
    {
        exc.InnerExceptions.ToList().ForEach(e =>
        {
            Console.WriteLine(e.Message);
        });
    }
    catch (Exception ex)
    {
        Console.WriteLine("In Exception: " + ex.Message.ToString());
    }
    finally
    {
        Console.WriteLine("All finished");
    }
}
c# multithreading http parallel-processing ddos
2个回答
0
投票

你可以像这样试试。

        var socketsHandler = new SocketsHttpHandler
        {
            PooledConnectionLifetime = TimeSpan.FromSeconds(1),
            PooledConnectionIdleTimeout = TimeSpan.FromSeconds(1),
            MaxConnectionsPerServer = 10
        };

        var client = new HttpClient(socketsHandler);

        for (var i = 0; i < limit; i++)
        {
            _ = await client.GetAsync(url);
        }

0
投票

你可以像这样尝试: Parallel.For 方法是使用来自 ThreadPool. 池中的初始线程数量通常较少(与机器中的逻辑处理器数量相当)。当池中的线程饥渴时,新线程会以每500毫秒一个的速度注入。解决问题的简单方法是简单地增加立即按需创建线程的数量,使用的是 SetMinThreads 方法。

ThreadPool.SetMinThreads(1000, 10);

因为每个线程都要为它的堆栈分配1MB的内存 所以你不可能有几百万个线程。可扩展的解决方案是采用async,这样可以尽量减少对线程的使用。

© www.soinside.com 2019 - 2024. All rights reserved.