Dos tareas comunes cuando se trabaja con arreglos de datos son el buscar datos y el organizar los datos usando algún orden, ascendente o descendente, alfabéticamente o numéricamente. Para realizar estas tareas eficientemente se siguen algoritmos de búsqueda y de ordenamiento. Un algoritmo sencillo para hacer búsquedas es el de búsqueda lineal. Dos algoritmos de ordenamiento sencillos y bien conocidos son el ordenamiento de selección (Selection sort) y el ordenamiento por burbujas (Bubble sort). En esta experiencia de laboratorio completarás una aplicación para el monitoreo de flujo de redes para practicar la implementación del algoritmo de búsqueda lineal y algoritmos de búsqueda.
Implementar una modificación del algoritmo de búsqueda lineal.
Practicar el ordenamiento de arreglos por selección y por método de “burbuja”.
Practicar el uso de objetos, estructuras de decisión y repetición.
Aprender algunos métodos de la clase vector
de C++.
Antes de llegar al laboratorio debes:
Repasar los algoritmos de búsqueda lineal, ordenamiento por selección y de burbuja.
Estudiar el método size()
de la clase vector
de C++.
Familiarizarte con los métodos de la clase Packet
incluida en el archivo packet.h
del proyecto NetworkAnalyzer
.
Estudiar los conceptos e instrucciones para la sesión de laboratorio.
Tomar el quiz Pre-Lab que se encuentra en Moodle.
Las computadoras se comunican por medio del Internet utilizando el Protocolo de Internet (IP, por sus siglas en inglés). Cuando una computadora envía información (o mensaje) a otra computadora, la información se envía por Paquetes de Internet que contienen la dirección fuente (“source address”), que es la dirección de Internet de la computadora que está enviando la información, y la dirección del destino (“destination address”), que es dirección de Internet de la computadora que debe recibir el mensaje. Las direcciones de Internet se usan para guiar la información de una computadora a otra, pero, una vez el paquete llega a su destino, ?quién se supone que reciba la información? ?Cuál aplicación debe recibir la información?
Los paquetes de internet también deben especificar la aplicación que envía la información y la aplicación que debe recibirla. Podemos pensar que las direcciones de Internet son las direcciones de correo de una casa, y que las aplicaciones que envían y reciben la información son las personas que envían y reciben la correspondencia. Para enviar una carta por correo, hay que especificar a qué persona se le está enviando la carta. Esto corresponde a especificar la aplicación que recibe la información. Para identificar la aplicación fuente y la aplicación del destino, el protocolo de Internet usa lo que se conoce como números de puerto. De este modo, mirando la información del paquete, se puede identificar las direcciones y puertos de la fuente y del destino.
Por ejemplo, cuando la computadora que usas en un laboratorio se comunica con el servidor donde se encuentra el programa Moodle, los paquetes que llevan la información de tu computadora al servidor contienen la dirección de la fuente, que es la computadora del laboratorio, y la dirección del destinatario, que es el servidor de Moodle. El puerto fuente es el de tu buscador web y el puerto destinatario es el del servidor de Moodle.
Las direcciones de internet ocupan 4 bytes (32 bits) y usualmente se presentan al usuario como cadenas de 4 valores decimales. Cada valor decimal entre 0 y 255 es la representación decimal de uno de los 4 bytes:
“(0-255).(0-255).(0-255).(0-255)”. Algunos ejemplos de direcciones de IP son:
10.0.1.10
, 192.168.10.11
, 136.145.54.10
.
Los números de puertos ocupan 2 bytes (16 bits). Por lo tanto, los valores para los números de puertos van de 0 a 65535. Algunos números de puertos asignados a aplicaciones de servicios conocidos son: 22 para ssh
, 23 para telnet
, 25 para smtp
, 80 para http
.
La aplicación que veremos hoy se puede utilizar para monitorear lo que se conoce como flujo en redes o “NetFlows”. Un “NetFlow” se compone al unir los paquetes de una comunicación unidireccional entre las aplicaciones de dos computadoras. Por ejemplo, un “NetFlow” se puede componer de los paquetes usados para enviar la información desde tu buscador web a la aplicación http
del servidor de Moodle.
La Figura 1 muestra la interface de la aplicación Network Analyzer.
Figura 1. Interface para manejar la aplicación de Network Analyzer.
Cada fila en la tabla de la Figura 1 contendrá un “NetFlow” compuesto de las direcciones de la fuente y del destinatario, los puertos de la fuente y del destinatario, el número de paquetes y el número de octetos (8 bits) en una comunicación unidireccional entre las computadoras fuente y destinataria, desde el puerto fuente al puerto destino.
La aplicación que completarás hoy le permitirá al usuario el analizar el estatus de una red. Entre otras cosas, le permitirá:
Para esta experiencia de laboratorio utilizarás objetos de clase vector
, que se parecen a los arreglos, y necesitarás saber cómo usar el método size()
de los objetos de clase vector
. También debes familiarizarte con la biblioteca de la clase Packet
que se define en este proyecto. La biblioteca Packet.h
contiene los prototipos de los “setters” y “getters” necesarios para completar la información de un paquete de “NetFlow”.
La aplicación que completarás hoy le permite al usuario subir un archivo que contenga expedientes de “NetFlow” utilizando el botón “Open NetFlow File”, guarda los expedientes en un vector de paquetes, y los despliega en la tabla de contenido del interface de la aplicación como se muestra en la Figura 2.
Figura 2. Interface de la aplicación Network Analyzer con los paquetes de flujo de datos en una red.
El archivo que utilizarás para los ejercicios, network_sample.dat
contiene expedientes de paquetes de “NetFlow” con el siguiente formato:
Source_Address Destination_Address Source_Port Destination_Port Octects Packets
136.145.181.130 136.145.181.227 5 33 764 16
136.145.181.101 136.145.181.213 37 40 48 4
136.145.181.151 136.145.181.60 45 21 316 9
136.145.181.165 136.145.181.19 8 39 795 24
136.145.181.53 136.145.181.174 34 21 79 22
136.145.181.40 136.145.181.140 58 22 186 5
136.145.181.33 136.145.181.209 76 25 614 13
136.145.181.175 136.145.181.38 30 39 100 8
136.145.181.126 136.145.181.99 57 33 965 14
Packet
Carga a QtCreator el proyecto NetworkAnalyzer
haciendo doble “click” en el archivo NetworkAnalyzer.pro
en el directorio Documents/eip/Sorting-NetworkAnalyzer
de tu computadora. También puedes ir a http://bitbucket.org/eip-uprrp/sorting-networkanalyzer
para descargar la carpeta Sorting-NetworkAnalyzer
a tu computadora.
Abre el archivo packet.cpp
. Estudia los atributos y métodos de la clase Packet
.
Los datos que maneja la aplicación NetworkAnalyzer están almacenados en un vector de objetos de clase Packet
. El vector es una clase provista en el “Standard Template Library” de C++ que sirve para almacenar datos u objetos del mismo tipo. Al igual que los arreglos, los vectores asignan un índice (comenzando con el índice 0) a cada elemento que almacenan. El elemento i-ésimo de un vector V
se puede acceder usando V[i]
. La diferencia principal entre vectores y arreglos es que el tamaño de los vectores puede cambiar, no hay que definir un tamaño fijo de antemano como sucede con los arreglos.
Un método met
del objeto en la posición i
en el vector puede accederse escribiendo V[i].met()
. El contenido de todos los atributos de un objeto puede asignarse a otro objeto de la misma clase “a la vez”. Por ejemplo, puedes asignar el contenido de todos los atributos del objeto en la entrada k
del vector V
a los atributos correspondientes del objeto en la entrada i
del vector V
escribiendo V[i]=V[k]
.
Abre el archivo Filter.cpp
. En este ejercicio completarás las siguientes funciones que están contenidas en este archivo:
FilterBySrcAddr
FilterByDstAddr
FilterBySrcPort
FilterByDstPort
Cada una de estas funciones recibe un vector de objetos de clase Packet
y una clave de búsqueda. Cada función (nota sus nombres) está relacionada a un atributo de la clase Packet
y deberá “filtrar” los paquetes en el vector que correspondan a la clave. Para filtrar estos paquetes usarás una modificación del algoritmo de búsqueda lineal que consiste en hacer una búsqueda secuencial para encontrar todas las ocurrencias de un dato. En cada función, el algoritmo debe buscar en cada paquete del vector y desactivar los paquetes en los que el contenido del miembro de interés no es igual al de la clave de búsqueda. Para desactivar el paquete usa el método disable()
de la clase Packet
. El filtrado consiste en mantener solo los paquetes que corresponden a la clave.
Por ejemplo, si estás filtrando por Source Address
y la clave de búsqueda es 136.145.181.130, la función FilterBySrcAddr
mantendrá todos los paquetes del vector cuyo Source Address
es 136.145.181.130 y desactivará todos los otros.
La siguiente figura es una foto del interface de la aplicación luego de filtrar los datos por Source Address
con la clave 136.145.181.130.
Figura 3. Interface de la aplicación Network Analyzer con los paquetes de flujo de datos en una red filtrados por Source Address
con clave 136.145.181.130.
Abre el archivo Sort.cpp
. En este ejercicio completarás las siguientes funciones que están contenidas en este archivo:
SortBySrcAddr
SortByDstAddr
SortBySrcPort
SortByDstPort
Cada una de esas funciones recibe un vector de clase Packet
. Cada función (nota sus nombres) está relacionada a un atributo de la clase Packet
y deberá “ordenar” los paquetes del vector de acuerdo al atributo de interés.
La siguiente figura es una foto del interface de la aplicación luego de ordenar los datos por Source Address
.
Figura 4. Interface de la aplicación Network Analyzer con los paquetes de flujo de datos en una red ordenados por Source Address
.
Completa la función SortBySrcAddr
implementando el algoritmo de burbuja (Bubble Sort), ordenando los paquetes por el Source address
.
Completa la función SortByDstAddr
implementando el algoritmo de selección (Selection Sort), ordenando los paquetes por el Destination address
.
Completa la función SortBySrcPort
implementando el algoritmo de selección (Selection Sort), ordenando los paquetes por el Source port
.
Completa la función SortByDstPort
implementando el algoritmo de burbuja (Bubble Sort), ordenando los paquetes por el Destination port
.
Utiliza “Entrega 1” en Moodle para entregar el archivo Filter.cpp
que modificaste en el Ejercicio 1. Recuerda utilizar buenas prácticas de programación, incluir el nombre de los programadores y documentar tu programa.
Utiliza “Entrega 2” en Moodle para entregar el archivo Sort.cpp
que modificaste en el Ejercicio 2. Recuerda utilizar buenas prácticas de programación, incluir el nombre de los programadores y documentar tu programa.
[1] http://www.nextgigsystems.com/aggregation_switches/gigamon_filter_packets.html
[2] http://metaanalytics.org/web-analytics/social-network-analysis/
[3] http://www.java2novice.com/java-sorting-algorithms/quick-sort/
[4] http://intranet.deei.fct.ualg.pt/IC/t22.html
When working with arrays, two common tasks are searching for data and sorting the data using a certain order, ascending or descending, alphabetically or numerically. To efficiently carry out these tasks, searching and sorting algorithms are used. One simple searching algorithm is linear search. Two well known sorting algorithms are the Selection Sort and the Bubble Sort. In this laboratory experience you will complete an application to monitor network flow to practice the implementation of algorithms for searching and sorting.
Implement a modification of the linear search algorithm.
Practice sorting arrays with the Selection Sort and the Bubble Sort.
Practice the use of objects, decision and repetition structures.
Learn some methods of the C++ vector
class.
Before coming to the laboratory session you should have:
Reviewed the algorithms for linear search, Selection Sort and Bubble Sort.
Studied the method size()
of the C++ vector
class.
Familiarize yourself with the methods of the Packet
class included in the packet.h
file of the NetworkAnalyzer
project.
Studied the concepts and instructions for the laboratory session.
Taken the Pre-Lab quiz available through the course’s Moodle portal.
Computers communicate with each other through the Internet Protocol (IP). When a computer sends information to another computer it is sent via Internet Packets that contain the Internet address of the sender computer (source address), and the Internet address of the receiving computer (destination address). Internet addresses are used to guide information from one computer to another, but, once a packet arrives to its destination, who is supposed to receive the information? Which application should receive the information?
The internet packets should also specify the application that sends the information and the application that should receive it. We can think that the Internet address are the mailing address of a house, and the applications that send and receive the information are the people that send and receive the correspondence. To send a letter by mail, one must specify to whom the letter is being sent. This corresponds to specify the application that receives the information. To identify the source application and the destination application, the Internet protocol uses what is known as port numbers. Looking at the information on the packet, the addresses and ports of the source and destination can be identified.
For instance, when your computer in the laboratory is contacting the Moodle server, the packets that carry the information from your computer to the Moodle server contain the source address of the laboratory computer and the destination address of the Moodle server. The source port is the one of your web browser and the destination port is the web server that serves Moodle.
Internet addresses are stored on 4 bytes (32 bits), normally presented to users as strings of 4 decimal values. Each decimal value between 0 and 255 is the decimal representation of one of the 4 bytes: “(0-255).(0-255).(0-255).(0-255)”. Examples of IP addresses are: 10.0.1.10
, 192.168.10.11
, 136.145.54.10
.
Port numbers are stored on 2 bytes (16 bits). Therefore, port numbers range from 0 to 65535. Some port numbers assigned to known service applications are: 22 for ssh
, 23 for telnet
, 25 smtp
, 80 for http
.
The application that you will see today can be used to monitor what is known as NetFlows. One NetFlow is composed of the aggregation of the packets of an unidirectional communication between the the applications of two computers. For instance, a NetFlow can be composed of the packets used to send the information from you browser to the http
application of the web server running Moodle.
Figure 1 shows the interface for the Network Analyzer application.
Figure 1. Interface to work with the Network Analyzer application.
Each row in the table in Figure 1 is a NetFlow composed of the source and destination address, the source and destination port, the number of packets and the number of octets (8 bits) in one unidirectional communication between the source and destination computer, from the source port to the destination port.
The application that you will complete gives the user the ability to analyze the status of the network. Among others it allows to:
For this laboratory experience you will use objects of class vector
, which are similar to arrays, and you will need to know how to use the size()
method of the vector
class objects. You should also familiarize yourself with the Packet
class defined in this project. The Packet.h
library contains the setters and getters necessary to fill the information of a NetFlow packet.
The application you will complete today allows the user to open a file that contains the NetFlow records using the “Open NetFlow File” button, stores the records in a vector of packets, and displays them in the table of the interface as shown in Figure 2.
Figure 2. Interface or the Network Analyzer application with the network flow data packets.
The file you will use for the exercises, network_sample.dat
, contains the NetFlow packet records with the following format:
Source_Address Destination_Address Source_Port Destination_Port Octects Packets
136.145.181.130 136.145.181.227 5 33 764 16
136.145.181.101 136.145.181.213 37 40 48 4
136.145.181.151 136.145.181.60 45 21 316 9
136.145.181.165 136.145.181.19 8 39 795 24
136.145.181.53 136.145.181.174 34 21 79 22
136.145.181.40 136.145.181.140 58 22 186 5
136.145.181.33 136.145.181.209 76 25 614 13
136.145.181.175 136.145.181.38 30 39 100 8
136.145.181.126 136.145.181.99 57 33 965 14
Packet
class.Load the Qt project called NetworkAnalyzer
by double-clicking on the NetworkAnalyzer.pro
file in the Documents/eip/Sorting-NetworkAnalyzer
folder of your computer. You may also go to http://bitbucket.org/eip-uprrp/sorting-networkanalyzer
to download the Sorting-NetworkAnalyzer
folder to your computer.
Open the packet.cpp
file. Study the attributes and methods of the Packet
class.
The data that the NetworkAnalyzer application manages are stored in a vector of Packet
objects. The vector is a class provided in the C++ Standard Template Library that stores data and objects of the same type. As with arrays, vectors assign an index (starting with the index 0) to each element they store. The i-th element of a vector V
can be accessed using V[i]
. The main difference between vectors and arrays is that the size of vectors can change, a size doesn’t have to be defined beforehand, contrary to arrays.
A method met
of the object in position i
in the vector can be accessed writing V[i].met()
. The contents of all of the attributes of an object can be assigned to another object of the same class “at once”. For example, you can assign the contents of all of the attributes of the object in the position k
of the vector V
the corresponding attributes of the object in the position i
of the vector V
by writing V[i]=V[k]
.
Filter.cpp
. In this exercise you will complete the following functions that can be found in the file:FilterBySrcAddr
FilterByDstAddr
FilterBySrcPort
FilterByDstPort
Each one of the functions receives a vector of objects of class Packet
and a search key. Each function (notice their names) is related to an attribute of the Packet
class and should filter the packets in the vector that correspond to the key. To filter these packets you will use a modified version of the linear search algorithm that consists of a sequential search to find each occurrence of a particular record of data. In each of the functions, the algorithm must search through all the packets in the vector and disable the packets that are not equal to the search key. To deactivate the packet use the disable()
method of the Packet
class. The filter consists of keeping only the packets that correspond to the key.
For instance, if you are filtering by Source Address
and the search key is 136.145.181.130, the FilterBySrcAddr
function will keep only the packets in the vector whose Source Address
is 136.145.181.130 and deactivate the others.
The following figure is an screenshot of the application interface after filtering the data by Source Address
with search key 136.145.181.130.
Figure 3. Interface of the Network Analyzer application with the network flow packets filtered by Source Address
with the key 136.145.181.130.
Sort.cpp
file. In this exercise you will complete the following functions that can be found in the file:SortBySrcAddr
SortByDstAddr
SortBySrcPort
SortByDstPort
Each one of these functions receives a vector of Packet
objects. Each function (notice their names) is related to an attribute of the Packet
class and should order the packets in the vector according to the attribute of interest.
The following figure is a screenshot of the application interface after sorting the data by Source Address
.
Figure 4. Interface of the Network Analyzer application with the network flow packets ordered by Source Address
.
Complete the SortBySrcAddr
function implementing the Bubble Sort algorithm, sorting the packets by source address
.
Complete the SortByDstAddr
function implementing the Selection Sort algorithm, sorting the packets by destination addres
.
Complete the SortBySrcPort
function using the Selection Sort algorithm, sorting the packets by source port
.
Complete the SortByDstPort
function using the Bubble Sort algorithm, sorting the packets by destination port
.
Use “Deliverables 1” in Moodle to upload the Filter.cpp
file that you modified in Exercise 1. Remember to use good programming techniques, include the names of the programmers involved, and to document your program.
Use “Deliverables 2” in Moodle to upload the Sort.cpp
file that you modified in Exercise 2. Remember to use good programming techniques, include the names of the programmers involved, and to document your program.
[1] http://www.nextgigsystems.com/aggregation_switches/gigamon_filter_packets.html
[2] http://metaanalytics.org/web-analytics/social-network-analysis/
[3] http://www.java2novice.com/java-sorting-algorithms/quick-sort/