FACULDADE MERIDIONAL IMED BADALOTTI...In this work we present a parallel implementation of the...
Transcript of FACULDADE MERIDIONAL IMED BADALOTTI...In this work we present a parallel implementation of the...
FACULDADE MERIDIONAL – IMED
SISTEMAS DE INFORMAÇÃO
Mateus Badalotti Petkovicz
Otimização do algoritmo de agrupamento K-means
através do uso de GPUs e do framework OpenCL
Passo Fundo
2017
Mateus Badalotti Petkovicz
Otimização do algoritmo de agrupamento K-means
através do uso de GPUs e do framework OpenCL
Trabalho de Conclusão de Curso apresentado à
Escola de Sistemas de Informação, da Faculdade
Meridional – IMED, como requisito parcial para
obtenção do grau de Bacharel em Sistemas de
Informação, sob a orientação do Prof. Esp. Ralph José
Rassweiler Filho.
Passo Fundo
2017
Mateus Badalotti Petkovicz
Otimização do algoritmo de agrupamento K-means
através do uso de GPUs e do framework OpenCL
Banca Examinadora:
Prof. Me. Suellen Spinello Sotille
Prof. Me. Ralph José Rassweiler Filho
Prof. Me. Fahad Kalil
Passo Fundo
2017
RESUMO
Neste trabalho é apresentada uma implementação paralelizada do algoritmo de agrupamento K-
means, e sua possível aplicação para clusterizar dados de rede em cenários de muitos acessos
com possíveis ataques DdoS. O sistema utilizado para testes foi um Intel Core i7
[email protected] utilizando 16GB de Memória RAM GSkill RipjawsX DDR3@2400MHZ
CL11, operando em dual channel com dois módulos de 8GB cada, em uma placa mãe de chipset
Intel Z97 (MSI Z97 GD-65). A GPU utilizada foi uma Nvidia Geforce GTX 1080 com
GPU@2GHZ e 8GB GDDR5X VRAM@10GHZ (utilizando o driver versão 381.65 WHQL).
O desenvolvimento do algoritmo foi realizado utilizando o framework OpenCL. Também são
apresentadas diferenças entre CPU e GPU, como diferenças de arquitetura, funcionamento e
componentes presentes em cada dispositivo e o funcionamento alguns tipos de ataques DdoS.
A comparação de desempenho entre CPU e GPU, utilizando o OpenCL, no algoritmo
desenvolvido, apresentou um ganho de no mínimo seis vezes superior para a placa de vídeo,
explorando os recursos que a mesma oferece.
Palavras-chave: K-means paralelo. GPU. DDoS. OpenCL. Cluster.
ABSTRACT
In this work we present a parallel implementation of the K-means clustering algorithm and its
possible application to cluster network data in many access scenarios with possible DdoS
attacks. The system used for testing was an Intel Core i7 [email protected] using 16GB of RAM
GSkill RipjawsX DDR3 @ 2400MHZ CL11, operating in dual channel with two modules of
8GB each, on an Intel Z97 chipset motherboard (MSI Z97 GD- 65). The GPU used was an
Nvidia Geforce GTX 1080 with GPU @ 2GHZ and 8GB GDDR5X VRAM @ 10GHZ (using
the driver version 381.65 WHQL). The development of the algorithm was performed using the
OpenCL framework. Differences between CPU and GPU are also presented, such as differences
in architecture, operation and components present in each device and the operation of some
types of DdoS attacks. The performance comparison between CPU and GPU, using OpenCL,
in the algorithm developed, presented a gain of at least six times higher for the video card,
exploiting the features that it offers.
Keywords: Parallel K-means. GPU. DdoS. OpenCL. Cluster.
LISTA DE ILUSTRAÇÕES
Figura 1 - Diferenças de arquitetura entre CPU e GPU ........................................................... 12
Figura 2 - Arquitetura do OpenCL .......................................................................................... 15
Figura 3 - Funcionamento do OpenCL .................................................................................... 16
Figura 4 – Exemplo de funcionamento do algoritmo de agrupamento K-means .................... 21
Figura 5 – Demonstração do estado dos dados a cada iteração do K-means .......................... 22
Figura 6 – Funcionamento básico de um ataque DdoS ........................................................... 24
Figura 7 – Demonstração de um diagrama da implementação do K-means paralelo realizado
.................................................................................................................................................. 36
LISTA DE SIGLAS
AMD: Advanced Micro Devices
API: Application Programming Interface
BGP: Border Gateway Protocol
CDN: Content Delivery Network
CL: Cas Latency
CPU: Central Processing Unit
CUDA: Compute Unified Device Architecture
DDOS: Distributed Denial-of-Service
DDR: Double Data Rate
DNS: Domain Name System
DOS: Denial-of-Service
DSP: Digital Signal Processing
GB: Gigabyte
GDDR: Graphics Double Data Rate
GHZ: Gigahertz
GPGPU: General-purpose computing on graphics processing units
GPU: Graphics Processing Unit
GTC: GPU Conference Technology
HBM: High Bandwith Memory
HHH: Hierarchical heavy hitters algorithm
HTTP: Hypertext Transfer Protocol
IMAP: Internet Message Access Protocol
MHZ: Megahertz
NTP: Network Time Protocol
OpenCL: Open Computing Language
POD: Ping of Death
RAM: Random Access Memory
RNA: Redes Neural Artifical
ROP: Render Output Unit
SIMD: Single Instruction, Multiple Data
SMTP: Simple Mail Transfer Protocol
TCP: Transmission Control Protocol
URL: Uniform Resource Locator
VRAM: Video Random Access Memory
WHQL: Windows Hardware Quality Labs
SUMÁRIO
1. INTRODUÇÃO ................................................................................................................ 9
2. PROGRAMAÇÃO EM GPU ........................................................................................ 11
2.1. OpenCL ...................................................................................................................... 15
2.2. Aprendizagem de Máquina ........................................................................................ 18
2.2.1. Algoritmos de Agrupamento ..................................................................................... 20
3. TRATAMENTO DE ATAQUES DDOS E OTIMIZAÇÃO DE ALGORITMOS DE
APRENDIZAGEM DE MÁQUINA ..................................................................................... 25
3.1. Técnicas existentes .................................................................................................... 26
3.2. Otimização de algoritmos de aprendizado de máquina utilizando GPU ................... 30
4. PROPOSTA METODOLÓGICA ................................................................................. 33
4.1. Tipo da pesquisa ........................................................................................................ 33
4.2. População e amostra .................................................................................................. 34
4.3. Coleta de dados .......................................................................................................... 34
4.4. Análise dos dados ...................................................................................................... 35
5. DETALHAMENTO E RESULTADOS ....................................................................... 36
6. CONCLUSÃO ................................................................................................................. 41
BIBLIOGRAFIA .................................................................................................................... 42
9
1. INTRODUÇÃO
Distributed Denial of Service (DDoS) têm sido uma imensa ameaça para a Internet e
tudo que se encontra na mesma. As pesquisas e desenvolvimentos de ferramentas para detecção
e defesa contra-ataques DDoS resulta em não só o avanço dos sistemas de segurança de rede,
como também resultam em ferramentas de ataques constantemente melhoradas por atacantes
comprometidos a contornar esses sistemas de segurança.
Várias ferramentas de ataques DDoS são frequentemente atualizadas, contendo
correções para os mais avançados sistemas de detecção e prevenção, tornando esse tipo de taque
um perigo constante e cada vez mais complexo de se defender deste tipo de ataque.
Neste trabalho, será abordado assuntos como, diferenças básicas entre processamento
realizado via processador (CPUs) contra processamento realizado via placas de vídeo (GPUs),
arquitetura dos mesmos, como funciona o framework OpenCL e qual sua origem, tipos de
ataque DDoS e a diferença entre DoS e DDoS, possível otimização de algoritmo de clustering,
com testes aplicados em ambiente de rede com possíveis ataques DdoS, utilizando o
processamento de uma GPU. É possível melhorar o desempenho dos algoritmos de
agrupamento utilizando GPUs, para prevenção de ataques DDoS? Para resolver o problema de
baixo desempenho de alguns algoritmos de agrupamento em CPU, passar o processamento de
algoritmos de agrupamento para uma GPU, otimizando seu uso para ambientes onde é
necessário rodar vários agrupamentos em sequência para realizar a comparação de resultados.
Os objetivos gerais deste trabalho são avaliar algoritmos de agrupamento que rodam em
CPU e avaliar possíveis gargalos de uso de CPU em certas aplicações, avaliar algoritmos de
agrupamento processados em CPU que já foram portados para GPU, portar o algoritmo K-
Means para GPU, utilizando o framework OpenCL e avaliar se o seu desempenho compensa o
esforço necessário para realizar a sua escrita de forma paralela, e por fim, seu objetivo
específico é realizar a otimização do algoritmo K-means, utilizando GPUs e o framework
OpenCL. Como novidades o trabalho busca apresentar mais clusters em menos tempo, e como
motivação para realizar o trabalho é utilizada a possibilidade de apresentar uma ferramenta com
mais desempenho e possível solução para problemas de segurança, facilitando a visibilidade
dos dados.
No capítulo 2 será abordado a programação GPGPU (General-purpose computing on
graphics processing units), diferenças entre processamento e o funcionamento de uma GPU
10
contra processamento e funcionamento de uma CPU, origem e funcionamento do OpenCL,
aprendizagem de máquina e algoritmos de agrupamento.
No capítulo 3 será abordado os tipos existentes de ataques DDoS, métodos de
prevenção, aprendizagem de máquina e algoritmos de agrupamento, e a possível otimização
utilizando OpenCL e processamento via GPU.
11
2. PROGRAMAÇÃO EM GPU
A programação paralela utilizando placas gráficas de propósito geral, faz com que os
núcleos GPGPU (General-purpose computing on graphics processing units) trabalhem em
conjunto com uma CPU (Central Processing Unit) (NVIDIA, 2016), de forma a acelerar
aplicações de diversas áreas de atuação, tanto na área científica como na área corporativa. O
alto poder computacional e a acessibilidade a unidades de processamento gráfico (GPUs)
tornaram-nas os primeiros computadores paralelos acessíveis com teraflops de capacidade. Para
notar totalmente o poder de sistemas de propósito geral baseados em GPU (GPGPU), duas
questões fundamentais precisam ser tratadas com cuidado: como paralelizar um aplicativo em
itens de trabalho simultâneos e distribuir as cargas de trabalho em uma hierarquia de thread
blocks e threads, e como utilizar eficientemente a memória da GPU, dado o seu impacto
dominante sobre o desempenho (YANG et al., [s.d.]).
Sistemas de propósito geral baseados em GPU (GPGPU) são muito interessantes e
atrativos, com um desempenho alto e um custo relativamente baixo. Tal potencial de ganho de
desempenho é um desafio, pela complexidade de programação. Os desenvolvedores
normalmente têm que identificar seções adequadas do seu código para paralelização estilo
SIMD (Single Instruction Multiple Data), que é um método de operação de computadores com
várias unidades operacionais em computação paralela. Neste modo, a mesma instrução é
aplicada simultaneamente a diversos dados para produzir mais resultados. Para conseguir um
bom desempenho, uma reescrita significativa do código pode ser necessária para ajustar o uso
da GPU ao modelo de programação. Tal complexidade de programação é uma barreira para
uma maior adoção de sistemas GPGPU. (GREWE; WANG; O’BOYLE, 2013).
As GPUs podem apresentar um desempenho elevado em comparação a CPUs de mesma
geração em certas aplicações (GREWE; WANG; O’BOYLE, 2013). Placas de vídeo são
conhecidas por seu bom processamento paralelo, derivado de suas várias unidades de
processamento. Por exemplo, as duas principais fabricantes de placas de vídeos utilizam termos
diferentes para descrever seus núcleos, no caso da NVIDIA as unidades de processamento
seriam os CUDA (Compute Unified Device Architecture) Cores (Nvidia, 2016), e no caso da
AMD as unidades de processamento seriam chamados de Stream Processors (AMD, 2016).
Técnicas de classificação ou seleção que envolvem estratégias que se fundem são
particularmente propícios para sistemas GPGPU, elas são altamente paralelizáveis e a
12
granularidade computacional de tarefas simultâneas é minúscula (MERRILL; GRIMSHAW,
2010).
A biblioteca oficial de desenvolvimento para placas de vídeo NVIDIA é o CUDA, já a
AMD oficializou o OpenCL, como principal biblioteca. Ao buscar-se um framework mais
genérico para placas de vídeo, o mais indicado é utilizar OpenCL (já que este é suportada por
ambas empresas), caso buscarmos uma implementação de aplicação mais performática, com
placas de vídeo NVIDIA, o mais indicado é usar o CUDA. Uma definição formal de OpenCL
é descrita a seguir: “Recently, OpenCL, a new open programming standard for GPGPU
programming, has become available in addition to CUDA. OpenCL can support various
compute devices due to its higher abstraction programming framework.1”(KOMATSU et al.,
2010). O OpenCL foi escolhido para este trabalho por rodar em uma ampla gama de
dispositivos, o que facilita possíveis testes multiplataformas de desempenho.
Para compreender as diferenças no processamento de uma GPU em relação a uma CPU,
é preciso entender o que compõe cada CPU e cada GPU. Uma placa de vídeo é constituída de
uma GPU, que é o chip, ou o processador da placa de vídeo, e da "memória ram", que é chamada
de VRAM (Video Random Access Memory). Para efeito de comparação, hoje nos computadores
atuais, o CPU faz uso da RAM (Random Access Memory), DDR3 (Double Data Rate) ou
DDR4, nos processadores mais recentes, já nas placas de vídeo, é mais comum vermos a
utilização de GDDR5 (Graphics Double Data Rate), que é um padrão que traz uma velocidade
muito superior (JOONYOUNG KIM, YOUNSU KIM, 2014). Uma memória DDR3, muito
comum hoje, utilizada em larga escala, tem um limite máximo de banda de 12.8GB/s, já o
padrão HBM, que está dando os seus primeiros passos na indústria de placas de vídeo, consegue
oferecer um limite máximo de banda de 256GBps (JOONYOUNG KIM, YOUNSU KIM,
2014).
No mercado atual, com recentes lançamentos de novas placas, também já é possível
citar alguns exemplos de placas de vídeo que estão trazendo padrões acima do GDDR5, como
a NVIDIA GeForce GTX 1080 que traz o padrão GDDR5X e a AMD Fury X, que traz o padrão
HBM (High Bandwidth Memory) que já está acima do padrão GDDR5 e tende a ser o padrão
mais utilizado em um futuro próximo, apresentando melhor eficiência energética e maior
largura de banda (JOONYOUNG KIM, YOUNSU KIM, 2014).
1 Tradução livre: Recentemente, OpenCL, um novo padrão de programação aberta para programação GPGPU,
tornou-se disponível, além do CUDA. OpenCL pode suportar vários dispositivos de computação, devido à sua
estrutura mais alta de programação abstração.
13
Uma GPU é construída e projetada desde o começo para desempenhar um
processamento paralelo de matrizes em alta velocidade, dividindo as tarefas para serem
processadas em todos seus CUDA Cores ou Stream Processors. Para exemplo e comparação,
uma recém lançada NVIDIA GeForce GTX 1070 tem 1920 Cuda Cores (NVIDIA, 2016) e uma
AMD R9 Fury X tem 4096 Stream Processors (AMD, 2016).
Um processador, é projetado e desenvolvido para geralmente desenvolver tarefas em
ordem sequencial, apesar de ser mais preventivo que as GPUs atuais e também conseguir
realizar processamento paralelo, porém não tão performático quanto o processamento paralelo
das GPUs. Com apenas alguns núcleos, as CPUs mais comuns contam com 4 núcleos. Para
exemplo e comparação, um processador Intel Core i7 6700K tem 4 núcleos e 8 threads (INTEL,
2016).
Apesar de usarmos o termo core para definir unidades de processamento em GPUs e
CPUs, as diferenças entre eles são inúmeras. Um CPU core possui várias ALUs (Arithmetic
Logic Units) e FPUs (Float Point Units), e também uma série de componentes de controle,
como decodificadores de instruções, cache, unidade de gerenciamento de memória e muitos
outros. Uma GPU também tem muitos desses componentes, mas são compartilhados por várias
unidades de processamento (Cuda Cores ou Stream Processors). As GPUs são constituídas de
um front-end e um back-end. No front-end acontece o recebimento de instruções, e é onde
acontece a distribuição de trabalho para os núcleos, o front-end da GPU é constituído de
decodificadores de tarefas, agendadores de tarefas, registradores, além de um hardware
dedicado a processamento geométrico, por exemplo.
Figura 1 – Diferenças de arquitetura entre CPU e GPU
Fonte: http://www.e2matrix.com/blog/cpu-vs-gpu/
14
O back-end, é responsável por juntar todas as informações processadas e salvar os pixels
na memória da GPU, ele é constituído de ROPs (Render Output Unit), Cache L2 (Cache Level
2), controladores de memória e outros. As unidades de processamento ficam entre o back-end
e front-end realizando todo o trabalho pesado. As GPUs trabalham sob o método de operação
SIMD (Single Instruction, Multiple Data) (FLYNN, 1972), que é um método de operação com
várias unidades operacionais em computação paralela. Neste método de operação, todas as
unidades de processamento recebem uma instrução que são aplicados a diversos dados para
obter mais resultados.
O SIMD é otimizado para o tratamento de conjuntos regulares de dados, como por
exemplo, vetores e matrizes. Os núcleos da GPU possuem menos memória cache, recebem
instruções mais simples e tem uma taxa de clock menor (em comparação com CPUs), no
entanto, são otimizados para fazer mais cálculos como um grupo.
Em CPUs, os cores geralmente trabalham de forma serial, com uma instrução diferente
a cada ciclo. Um núcleo de uma CPU tem que lidar com cada operação que um computador
faz, calcular, buscar memória, I/O (Inputs/Outputs), interrupções, em razão disto, tem um
enorme conjunto de instruções complexas, e para otimizar o desempenho de buscar previsão de
desvios, é utilizado branch prediction. Branch prediction refere-se à capacidade de um CPU
para determinar se um branch será utilizado ou falhará.
Normalmente sob o modelo de execução sequencial, um processador irá executar uma
instrução e, em seguida, executar diretamente a próxima instrução. Um branch é um tipo
especial de instrução que pode dar instruções ao processador para ir ou não ir para uma próxima
instrução. Ao realizar o branch prediction, ele pode adivinhar quais instruções provavelmente
serão executadas com base em se o branch é utilizado ou não é, e em seguida, executá-los.
Se o branch prediction tem uma alta probabilidade de sucesso, então é provável que o
processador será capaz de executar programas de forma mais rápida do que se não tivesse
implementado um branch prediction, porque ele vai gastar menos tempo fazendo o trabalho
que ele não deveria estar fazendo (o que seria o caso, se a predição que o branch prediction
fazer, estiver errada). Já as GPUs não utilizam o branch prediction, porque caso um Cuda Core
ou Stream Processor estiver fazendo algo que não deveria estar fazendo durante um ciclo, as
perdas serão mínimas, levando em conta a quantidade de unidades de processamento que uma
GPU tem, contra um CPU que tem em média 4 núcleos. Os CPU cores também tem uma grande
cache e velocidade de clock rápida. Em CPUs, temos um conjunto de instruções onde
precisamos mais lógica, portanto, mais transistores e mais custo por núcleo em comparação
com uma GPU. No próximo item, o assunto OpenCL será tratado.
15
2.1. OpenCL
O OpenCL (Open Computing Language) é um padrão aberto, de baixo nível, livre de
royalties, para escrita de códigos de programação paralela que funcionem em CPUs e GPUS,
ele inclui uma linguagem baseada em C, além de APIs que são utilizadas para controlar os
softwares desenvolvidos com ele. Incialmente desenvolvido pela Apple e logo após com
colaborações de equipes técnicas da NVIDIA, AMD, Intel e IBM, o grupo de parceiros enviou
uma proposta inicial ao Khronos Group, que é uma ONG americana com foco em criação de
padrões abertos de APIs (Application Programming Interface) gráficas, mídia e computação
paralela. Depois de 5 meses de trabalho do grupo formado pela Apple, o OpenCL foi revisado
por membros do Khronos Group e aprovado, teve sua primeira versão lançada em 8 de
dezembro de 2008 (KHRONOS GROUP, 2016).
OpenCL is a new open programming standard for various compute devices. OpenCL
is used to develop code not only for GPUs, but also for multi-core CPUs, Cell
Broadband Engines, and other compute devices; a programmer can use these compute
devices in a unified way. Thus, it can enable a programmer to avoid writing a vendor-
specific code, resulting in improved code portability.2 (KOMATSU et al., 2010)
A AMD tornou o OpenCL como o padrão único de framework para suas GPUs (AMD,
2016). A NVIDIA oferece a CUDA como padrão e também oferece suporte ao OpenCL
(NVIDIA, 2016). Na nossa implementação, como buscamos uma aplicação que tenha um bom
desempenho e seja compatível com a maioria das plataformas, vamos utilizar o OpenCL.
Como todas as tecnologias, frameworks, linguagens de programação e afins, o OpenCL
tem seus pontos fortes e seus pontos fracos. O ponto mais forte do processamento paralelo, e
consequentemente do OpenCL, é a capacidade de usar todo o poder de processamento de CPUs
e GPUs simultaneamente para aceleramento da computação de dados. Como desvantagem, nem
todos algoritmos são passíveis de paralelização e pode ser muito difícil escrever algoritmos que
não são paralelos e transformá-los em algoritmos paralelizados. Nos casos onde é possível
realizar a paralelização do algoritmo, o OpenCL pode acelerá-los, e o ganho de tempo, na
2 Tradução livre: OpenCL é um novo padrão de programação aberta para vários dispositivos de computação.
OpenCL é usado para desenvolver o código não só para GPUs, mas também para CPUs de vários núcleos, motores
de celulares de banda larga e outros dispositivos de computação; Um programador pode utilizar estes dispositivos
de computação de forma unificada. Assim, pode permitir que um programador evitar escrever um código
específico do fornecedor, resultando em portabilidade de código melhorada.
16
maioria dos casos é muito grande. As possibilidades são incontáveis. Alguns exemplos são:
Descobertas de raízes e otimização, processamento e filtragem de imagens, cálculos de vértice
e vetores para modelos 3D, algoritmos evolutivos como algoritmos genéticos, interação de
partículas, scripts matemáticos (compilar o código escrito no seu tempo de execução) entre
outros. (CMSOFT, 2016).
A arquitetura de funcionamento do OpenCL compreende-se do padrão OpenCL para
desenvolvimento, que é composto por uma unidade de computação, um dispositivo, uma fila
de comandos, um kernel, um item de trabalho e um grupo de trabalho. Como o nome já diz, o
padrão OpenCL é o padrão de desenvolvimento de programação paralela para processadores
modernos. Uma unidade de computação é um dispositivo que tem um ou mais unidades de
processamento, um grupo de trabalho trabalha em uma única unidade de processamento, e uma
unidade de processamento é composta de um ou mais elementos de processamento e memória
local. Uma unidade de processamento também pode ter uma unidade dedicada de filtros e
texturas que podem ser acessadas por seus elementos de processamento. (INTEL, 2016).
Um dispositivo é uma coleção de unidades de processamento. A fila de comandos é
usada para ordenar e enfileirar comandos enviados para um dispositivo. Para exemplo de
comandos podemos citar a execução de kernels ou a leitura e escrita de objetos na memória do
dispositivo. Dispositivos OpenCL geralmente correspondem a uma GPU, uma CPU com
múltiplos núcleos e outros processadores, como DSPs (Digital Signal Processing). (INTEL,
2016).
Figura 2 - Arquitetura do OpenCL.
Fonte: http://www.rastergrid.com/blog/wp-content/uploads/2010/11/opencl_platform_model.png
17
Um kernel é uma função declarada em um programa escrito em OpenCL e executada
em um dispositivo OpenCL. Um item de trabalho é um item de uma coleção de execuções
paralelas de um kernel, executados em um dispositivo por um comando, ele é executado por
um ou mais elementos de processamento e é parte de um grupo que existe em uma unidade de
processamento. Um item de trabalho é distinguido de outras execuções da coleção por seu
identificador global e seu identificador local. (INTEL, 2016).
Um grupo de trabalho é um grupo de itens de trabalho que se executam em uma unidade
de processamento. Os itens de trabalho que estão no mesmo grupo de trabalho, rodam no
mesmo kernel e dividem a mesma memória local e as mesmas barreiras de grupo de trabalho.
Cada grupo de trabalho tem compartilhamento de dados entre itens de trabalho em sua memória
local, sincronização entre itens de trabalho através de barreiras e cercas de memória e funções
especiais já inclusas a nível de grupo de trabalho, por exemplo work_group_copy. (INTEL,
2016).
Figura 3 - Funcionamento do OpenCL.
Fonte: http://i.techweb.com/ddj/images/article/2011/0711/Scarpino2.gif
Uma CPU de múltiplos núcleos ou múltiplas CPUs (em um sistema com mais de um
processador), constituem apenas um dispositivo OpenCL, os núcleos são separados e formam
as unidades de computação. Ao lançar o kernel para execução, o código host define o tamanho
da grade ou o tamanho do trabalho em seu tamanho total. O código host também pode definir
o particionamento para grupos de trabalho, ou deixar para a implementação. Durante a
execução, a implementação cria um item de trabalho para cada ponto da grade e também agrupa
a execução em unidades de processamento, de acordo com o tamanho do grupo de trabalho. A
ordem de execução de itens de trabalho dentro de um grupo de trabalho e a ordem de execução
18
de grupos de trabalhos são específicos de cada implementação realizada em OpenCL. (INTEL,
2016). No próximo item, o assunto aprendizagem de máquina será tratado.
2.2. Aprendizagem de Máquina
A inteligência artificial está diretamente ligada a vida de praticamente toda a população,
presente em todos os lugares, pois é utilizada por diversos serviços e equipamentos eletrônicos,
para realizar sugestões com base no comportamento ou preferência do usuário, entre outras
inúmeras aplicações. O aprendizado de máquina traz uma nova maneira de escrever um
algoritmo e cada vez mais desafios são superados com formas cada vez melhores de
programação (SILVA; VANDERLINDE, 2012).
A aprendizagem de máquina é uma área ligada a Inteligência Artificial, que se dedica
ao desenvolvimento de algoritmos, técnicas e formas que possibilitam que o computador
aprenda, melhorando seu desempenho em uma tarefa específica. Dentro desta área, temos duas
divisões, a aprendizagem dedutiva, que são a aprendizagem de novas informações tomando
como base, algo que já conhecemos. E também temos a aprendizagem indutiva, que é a
inferência indutiva de fatos apresentados por um professor ou um ambiente. Neste tipo de
aprendizagem, um programa aprende a classificar objetos baseados nos rótulos que o professor
ou ambiente lhe apresenta.
The field of machine learning is concerned with the question of how to construct
computer programs that automatically improve with experience. In recent years many
successful machine learning applications have been developed, ranging from data-
mining programs that learn to detect fraudulent credit card transactions, to
information-filtering systems that learn users' reading preferences, to autonomous
vehicles that learn to drive on public highways. At the same time, there have been
important advances in the theory and algorithms that form the foundations of this
field.3 (MITCHELL, 1997).
3 Tradução livre: O campo da aprendizagem de máquina está preocupado com a questão de como construir
programas de computador que melhoram automaticamente com a experiência. Nos últimos anos muitas aplicações
de aprendizagem automática bem-sucedidas têm sido desenvolvidas, desde programas de mineração de dados que
aprendem a detectar transações de cartão de crédito fraudulentas, sistemas de informação e de filtragem que
aprender preferências de leitura dos usuários, a veículos autônomos que aprendem dirigir em estradas públicas.
Ao mesmo tempo, tem havido importantes avanços na teoria e algoritmos que formam as bases deste campo.
19
Conforme Coppin (2010), existem inúmeras formas de aprendizagem de máquina. Entre
elas, a aprendizagem por hábito que tem como principal característica o programa aprender de
acordo com os dados processados anteriormente, mas o programa apenas armazena dados que
podem ser classificados, caso ele não conseguir classificar os dados, este método falhará.
Também há o método de aprendizagem por conceito, onde todas hipóteses são analisadas e a
hipótese correta é demonstrada. No método de aprendizagem por conceito, há uma subdivisão,
chamada de “hipótese mais provável”, que significa, se caso não houver nenhuma hipótese
correta, o algoritmo irá encontrar a hipótese que mais se aproxima do correto, porém estes
métodos de aprendizagem tem um problema comum, nem sempre o usuário deseja saber a
hipótese correta e sim a hipótese mais comum.
Outra forma de aprendizagem de máquina, bastante avançada, é a rede neural, onde essa
rede tem um funcionamento semelhante ao de um cérebro humano, sendo formada de uma
grande rede de neurônios. As RNAs (Redes Neurais Artificias) podem ser compostas de uma
camada ou mais, em redes neurais de apenas uma camada, os dados são mapeados diretamente
em um conjunto de padrões de saída de rede, ou seja, não é possível formar uma representação
interna. Em RNAs de mais de uma camada, a primeira é responsável por receber os dados que
devem ser classificados, usando o aprendizado supervisionado, por modificarem a forma das
conexões de acordo com o que é informado, e depois ativam os neurônios de saída (COPPIN,
2010).
A segunda camada, também chamada de camada intermediária, funcionam como uma
extratora de características, seus dados são uma codificação de características apresentadas na
forma de entrada, na primeira camada, aqui criando um novo padrão, onde permite que a rede
crie sua própria representação do dado de entrada, mais rica e complexa. A terceira camada,
também chamada de camada de saída, recebe os dados da segunda camada, ou camada
intermediária, e constrói o padrão no qual será montada a resposta (USP, 2009). Abaixo temos
uma definição formal de clustering, de acordo com JAIN; MURTY; FLYNN, 1999.
Clustering is the unsupervised classification of patterns (observations, data items, or
feature vectors) into groups (clusters). The clustering problem has been addressed in
many contexts and by researchers in many disciplines; this reflects its broad appeal
and usefulness as one of the steps in exploratory data analysis. However, clustering is
a difficult problem combinatorially, and differences in assumptions and contexts in
different communities has made the transfer of useful generic concepts and
methodologies slow to occur.4
4 Tradução livre: Clustering é a classificação não-supervisionada de padrões (observações, itens de dados, ou
vetores de características) em grupos (clusters). O problema de agrupamento foi abordado em muitos contextos e
20
Em aprendizagem de máquina, uma área de muita importância, é o clustering, ou análise
de grupos, uma análise de similaridade entre objetos, para a formação de grupos de objetos mais
similares, uma técnica comum para a análise de dados, utilizada em muitos campos de atuação,
como a aprendizagem de máquina, reconhecimento de padrões, computação gráfica,
recuperação de informações, análise de imagens, compressão de dados, bioinformática,
marketing, biologia e muitas outras áreas. No próximo item, o assunto algoritmos de
agrupamento será tratado.
2.2.1. Algoritmos de Agrupamento
Algoritmos de agrupamento são algoritmos que particionam um conjunto de objetos ou
dados em agrupamentos, onde normalmente os objetos são descritos e agrupados usando um
conjunto de atributos e valores, onde não existe nenhuma informação sobre a classe ou categoria
dos objetos. O principal objetivo dos algoritmos de agrupamento é colocar os objetos similares
no mesmo grupo e objetos não similares em grupos diferentes. Eles são utilizados em diversas
áreas, assim como a aprendizagem de máquina, são utilizados em tarefas como, agrupamento
de documentos (textos) similares, identificação de grupos em redes sociais, segmentação de
clientes identificação de plantas ou animais com características comuns (MITCHELL, 1997).
Dentro a área de algoritmos de agrupamento, podemos separar eles em dois tipos
“principais”, os não hierárquicos ou planos, e os hierárquicos. O agrupamento hierárquico ou
plano, contêm um certo número de agrupamento e a relação entre os agrupamentos é geralmente
não determinada, a maioria dos algoritmos de agrupamento não hierárquicos são iterativos. Eles
iniciam com um conjunto inicial de agrupamentos e realocam os objetos em cada agrupamento
de maneira iterativa, até determinada condição de parada. O algoritmo de agrupamento plano
utiliza-se de suas diversas iterações para realocar os objetos nos melhores agrupamentos, onde
se encaixam por similaridade. Deve ser utilizado onde a eficiência é um atributo importante e
se o conjunto de dados é muito grande, e o algoritmo K-means é o método mais simples e deve
ser usado sobre novos conjuntos de dados, porque os resultados geralmente são suficientes
(WEIKUM, 2002).
por pesquisadores em muitas disciplinas; isso reflete seu amplo apelo e utilidade como um dos passos na análise
exploratória de dados. No entanto, o agrupamento é um problema difícil combinatória, e as diferenças de
pressupostos e contextos em diferentes comunidades tem feito a transferência de conceitos genéricos úteis e
metodologias lentas para ocorrer.
21
O critério de parada do K-means é baseado na qualidade dos agrupamentos
(similaridade média e cálculo para informação comum entre agrupamentos). Também é
necessário determinar o número de agrupamentos. Além da divisão de hierárquico ou não
hierárquico, temos a divisão de abordagens entre os algoritmos, os quais podem ser soft ou
hard. Na abordagem hard, cada objeto é inserido em apenas um agrupamento, já na soft, o
mesmo objeto pode ser inserido em vários agrupamentos com diferentes níveis de pertinência.
Em agrupamentos hierárquicos, geralmente a abordagem é hard, e em agrupamentos planos ou
não hierárquicos, ambos tipos de abordagens são comuns (WEIKUM, 2002).
O agrupamento hierárquico é representado por uma árvore, onde os nós folhas são os
objetos e cada nó intermediário representa o agrupamento que contêm todos os objetos de seus
descendentes. Os algoritmos de agrupamentos hierárquicos também só fazem sentido se a
função de similaridade é monotônica decrescente das folhas para a raiz da árvore. Sendo assim,
o agrupamento hierárquico é a melhor abordagem para análise exploratória de dados, fornece
mais informação do que o método de agrupamento plano, porém ao mesmo tempo é menos
eficiente do que o método de agrupamento não hierárquico, na questão de recursos como tempo
e memória gastos(WEIKUM, 2002).
O algoritmo K-Means, que é um algoritmo plano ou não hierárquico, baseia-se na
minimização de uma medida de custo, a distância interna entre os objetos do grupo. Ele é um
método de clustering que tem como objetivo particionar n observações dentro de k grupos, onde
cada observação pertence ao grupo mais próximo da média. A sua minimização do custo
garante encontrar um mínimo local da função objetivo, que dependerá do ponto inicial do
algoritmo. O K-means pode ser chamado de um algoritmo “não-convexo”, pois a cada iteração
realizada, o valor da distorção é diminuído, visto que o resultado final do mesmo, depende do
ponto inicial utilizado pelo algoritmo. Uma derivação do algoritmo K-Means, é o ISODATA,
uma modificação do algoritmo K-means. (MAJI; PAUL, 2014). Uma definição do
funcionamento do K-means é descrita abaixo, conforme a Phonetics Science, 2014.
Initially k number of so called centroids are chosen. A centroid is a data point
(imaginary or real) at the center of a cluster. In Praat each centroid is an existing data
point in the given input data set, picked at random, such that all centroids are unique
(that is, for all centroids ci and cj, ci ≠ cj). These centroids are used to train a kNN
classifier. The resulting classifier is used to classify (using k = 1) the data and thereby
produce an initial randomized set of clusters. Each centroid is thereafter set to the
arithmetic mean of the cluster it defines. The process of classification
and centroid adjustment is repeated until the values of the centroids stabilize. The
22
final centroids will be used to produce the final classification/clustering of the input
data, effectively turning the set of initially anonymous data points into a set of data
points, each with a class identity.5
Figura 4 – Exemplo de funcionamento do algoritmo de agrupamento K-means.
Fonte: http://jblomo.github.io/datamining290/slides/img/kmeansclustering.jpg
Na figura 4, é exemplificada a forma de execução do algoritmo, onde é lido pelo
algoritmo o número requisitado de clusters (K), que serão os centróides, onde o K-means irá
calcular a distância dos objetos a cada centróide, e agrupar os objetos baseado na distância
mínima do objeto ao centróide, em caso de nenhum objeto se mover de grupo, a iteração é
finalizada, apresentando os resultados (o número requisitado de K).
Este algoritmo pode ser aplicado em diversos ambientes, onde temos muitos dados e
precisamos ter uma visão geral do que está acontecendo, uma forma rápida de separar dados,
onde é necessário ter um grupo de itens similares onde todos os itens estão desorganizados.
5 Tradução livre: Inicialmente o número k dos chamados centroides são escolhidos. Um centróide é um ponto de
dados (imaginário ou real) no centro de um agrupamento. Em Praat cada centróide é um ponto de dados existentes
no determinado conjunto de dados de entrada, escolhidos aleatoriamente, de modo que todos os centróides são
únicas (ou seja, para todos os centróides ci e cj, ci ≠ cj). Estes centróides são usados para treinar um classificador
kNN. O classificador resultante é utilizado para classificar (usando k = 1) os dados e, assim, produzir um conjunto
aleatório inicial de clusters. Cada centróide é depois ajustado para a média aritmética do conjunto que define. O
processo de classificação e centróide ajuste é repetido até que os valores dos centroides se estabilizem. Os
centroides finais serão usados para produzir a classificação final / agrupamento dos dados de entrada,
transformando de forma eficaz o conjunto de pontos de dados anónimos inicialmente num conjunto de pontos de
dados, cada um com uma identidade de classe.
23
Para exemplificar este pensamento de ordenação de dados desorganizados, ele pode ser
aplicado na área de Marketing, para encontrar grupos de clientes com comportamento similar,
na área de Biologia, para classificação de plantas e animais de acordo com suas características,
em livrarias para ordenação de livros, na internet para classificação de documentos, e
processamento de acessos para identificar padrões de acessos dos usuários, no planejamento de
cidades, para identificar grupos de casas de acordo com o tipo da casa, valor e localização
geográfica, em estudos de terremotos para observar os epicentros dos terremotos para
identificar zonas perigosas, entre outras diversas possíveis aplicações do mesmo (DEIB, 2017).
Figura 5 – Demonstração do estado dos dados a cada iteração do K-means.
Fonte: http://jblomo.github.io/datamining290/slides/img/kmeansclustering.jpg
Na figura acima temos um exemplo visual de como o K-means trata os dados a cada
iteração, calculando a distância do objeto ao centróide a cada iteração do algoritmo.
O K-means apresenta vantagens nos termos de facilidade e eficiência. É rápido para
cálculos simples, possibilitando o processamento sequencial dos dados, o que causa baixa
quantidade de informações a serem processadas, sua desvantagem é a sua dependência dos
valores de k, da ordem em que as amostras são processadas, da escolha dos primeiros centros
de agrupamento, e da geometria das amostras prontas para análise. Em alguns casos específicos,
24
a utilização do algoritmo K-means requer a experimentação com vários valores de k e várias
escolhas dos parâmetros inicias. (MAJI; PAUL, 2014). No próximo capítulo, o assunto
tratamento de ataques DdoS e algoritmos de aprendizagem de máquina será tratado.
25
3. TRATAMENTO DE ATAQUES DDOS E OTIMIZAÇÃO DE
ALGORITMOS DE APRENDIZAGEM DE MÁQUINA
Distributed denial-of-service attacks, popularmente conhecidos como DDoS, são
ataques distribuídos de negação de serviço, que tem como objetivo sobrecarregar um serviço
ou servidor, para que o mesmo fique indisponível. Eles se tornaram mais conhecidos após este
tipo de ataque ter sido utilizado para derrubar serviços muito populares, como a Playstation
Network ou o Xbox Live, afetando milhões de usuários. Este tipo de ataque representa um risco
imenso para a Internet, sendo assim, vários mecanismos de defesa têm sido utilizados para
combatê-los. Os atacantes modificam constantemente suas ferramentas para contornar esses
sistemas de segurança já existentes, e as ferramentas são frequentemente modificadas para
poder lidar com novos ataques, criando uma busca infinita por um sistema perfeito de proteção
contra-ataques de negação de serviço. (GUPTA; DHIMAN, [s.d.]). No próximo item
abordaremos as técnicas existentes para a proteção e mitigação de ataques DDoS.
Figura 6 - Funcionamento básico de um ataque DDoS.
Fonte: https://assets.paessler.com/media/scales/lightbox/common/files/blog/2017/ddos-attack-infographic.png
Na Figura 6, apresentada acima, temos uma explicação gráfica de como funciona um
ataque DdoS básico, onde muitos acessos a um serviço ou servidor ocorrem, causando uma
sobrecarga ao servidor.
26
3.1. Técnicas existentes
Ataques de negação de serviço estão sendo cada vez mais frequente, e são uma ameaça
para a produtividade e rentabilidade da internet, uma ameaça para grandes portais de comércio
eletrônico, mecanismos de busca, redes sociais, geralmente focando serviços mais famosos e
em uma época de fragilidade no sistema, como em uma Black Friday (para lojas de comércio
eletrônico), ou uma grande promoção para lojas de jogos digitais (como a Steam Summer Sales).
É um método de ataque relativamente simples, e ao mesmo tempo, uma técnica muito poderosa
para atacar recursos e serviços. (ASOSHEH; RAMEZANI, 2008)
Na internet, facilmente encontramos toolkits extremamente sofisticados, com interface
amigável facilmente entendida por um usuário comum (ou leigo), onde geralmente é necessário
apenas a inserção do endereço da vítima e o ataque é iniciado. Isso acarreta em um grande
aumento na chance de sermos vítimas de um ataque DoS ou DDoS. (DOULIGERIS;
MITROKOTSA, 2004)
Como DDoS significa ataques distribuídos de negação de serviço, significa que existem
mais do que um objeto, ou vários objetos, que são os DoS (denial-of-service), enviados a um
único destino, visando causar lentidão no acesso ao serviço, reduzindo a qualidade do serviço
oferecido ou negar o acesso ao mesmo, esse ataque pode ser tanto humano, em grande
quantidade de ataques, ou automatizado. Durante um ataque DDoS, os pacotes de ataque vêm
de dezenas ou centenas de endereços diferentes, em vez de apenas um endereço como um ataque
DoS padrão. Para realizar a proteção contra um ataque DoS, o método de proteção é
relativamente simples, é necessário apenas monitorar o volume de pacotes proveniente de um
único endereço ou rede única, então, bloquear o acesso da mesma ao serviço. (GUPTA;
DHIMAN, [s.d.])
Para conseguir realizar uma sobrecarga no servidor alvo, o atacante precisa ter um poder
relativamente alto de enviar requisições a um servidor, o que é normalmente conquistado
através de um grande número de invasão de máquinas comuns, chamadas de “máquinas
zumbis”, que integram uma rede zumbi, que é comandada por uma máquina mestre.
Posteriormente instruir todas as máquinas invadidas a atacar o servidor alvo, com intenção de
esgotar seus recursos e indisponibilizar os serviços oferecidos pelo alvo. Em fevereiro de 2000
uma série de ataques de negação de serviço ocorreram, tendo alvos populares, como a
CNN.com, yahoo.com, eBay.com, amazon.com, por várias horas. (GUPTA; DHIMAN, [s.d.])
Analistas estimam que durante o tempo em que o Yahoo ficou indisponível, houve uma
perda de receita de aproximadamente US$ 500.000. Já a Amazon, sofreu outro ataque de
27
negação de serviço e ficou off-line aproximadamente 10 horas, o que resultou em uma perda de
receita de aproximadamente US$ 600.000. Durante estes ataques DDoS, a CNN.com teve
apenas 5% do volume normal de acessos, enquanto nos outros sites, o serviço ficou
praticamente inacessível. (GUPTA; DHIMAN, [s.d.])
Os ataques DDoS podem ser divididos em três tipos, os ataques baseados em volume,
os ataques baseados em ataques de protocolo e os ataques baseados em ataques na camada de
aplicação. Ataques baseados em volume incluem floods UDP, floods ICMP, e outros floods de
pacotes falsificados. O objetivo deste ataque é saturar a banda do site, serviço ou rede atacada,
e sua magnitude é mensurada em bits por segundo (bps). Os ataques baseados em protocolo,
incluem floods SYN, ataques de pacotes fragmentados, ping da morte, Smurf DDoS e outros.
Este tipo de ataque consome os recursos do servidor, ou dos seus equipamentos de comunicação
intermediária, como firewalls, balanceadores de carga, e o ataque é mensurado em pacotes por
segundo. (INCAPSULA, 2016).
Já o terceiro tipo de ataque, o ataque baseado em camada de aplicação, incluem ataques
baixos e lentos, flood de requisições de método GET/POST, ataques direcionados a possíveis
vulnerabilidades do sistema vítima, como o Apache, Windows ou OpenBSD. Composto de
requisições aparentemente inocentes e legítimas, o objetivo deste ataque é indisponibilizar o
uso do servidor web, deixando-o off-line, e sua magnitude é mensurada em solicitações por
segundo (INCAPSULA, 2016).
Alguns específicos, populares e particulares tipos de ataques são: Flood UDP, Flood de
ping ICMP, Flood SYN, Ping da Morte, Slowloris, Amplificação NTP, Flood HTTP e o Dia
Zero. O Flood UDP, faz proveito do protocolo UDP (User Datagram Protocol), um protocolo
sem sessão de rede. Este tipo de ataque inunda portas aleatórias em um host remoto com
inúmeros pacotes UDP, fazendo com que o host pare para verificar repetidamente a aplicação,
e quando nenhuma aplicação for encontrada, deve responder com um destino do pacote ICMP
inacessível. Este processo acaba por esgotar os recursos do host vítima, e em última instância
leva a inacessibilidade do serviço (INCAPSULA, 2016).
O flood de ping ICMP (Internet Control Message Protocol), é semelhante ao Flood
UDP, ele também realiza uma inundação ICMP, que oprime o recurso de destino com uma
requisição ping ICMP, geralmente enviando pacotes o mais rápido possível sem esperar por
respostas do host vítima. Esse tipo de ataque consome a banda de entrada e saída, uma vez que
os servidores da vítima, muitas vezes tentará responder com pacotes de resposta ICMP,
resultando numa desaceleração significativa no sistema (INCAPSULA, 2016).
28
Já o Flood SYN, explora uma fraqueza conhecida na conexão TCP, o three-way
handshake, onde um pedido SYN inicia uma conexão TCP com um host e deve ser respondida
com uma resposta do tipo SYN-ACK daquele host, e então, deve ser confirmado por uma
resposta ACK do solicitante. Em um cenário de Flood SYN, o atacante envia várias solicitações
SYN, mas não responde a resposta SYN-ACK, enviada pela vítima, ou envia os pedidos SYN
de um endereço de IP spoofed. Assim, a vítima continua a aguardar por uma confirmação para
cada um dos pedidos, até que os recursos sejam esgotados, resultando em uma negação de
serviço (INCAPSULA, 2016).
O ping da morte, também conhecido como POD (Ping of Death), é onde o atacante envia
vários pings malformados e mal-intencionados para a vítima. O tamanho máximo de um pacote
IP (incluindo seu cabeçalho) é de 65.535 bytes. No entanto, a camada de enlace, geralmente
coloca limites para o tamanho máximo do quadro, por exemplo, 1500 bytes através de uma rede
ethernet. Neste caso, um grande pacote IP é divido em vários pacotes IP (também chamados de
fragmentos), e o host recipiente reagrupa os fragmentos IP, para cada pacote IP completo. Em
um cenário de ataque DDoS do tipo ping da morte, após a manipulação maliciosa do conteúdo
dos fragmentos, o destinatário acaba com um pacote IP maior do que 65.535 bytes, quando
reagrupado no host recipiente. Isso pode estourar o uso de memória alocada para o pacote,
causando negação de serviço para pacotes legítimos (INCAPSULA, 2016).
O Slowloris, é um ataque altamente segmentado, permitindo que um servidor web
derrube outro servidor web, sem afetar outros serviços ou portas na rede alvo. Ele faz isso
mantendo o maior número de conexões abertas com o servidor web alvo, mas enviando apenas
um pedido parcial. O Slowloris constantemente envia mais cabeçalhos HTTP, mas nunca
completa um pedido. O servidor de destino, mantém cada uma dessas conexões falsas abertas.
Eventualmente, o número máximo de conexões simultâneas é estourado, o que conduz a
negação de conexões adicionais de clientes legítimos (INCAPSULA, 2016).
No ataque de tipo Amplificação NTP (Network Time Protocol), o autor do ataque
explora servidores NTP publicamente acessíveis, para sobrecarregar o servidor alvo com
tráfego UDP. Em um ataque de amplificação NTP, a proporção de query para resposta é algo
entre 1:20 até 1:200 ou mais. Isso significa que qualquer atacante que obter uma lista de
servidores NTP abertos (usando uma ferramenta como Metasploit, ou dados do Open NTP
Project), pode facilmente gerar uma devastadora banda de alta largura, um ataque DDoS de alto
volume (INCAPSULA, 2016).
Em um DDoS de tipo Flood HTTP, o atacante explora o uso de requisições GET/POST,
para atacar um servidor web ou aplicativo. O Flood HTTP não usa pacotes malformados,
29
técnicas de falsificação ou de reflexão, e requerem menos banda do que outros tipos de ataques
para derrubar o servidor, serviço ou rede alvo. O ataque geralmente é mais eficaz quando se
força o servidor a responder requisições que exigem mais processamento e dados retornados do
servidor, a cada requisição efetuada. Os ataques Dia Zero (ou Zero-day), são ataques
simplesmente desconhecidos ou novos, que exploram vulnerabilidades onde nenhum patch foi
liberado com a correção. O termo Dia Zero é bem conhecido entre os membros da comunidade
hacker, onde a prática de negociação de vulnerabilidades tornou-se uma atividade popular.
(INCAPSULA, 2016).
Como o DDoS é um método de ataque relativamente simples de executar e bastante
poderoso, grandes empresas normalmente tem uma abordagem de defesa composta de várias
camadas, já que não existem contramedidas reais e totalmente eficazes contra o ataque.
Empresas menores normalmente contratam serviços eficazes de terceiros, como por exemplo,
a CloudFlare ou MaxCDN, também, dependendo do seu caso de uso, pode ser um provedor de
nuvem, uma CDN (Content Delivery Network), uma solução baseada em BGP (Border
Gateway Protocol) ou uma solução baseada em DNS (NETWORK WORLD, 2016).
Na criação de várias camadas de proteção contra DDoS, estas são algumas opções
comumente utilizadas: contrato de banda excessiva, mitigação automatizada, upstream
blackholing, provedor de terceiros e um endurecimento de sistema. Estas ações visam garantir
a escalabilidade de banda, acompanhamento de métricas de desempenho, e métodos de detecção
de ataques. O contrato de banda excessiva é bastante simples, geralmente o contrato de uma
banda bastante acima do necessário é contratado pela empresa, que irá dar conta do crescimento
da empresa, dos acessos e também do DDoS. Se o atacante for incapaz de reunir tráfego o
suficiente para sobrecarregar toda essa banda, seu ataque vai ser geralmente ineficaz
(NETWORK WORLD, 2016).
Na mitigação automatizada, muitas ferramentas monitoram os dados trafegados pela
rede, e outras fontes de dados, onde uma linha base de tráfego é determinada. Se os padrões de
tráfego saem das zonas delimitadas, as ferramentas de mitigação DDoS atraem o tráfego para
elas, utilizando BGP ou outros mecanismos para filtrar este “ruído”. Após essa limpeza nos
dados, os dados limpos são passados para a rede. Este tipo de ferramenta geralmente pode
detectar ataques volumétricos, e ataques mais insidiosos, como o Slowloris. Os métodos
Upstream Blackholing, são maneiras de filtrar o tráfego UDP utilizando um router blackholing
(NETWORK WORLD, 2016).
Há casos onde a infraestrutura da empresa não tem necessidade de receber tráfego UDP,
NTP ou DNS, para dentro de sua infraestrutura, então, uma espécie de buraco negro é criada
30
para este tipo de tráfego. Os maiores ataques volumétricos são geralmente refletidos em NTP
ou ataques de amplificação DNS. Mesmo empresas bastante grandes temem um ataque de
largura de banda muito alta, como 300Gbps. Muitas vezes, um sistema de redirecionamento
DNS é implementado, ou um serviço baseado em BGP, para a proteção, no caso de um ataque
sustentado (NETWORK WORLD, 2016).
Na parte de endurecimento de sistemas, é tratada toda a parte de configuração de
sistemas operacionais, configuração e segurança de aplicativos para serem mais resistentes a
camada de aplicação de ataques DDoS. Coisas como, garantir que o servidor Linux tenha inodes
suficientes para configurar o número correto de worker threads do Apache, o que faz com que
fique mais difícil para o atacante derrubar o serviço que está sendo protegido (NETWORK
WORLD, 2016).
Dado o aumento do tamanho, frequência e escala de ataques DDoS, o planejamento para
a detecção de ataques DDoS, sua mitigação é uma prioridade crítica de negócios. Uma vez que
é virtualmente impossível construir uma infraestrutura suficiente para a escala em resposta a
um ataque DDoS grande, normalmente as CDNs fornecem ferramentas de proteção contra-
ataques DNS, estas ferramentas mitigam os ataques DDoS, absorvendo todo o tráfego DDoS
voltado para a camada de aplicação, desviando todos ataques DDoS direcionados a camada de
rede, tais como Flood SYN ou Flood UDP, e realiza uma autenticação de tráfego válido na
borda da rede. Esta proteção interna fica "sempre ligada", e apenas o tráfego da porta 80 (HTTP)
ou da porta 443 (HTTPS) é permitido. Para proteção adicional, muitas organizações adicionam
uma camada de defesa que protege o Domain Name Server (DNS) que está sendo
sobrecarregado e comprometida por ataques de negação de serviço (AKAMAI, 2016). No
próximo item abordaremos a otimização de técnicas existentes utilizando GPU.
3.2. Otimização de algoritmos de aprendizado de máquina utilizando GPU
Muitas soluções acadêmicas concentram-se exclusivamente na questão de como tráfego
de rede de pode ser agrupado de maneira eficiente. Erman; Arlitt, 2006, examinaram alguns
algoritmos de mineração de dados existentes: Agrupamento de aplicações com ruído baseado
na densidade espacial (DBSCAN), K-Means e AutoClass. Os algoritmos são avaliados e
comparados do ponto de precisão do tráfego de cluster em classes de tráfego conhecidas, então
do ponto de algoritmo de velocidade e o número de clusters que é produzido. McGregor et al.,
2004, também aplicaram técnicas de aprendizagem de máquina para agrupar cabeçalhos de
31
pacote de rede. Os autores mostraram uma correspondência adequada entre os tipos de tráfego
conhecidas em traços, tais como HTTP, SMTP, IMAP ou TCP DNS e as classes de tráfego
obtidas pelo agrupamento dos dados.
No entanto, os algoritmos de mineração de dados comuns não são a melhor escolha para
agrupar os dados de tráfego de rede. Em primeiro lugar, os conjuntos de dados de tráfego têm
tamanho maior comparado com os conjuntos de dados comuns em mineração de dados. Em
segundo lugar, com a finalidade de defesa DDoS, o tráfego de rede muitas vezes precisa ser
examinado em tempo real, o que significa que o cluster deve ser aplicado ao fluxo de dados.
Algoritmos de mineração de dados comuns são lentos para tal tarefa, ou exigiriam tão altos
recursos que não estão disponíveis em dispositivos de rede de computação. Terceiro, as
características tais como endereços IP e URLs de tráfego, tem uma estrutura hierárquica
específica. Assim, os pesquisadores desenvolveram algoritmos específicos para realizar o
agrupamento (clustering) do tráfego de rede.
Cormode et al., 2016, desenvolveram o algoritmo de pesos pesados hierárquico (HHH
- hierarchical heavy hitters algorithm), que é uma extensão do algoritmo de pesos pesados e
leva em conta a estrutura hierárquica do tráfego de rede. Os autores também forneceram versões
aproximadas do algoritmo de HHH que são suficientemente rápidas para agrupar o fluxo de
dados. Provas teóricas sobre os limites aproximados de erro para os algoritmos são fornecidos.
Hijazi et al., desenvolveram outro algoritmo que leva em consideração as caraterísticas e
especificações do trafego de rede. O algoritmo é nomeado agrupamento aproximado de divisão
hierárquica (ADHIC). O ADHIC é um algoritmo adaptativo uma vez que os recursos utilizados
durante a aglomeração, chamada (p,n)-grams, são escolhidos em função da estrutura do
conjunto de dados particular.
(P, n) -grams são definidos como “uma cadeia de bytes de comprimento n localizado a
uma p compensado em um pacote dentro de um fluxo de dados.” Os autores do algoritmo
ADHIC também desenvolveram uma implementação do algoritmo rápido e leve destinado para
o streaming dados que é chamado de netADICT (AURA; LAUD; LUKAYENKO, 2011).
Conforme Aura; Laud; Lukayenko, 2011, os conjuntos de dados trafegados pela rede
têm um tamanho maior comparado com os conjuntos de dados comuns em mineração de dados,
precisam ser analisados em tempo real e para realizar o clustering dos mesmos, os equipamentos
de uma rede normalmente não tem poder computacional suficiente, para que o ataque DDoS
seja detectado e para realizar uma mitigação e defesa contra o ataque, antes que a rede ou
serviço fique indisponível.
32
Para contornar tal adversidade, neste trabalho é sugerido o uso de GPGPU, juntamente
com o uso de algoritmos de aprendizagem de máquina. Normalmente sistemas GPGPU tem um
poder computacional muito superior a equipamentos de rede, suprindo a necessidade de alto
poder computacional. Também, é sugerido neste trabalho o uso do framework OpenCL, no qual,
o algoritmo K-Means será portado e testado em um ambiente de rede simulado, para análise de
desempenho do algoritmo paralelizado rodando em GPU.
33
4. PROPOSTA METODOLÓGICA
Apresentaremos neste item a proposta metodológica desta pesquisa, iniciando pela
descrição do tipo de pesquisa realizado, que foi uma pesquisa exploratória de caráter
qualitativo, a forma de coleta dos dados e como eles serão analisados.
Além disso, realizaremos uma definição da ferramenta utilizada no estudo, o OpenCL,
que é um framework especializado em processamento paralelo e multiplataforma, o que
possibilita a otimização de algoritmos que podem ser paralelizados.
4.1. Tipo da pesquisa
Segundo Selltiz et. al (1967) apud Gil (2008), as pesquisas podem ser classificadas em
três grupos que são: exploratórias, descritivas e, conforme denominação do autor, explicativas.
Utilizaremos a metodologia de pesquisa exploratória que, segundo Gil (2008), tem como
principal finalidade a aproximação e familiarização do problema, bem como o esclarecimento,
desenvolvimento e modificação de conceitos. Ainda, segundo o autor, essas pesquisas
"envolvem levantamento bibliográfico e documental, entrevistas não padronizadas e estudos de
casos". Neste sentido as mesmas têm, também, como objetivo "proporcionar visão geral, de
tipo aproximativo, acerca de determinado fato" (GIL, 2008).
Ainda se faz necessário afirmar que esta pesquisa exploratória será de caráter qualitativo
que, pode “descrever a complexidade de determinado problema, analisar a interação de certas
variáveis”. As pesquisas de abordagem qualitativa se diferem das pesquisas quantitativas, que
são criticáveis, uma vez que não empregam instrumentos estatísticos como base de pesquisa.
Ainda segundo o autor, as pesquisas de caráter qualitativo têm como objeto de pesquisa
situações complexas ou particulares e este método possibilita “descrever melhor a
complexidade dos problemas” (RICHARDSON, 1999).
Sendo assim, define-se esta pesquisa como exploratória, de caráter quantitativo, onde se
visa identificar e esclarecer a influência direta do uso do framework OpenCL e processamento
em GPU dentro de cenários de rede.
34
4.2. População e amostra
Seguindo a linha de pensamento desta pesquisa, a aplicação e testes da mesma foi
realizada em um cenário simulado de ataque DDoS, com dados dimensões aleatórias em cada
item, realizando a comparação de desempenho entre CPU x GPU.
Neste caso em específico, não teremos população, já que os resultados dependem do
desenvolvimento do software que, a partir deste momento, serão realizadas as comparações e
amostras, iniciando da comparação do desempenho do próprio algoritmo desenvolvido,
rodando em plataformas diferentes, já que o OpenCL nos permite rodar o mesmo código em
diversas plataformas.
Após realizar a comparação de desempenho entre as plataformas, com foco em GPU x
CPU, foram realizadas comparações de desempenho com os resultados apresentados. Foram
analisadas características como: desempenho, viabilidade de aplicação da solução no meio
corporativo, entre outros.
4.3. Coleta de dados
A coleta de dados é formada por diversas técnicas que são a parte prática da mesma,
estas técnicas são definidas como um conjunto de regras ou processos que são utilizados pela
ciência (LAKATOS, MARCONI, 2001). O método de pesquisa consiste em uma escolha de
procedimentos sistemáticos para a descrição e explicação dos fenômenos ocorridos
(RICHARDSON, 1999). Em pesquisas exploratórias, não é comum a utilização de hipóteses,
ou, quando existem, serem pouco definidas (AAKER, 2004). De acordo com isto, este estudo
não irá buscar definir hipóteses sobre a análise a ser feita, muito menos trabalhar com dados
qualitativos, mas sim com uma análise, entendimento e esclarecimento dos dados agrupados de
acordo com o problema de pesquisa definido neste trabalho.
As pesquisas de cunho exploratório utilizam-se de métodos que buscam diagnosticar
situações, explorar alternativas ou buscar novas ideias (ZIKMUND, 2001).
De acordo com os objetivos desta pesquisa, já descritos na mesma, foram realizadas
medições sobre o software, como o tempo em que o mesmo leva para fazer todo o
processamento necessário, o processamento utilizado pelo mesmo, a viabilidade de utilização
no meio corporativo.
35
Para a captura de dados foi utilizado o software proposto neste trabalho, com dados
gerados de forma aleatória como instrução para o algoritmo, após a captura e processamento
dos dados realizados pelo software, foi utilizada a técnica da observação, que consiste em
aplicar atentamente os sentidos físicos a um amplo objeto, para dele adquirir um conhecimento
claro e preciso (CERVO, BERVIAN, 2002 apud OLIVEIRA 2011). Com isso a observação se
torna vital para o progresso da pesquisa, tornando-o válido e não apenas uma "suposição". A
observação também é considerada uma coleta de dados para conseguir informações sob
determinados aspectos da realidade (OLIVEIRA, 2011).
4.4. Análise dos dados
A análise dos dados pode ser definida como uma das fases mais importante da pesquisa,
pois é a partir dela que serão apresentados os resultados e a conclusão da pesquisa. Conforme
citado no tópico anterior, os dados serão coletados a partir da observação do desempenho da
solução pretendida neste trabalho, comparando seu desempenho sendo utilizado em GPU x
CPU, e também comparado contra soluções utilizadas hoje em dia. Após comparar
características como custo, desempenho, viabilidade, aplicabilidade no ambiente corporativo,
o resultado deste trabalho será apresentado.
A ferramenta proposta é um software desenvolvido em OpenCL, com foco em uso em
sistemas GPGPU, com proposta de melhoria de desempenho sobre softwares que rodam em
CPU e que podem ser paralelizados. Como o OpenCL é multiplataforma, diversas comparações
de desempenho se tornam possíveis, além da comparação com outras ferramentas que existem
no mercado.
Para analisar os dados, foi realizado um cluster de todos os acessos (itens) e suas
características (dimensões). Para realizar o cluster dos dados de tráfego, o algoritmo K-means
foi escolhido pela aplicabilidade em qualquer ambiente onde pode ser lidado com números,
além da relativa facilidade de implementação, outros algoritmos de agrupamento tendem a ser
mais custosos no quesito de hardware. A ferramenta trabalha com dados de tráfego simulado
de rede, a fim de testar as diferenças de desempenho em GPU com uma larga quantidade de
dados.
36
5. DETALHAMENTO E RESULTADOS
Após realizar a implementação do KMeans em OpenCL, para simular um ambiente de
rede, foram utilizadas 5 dimensões em cada item. As dimensões fazem referência as
informações encontradas nos pacotes de rede, como por exemplo a duração do acesso, o
tamanho do pacote, o protocolo do pacote, o endereço de destino, o endereço de saída, etc. No
desenvolvimento do algoritmo, foi implementada uma função que gera dados aleatórios de
acordo com a especificação (recebida pelos parâmetros), para facilitar a comparação de
desempenho. A distância entre os pontos e os clusters utilizada, foi a distância euclidiana. Na
imagem abaixo é apresentado um diagrama do código que foi desenvolvido no algoritmo.
Figura 7 – Demonstração de um diagrama da implementação do K-means paralelo realizado.
Fonte: Desenvolvido pelo autor.
37
Observando o diagrama de execução do código desenvolvido, podemos observar que os
passos que exigem mais processamento (cálculo das distâncias para cada item e processamento
de cada item para verificar qual seu cluster (K) atual) , foram paralelizados, para possibilitar a
distribuição de carga de trabalho para a GPU. Abaixo temos uma tabela com todos os
parâmetros disponíveis para realizar a execução do algoritmo.
Tabela 1 – Explicação sobre os parâmetros que podem ser utilizados no algoritmo desenvolvido
Fonte: Desenvolvido pelo Autor
Parâmetro Função
-dataset_file Arquivo de entrada (txt, csv)
-output_file Arquivo de saída (resultados)
-g1 Rodar em modo OpenCL
CPU
-d num_sample
num_dims num_clusters
Parâmetro para gerar dados
aleatórios, passando número
de itens, dimensões e clusters
-num_clusters Número de clusters
(agrupamentos).
Observando a tabela acima, são listadas todas as configurações possíveis para rodar no
algoritmo via parâmetros na chamada de execução. Os parâmetros foram desenvolvidos desta
forma, pensando em facilitar a comparação entre desempenho de GPU e CPU. Na tabela abaixo
temos a explicação do que cada dimensão significa para um item.
Tabela 2 – Explicação sobre o significado das dimensões de cada item
Fonte: Desenvolvido pelo Autor
Dimensão Significado
1 Tipo do pacote
2 Tamanho do pacote
3 Duração do acesso
4 Porta de origem
5 Porta de destino
Observando a tabela acima temos os dados que foram clusterizados de forma simulada
no algoritmo, utilizando o parâmetro –d. Para testes, foi utilizado 1 item com 5 dimensões,
simulando um pacote (ou acesso a um sistema) com suas características (listadas acima). Na
38
tabela abaixo podemos observar e comparar o desempenho obtido na solução rodando em GPU
e CPU.
Tabela 3 – Resultados da comparação da execução do algoritmo em CPU e GPU
Fonte: Desenvolvido pelo Autor
Itens Dimensões Clusters Tempo em GPU Tempo em CPU Melhoria
1.000.000 5 10 47 segundos 333 segundos 7,1x
500.000 5 10 24 segundos 168 segundos 7x
250.000 5 10 19 segundos 130 segundos 6,8x
125.000 5 10 11 segundos 73 segundos 6,6x
62.500 5 10 5 segundos 32 segundos 6,5x
31.250 5 10 2,4 segundos 16 segundos 6,3x
15.625 5 10 1,4 segundos 8 segundos 6,1x
7.812 5 10 0,75 segundos 4,5 segundos 6x
Gráfico 1 – Resultados da comparação da execução do algoritmo em CPU e GPU
Fonte: Desenvolvido pelo Autor
Para realizar as comparações, foram realizados testes com várias quantidades de itens e
com 10 clusters. O hardware utilizado foi um Intel Core i7 [email protected] utilizando 16GB
de Memória RAM GSkill RipjawsX DDR3@2400MHZ CL11, operando em dual channel com
dois módulos de 8GB cada, em uma placa mãe de chipset Intel Z97 (MSI Z97 GD-65). A GPU
4724 19 11 5 2,4 1,4 0,75
333
168
130
73
3216 8 4,5
0
50
100
150
200
250
300
350
1.000.000 500.000 250.000 125.000 62.500 31.250 15.625 7.812
Tem
po
em
seg
un
do
s
Quantidade de itens
Comparação de desempenho entre CPU e GPU
GPU CPU
39
utilizada foi uma Nvidia Geforce GTX 1080 com GPU@2GHZ e 8GB GDDR5X
VRAM@10GHZ (utilizando o driver versão 381.65 WHQL).
Observando o gráfico e a tabela apresentado acima, podemos perceber que quando
aumentamos a quantidade de itens processados, a diferença entre GPU e CPU também aumenta.
Para obter a melhoria de desempenho apresentada acima (cerca de 6 a 7 vezes, dependendo da
quantidade de itens), foi necessário o desenvolvimento do K-means de forma paralela, o teste
do K-means desenvolvido de forma sequencial, teve um desempenho igual ou pior, comparando
com o CPU, mas estes resultados já eram esperados de acordo com o que foi pesquisado neste
trabalho, as GPUs necessitam de um código paralelizado para obterem o desempenho esperado.
Nos testes realizados, também foi detectado uma melhoria de desempenho significante em
GPU, quanto maior a quantidade de clusters requisitados.
Para paralelizar o algoritmo foi necessário dividi-lo em quatro partes. A primeira parte
da execução, calcula as distâncias entre cada ponto e cada centro de cluster. Em seguida, um
segundo kernel computa a associação real de cada ponto (isto é, o cluster mais próximo), usando
a matriz anterior. As próximas duas partes da execução calculam os novos centróides,
calculando a média de cada conjunto de pontos. O algoritmo desenvolvido segue o fluxograma
apresentado na Figura 4, o SIMD foi aplicado nos passos mais trabalhosos, onde todos os itens
devem ser recalculados, ou seja, na parte onde são calculadas as distâncias (distância
euclidiana) de cada ponto a cada cluster e a que cluster cada ponto se associa.
Explorar o uso de GPU para executar o K-Means paralelo provou ser uma opção viável
(especialmente para grandes conjuntos de itens e clusters) para aplicabilidade em diversos
setores onde o processo de cluster se aplica, apresentando uma melhoria de desempenho de seis
a sete vezes melhor que o CPU, a custo de uma reescrita do algoritmo, de forma paralela. A
implementação realizada é limitada apenas pela quantidade de VRAM disponível para a GPU,
sendo assim, escalona bem.
Como o autor nunca teve experiência com desenvolvimento de software para GPUs, os
desafios encontrados durante o processo foram inúmeros, como problemas com IDEs, falta de
conhecimento de sintaxe, problemas com instalação de drivers, tanto por parte da Intel quanto
por parte da Nvidia, também houve bastante dificuldade em entender e implementar a diferença
entre o K-means otimizado e o K-means paralelo.
Para futuros trabalhos, pode ser desenvolvido um port do algoritmo para CUDA,
podendo otimizar de forma mais eficiente o algoritmo, além de estudar a possível aplicação de
outros algoritmos de agrupamentos semelhante ao K-means, ou variações do mesmo. Também
em futuros trabalhos, o K-means poderia ser usado para detectar ataques DdoS, o K-means
40
ficaria rodando na GPU, com um número X de centróides (definido a partir da necessidade de
cada rede ou ambiente), as dimensões de um item também são adaptáveis a cada ambiente onde
é necessário executar a proteção contra esse tipo de ataque. A cada vez que o algoritmo finalizar
a execução, ele guarda na memória o valor das centróides, e na próxima vez que for executado
ele calcula a diferença entre elas, caso a diferença entre elas for maior que X (que também é
adaptável a cada ambiente), um alerta é pode ser enviado para o administrador.
41
6. CONCLUSÃO
O desenvolvimento do presente estudo possibilitou uma análise de como a otimização
via GPU de um algoritmo de agrupamento (neste caso, o K-means) pode melhorar o
desempenho do algoritmo, para apresentar os dados clusterizados de forma mais rápida. Os
testes foram realizados em um ambiente simulado de rede, com uma larga quantidade de dados,
os testes variaram de 7.812 até 1.000.000 de itens clusterizados, onde o K-means paralelo
rodando em GPU provou-se ser uma opção com uma performance de 6 a 7 vezes superior em
desempenho, dependendo do número de itens e clusters necessários, assim, consolidou a
hipótese de que o uso de GPUs otimizaria o desempenho do algoritmo de agrupamento K-
means.
O uso de GPUs para trabalhar com uma grande quantidade de dados também provou ter
uma ótima relação custo x benefício, já que a GPU conseguiu ser no mínimo seis vezes mais
rápida que a CPU e os dois tem um preço bastante semelhante no mercado atualmente. A
implementação desenvolvida neste trabalho pode ser aplicada em diversas áreas e os testes
realizados foram para a proteção de redes contra ataques DdoS, onde o algoritmo provou sua
eficiência. A implementação realizada torna possível realizar mais agrupamentos em menos
tempo, assim sendo uma ótima opção em ambientes onde necessitamos realizar vários
agrupamentos para comparar os seus resultados e também permite um upgrade de hardware
mais frequente, trocando apenas um componente do computador (a GPU), a cada geração,
visando obter mais poder de processamento.
Em futuros trabalhos, podemos portar este algoritmo utilizando a CUDA, da Nvidia,
para analisar se utilizando a mesma, o desempenho apresentado pode ser superior. Também
pode ser analisado o uso do algoritmo paralelizado em GPU, para outros ambientes que
necessitem de respostas rápidas em uma grande quantidade de itens, podendo ser aplicado nas
áreas de medicina, negócios e marketing, biologia e muitos outros.
42
BIBLIOGRAFIA
AAKER, D. A; KUMAR, V.; DAY, G.S. Pesquisa de marketing. São Paulo: Atlas, 2004.
ASOSHEH, A.; RAMEZANI, N. A comprehensive taxonomy of DDoS attacks and defense
mechanism applying in a smart classification. WSEAS Transactions on Computers, v. 7, n.
4, p. 281–290, 2008.
AURA, T.; LAUD, P.; LUKAYENKO, A. Mitigating DDoS attacks with cluster-based
filtering. 2011.
CERVO, A. L. BERVIAN, P. A. Metodologia científica. 5.ed. São Paulo: Prentice Hall,
2002. Core i7 6700K. Intel Ark. Disponível em: <http://ark.intel.com/pt-
br/products/88195/Intel-Core-i7-6700K-Processor-8M-Cache-up-to-4_20-GHz>. Acesso em:
30 ago. 2016.
COPPIN, Ben. Inteligência artificial. Rio de Janeiro: LTC, 2010.
CORMODE, G. et al. Finding hierarchical heavy hitters in streaming data. ACM
Transactions on Knowledge Discovery from Data, v. 1, n. 4, p. 1–48, 2008.
DDoS Attack Types & Mitigation Methods, Imperva. Disponível em
<https://www.incapsula.com/ddos/ddos-attacks/>. Acesso em: 04 set. 2016.
DEIB - Dipartimento di elettronica, informazione e bioingegneria, Milano. Diponível em <
https://home.deib.polimi.it/matteucc/Clustering/tutorial_html/>. Acesso em: 30 mai. 2017.
DOULIGERIS, C.; MITROKOTSA, A. DDoS attacks and defense mechanisms:
Classification and state-of-the-art. Computer Networks, v. 44, n. 5, p. 643–666, 2004.
ERMAN, J.; ARLITT, M. Traffic classification using clustering algorithms. of the 2006
SIGCOMM workshop on, p. 281–286, 2006.
FLYNN, M. J. Some computer organizations and their effectiveness. IEEE Transactions on
Computers, v. C-21, n. 9, p. 948–960, 1972.
GIL, A.C; Métodos e Técnicas de Pesquisa Social. 6a edição, São Paulo, 2008.
43
GUPTA, N.; DHIMAN, M. A Study of DDOS Attacks, Tools and DDOS Defense
Mechanisms. International Journal of Engineering Research and Applications (IJERA)
www.ijera.com, v. 1, n. 3, p. 438–440, [s.d.].
GeForce GTX 1070 Graphics Card. GeForce. Disponível em:
<http://www.geforce.com/hardware/10series/geforce-gtx-1070>. Acesso em: 30 ago. 2016.
HBM. AMD. Disponível em: <http://www.amd.com/pt-br/innovations/software-
technologies/hbm >. Acesso em: 06 set. 2016.
HBM: Memory Solution for Bandwith-Hungry Processors. SK Hynix. Disponível em:
<http://doc.xdevs.com/doc/Memory/HBM/Hynix/HC26.11.310-HBM-Bandwidth-Kim-
Hynix-Hot%20Chips%20HBM%202014%20v7.pdf>. Acesso em: 27 set. 2016.
Mitchell, T. M. (1997).
Machine Learning. McGraw-Hill. How k-means clustering Works, Phonetic Sciences.
Disponóvel em: <http://www.fon.hum.uva.nl/praat/manual/k-
means_clustering_1__How_does_k-means_clustering_work_.html>. Acesso em: 27 set.
2016.
HIJAZI, A. et al. Discovering packet structure through lightweight hierarchical clustering.
IEEE International Conference on Communications, p. 33–39, 2008.
JAIN, A. K.; MURTY, M. N.; FLYNN, P. J. Data clustering: a review. ACM Computing
Surveys, v. 31, n. 3, p. 264–323, 1999.
KOMATSU, K. et al. Evaluating Performance and Portability of OpenCL Programs. Science
And Technology, v. 2, n. August 2016, p. 52, 2010.
LAKATOS, E. M.; MARCONI, M. A.; Fundamentos metodologia científica; 4. ed. São
Paulo: Atlas, 2011.
MAJI, P.; PAUL, S. Scalable pattern recognition algorithms. n. November 2008, 2014.
MCGREGOR, A. et al. Flow clustering using machine learning techniques. Lecture Notes in
Computer Science (including subseries Lecture Notes in Artificial Intelligence and
Lecture Notes in Bioinformatics), v. 3015, p. 205–214, 2004.
MERRILL, D. G.; GRIMSHAW, A. S. Revisiting sorting for GPGPU stream architectures.
44
Proceedings of the 19th international conference on Parallel architectures and
compilation techniques - PACT ’10, n. February, p. 545, 2010.
OLIVEIRA, M. F./ Metodologia científica: um manual para a realização de pesquisas em
administração; Catalão, UFG, 2011.
OpenCL. Khronos Group. Disponível em: <https://www.khronos.org/opencl/>. Acesso em:
14 set. 2016.
OpenCL. Nvidia. Disponível em: <https://developer.nvidia.com/opencl>. Acesso em: 14 set.
2016.
OpenCL Zone. AMD. Disponível em: http://developer.amd.com/tools-and-sdks/opencl-zone/.
Acesso em: 14 set. 2016.
OpenCL Capabilities and Limitations. CMSoft.. Disponível em:
<http://www.cmsoft.com.br/opencl-tutorial/capabilities-limitations/>. Acesso em: 13 set.
2016.
OpenCL Optimization Guide and Concepts. Intel. Disponível em:
<https://software.intel.com/sites/landingpage/opencl/optimization-
guide/Basic_Concepts.htm>. Acesso em 13 set. 2016.
O que é computação com aceleração em GPU? Nvidia. Disponível em:
<http://www.nvidia.com.br/object/what-is-gpu-computing-br.html>. Acesso em: 06 set. 2016.
Perceptron Multi-Camadas (MLP), USP. Disponível em
<http://conteudo.icmc.usp.br/pessoas/andre/research/neural/MLP.htm>. Acesso em: 28 set.
2016.
Placas de vídeo AMD Radeon™ série R9. AMD. Disponível em: <http://www.amd.com/pt-
br/products/graphics/desktop/r9>. Acesso em: 30 ago. 2016.
Protect against DDos Attacks, Akamai. Disponível em:
<https://www.akamai.com/us/en/resources/protect-against-ddos-attacks.jsp>. Acesso em: 09
out. 2016.
RICHARDSON, R. J./ Pesquisa social: métodos e técnicas; 3. ed. São Paulo: Atlas, 1999.
45
SELLTIZ, WRITSMAN,COOK. Métodos de pesquisa nas relações sociais. 2 ed. São Paulo,
1987
SILVA, B.; VANDERLINDE, M. Inteligência Artificial, aprendizado de máquina. p. 1–
10, 2012.
The best way to stop DDoS attacks, Network World. Disponível em:
<http://www.networkworld.com/article/2905115/network-security/the-best-way-to-stop-ddos-
attacks.html>. Acesso em: 04 set. 2016.
WEIKUM, G. Foundations of statistical natural language processing. ACM SIGMOD
Record, v. 31, n. 3, p. 37, 2002.
YANG, Y. et al. A GPGPU Compiler for Memory Optimization and Parallelism
Management. p. 86–97, [s.d.].
ZIKMUND, W. G. Business research methods. 5.ed. Fort Worth, TX: Dryden, 2000.