在C#中使用并行处理来测试站点承受DDOS的能力

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

我有一个网站,我也正在探索C#中的并行处理,我认为这是一个好主意,看看是否可以编写自己的DDOS测试脚本来了解该网站如何处理DDOS攻击。但是,当我运行它时,似乎只使用了13个线程,它们总是返回200个状态代码,从没有任何内容表明响应不是快速而准确的,并且在访问站点并与脚本同时刷新时快速运行网站加载。

我知道那里有用于渗透测试的工具,等等,但是我只是想知道为什么我不能使用Parallel循环向站点发出足够多的并发HTTP请求,以致于它很难快速加载并返回响应。似乎我在Twitter Rush中遇到了更多问题,只是在Twitter上发布了指向该网站上新页面和100多个BOTS的链接,而这些链接同时都涌向该网站以进行翻录,扫描,检查等,这比我能投给它的任何东西都要多使用并行循环。

是否有我做错的事情限制了并发线程的数量,或者这是我无法控制的事情。我可以抛出许多冗长的搜索查询,因为我知道这会在整个过程中扫描整个数据库,因此每个请求返回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
1个回答
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);
        }
© www.soinside.com 2019 - 2024. All rights reserved.