У меня есть веб-сайт, и я также изучаю параллельную обработку в C#, и я подумал, что было бы неплохо узнать, смогу ли я написать свой собственный тестовый сценарий DDOS, чтобы увидеть, как сайт будет обрабатывать DDOS-атаку. Тем не менее, когда я запускаю его, кажется, что используется только 13 потоков, и они всегда возвращают 200 кодов состояния, никогда ничего, что бы указывало на то, что ответ не был быстрым и точным, и при переходе на сайт и обновлении одновременно со сценарием запускает сайт быстро.
Я знаю, что существуют инструменты для тестов на проникновение и так далее, но мне было просто интересно, почему я не могу использовать Parallel l oop, чтобы сделать достаточно одновременных HTTP-запросов к сайт, который будет бороться, чтобы загрузить быстро и вернуть ответ. Кажется, я получаю больше проблем из Twitter Ru sh, просто отправив в Твиттере ссылку на новую страницу сайта и сотню BOTS, которые все ru sh одновременно с сайтом копируют, сканируют, проверяют и т.д. c чем что-либо, что я могу бросить в него, используя Параллель l oop.
Есть ли что-то, что я делаю неправильно, что ограничивает количество одновременных потоков, или это то, что я не могу контролировать. Я мог бы просто бросить множество длинных поисковых запросов, которые, как я знаю, будут сканировать всю БД, возвращая 0 результатов в каждом запросе, поскольку я видел это в действии и в зависимости от размера сканируемых данных и сложности поискового запроса, который он может вызывать скачки ЦП и медленную загрузку.
Таким образом, без лекции по использованию других инструментов есть способ генерировать более 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");
}
}