Browse Source

Fixes to the README. Mainly translate the most recent README-en to english

root 8 years ago
parent
commit
fc8f89d3a0
4 changed files with 520 additions and 94 deletions
  1. 133
    0
      README-en-bk
  2. 100
    37
      README-en.md
  3. 137
    57
      README-es.md
  4. 150
    0
      README-es.md-bk

+ 133
- 0
README-en-bk View File

@@ -0,0 +1,133 @@
1
+# Classes - Simple Sniffer
2
+
3
+##Objectives
4
+
5
+1. Practice Data Structures, Classes and Inheritance
6
+
7
+## Pre-Lab:
8
+
9
+Before you get to the laboratory you should have:
10
+
11
+1. Reviewed C++ classes and structures
12
+2. Studied the concepts and instructions for this laboratory session.
13
+3. Taken the Pre-Lab quiz in Moodle
14
+
15
+## Simple Sniffer
16
+
17
+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), the source port of the application that is sending the message, the Internet address of the receiving computer(destination address), and the port of the application that will receive the message.
18
+
19
+We can compare the Internet address to the address of a house, and the applications to the members of the house. When sending a letter from one house to another, the address on the letter identifies the destination house, and the name on the letter identifies the house member to who it is sent.
20
+
21
+For instance when your lab computer is contacting the department's web server, the packets that carry the information from your computer to the web server contains the source address of the lab computer and the destination address of the web server;  and the source port of your web browser and the destination port of the web server.
22
+
23
+Internet addresses are represented on 4 bytes (32 bits) normally presented to users as strings of 4 decimal values. Each decimal value 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, and so on.
24
+
25
+Port numbers are composed of 2 bytes or 16 bits.  Therefore port numbers range from 0-65535. There are ports numbers assigned to known application services such as number 22 for ssh, 23 for telnet, 25 smtp, 80 for http, and so on.
26
+
27
+To complicate things a little bit, each computer network card has an unique identifier that is used for the communication between you computer and the network device that routes the network traffic from the Internet and local network to your computer and vice-versa (Ethernet protocol).  This unique identifier is known as the Hardware address (a.k.a Multiple Access Controll (MAC) addres), is represented on 6 bytes (48 bits), and is presented to users as strings of 6 hexadecimal values. Each hex value is the hex representation of the 6 bytes: "(00-ff):(00-ff):(00-ff):(00-ff):(00-ff):(00-ff)".  Examples of MAC addresses are: e0:f8:47:01:e9:90, 70:ad:60:ff:fe:dd:79:d8 , and so on.
28
+
29
+A packet sniffer (a.k.a packet analyzer, protocol analyzer, or network analyzer) is a computer program that can intercept and log traffic passing over a digital network, or network device.  As data flow across the network, the sniffer captures each packet and, if needed decodes the packet's raw data[1].
30
+
31
+
32
+The packets captured by this program follow the following packet structure:
33
+
34
+1. first an Ethernet header which contains the source and destination MAC addresses
35
+2. second a IP header that contains the source and destination IP addresses
36
+3. third a header that contains the source and destination port numbers.
37
+
38
+In this application we create a simple packet sniffer that captures all the IP packets that flow across your lab computer, and for each packet, decodes the IP addresses, the port numbers, and some additional information of the packets.  Additionaly it detects the unencrypted request of images in the web, and displays the images in the GUI.
39
+
40
+See the following snapshot of the application:
41
+![](images/ss.png)
42
+
43
+Each row in the table is the information of each captured packet, the text box under the table presents a ASCII summary of a selected packet from the table, and the list in the right presents the images that have been requested and are seen in you network card.  
44
+
45
+The application that you are about to complete gives the user the ability to analyze the network traffic and monitor the images that are being watched in your network.  
46
+
47
+## Laboratory session:
48
+
49
+To create a packet sniffer you can use the *pcap* library that provides an interface to access the data passing across your network card.  This library contains a function that returns a raw stream of bytes of each packet captured.  It is the task of the sniffer programmer to decode the raw stream into human readable information.  Fortunately this is not your task, but you can learn how to do it, if you want, by reading the source code of this laboratory.  Your task is to follow the exercises below so you provide the packet sniffer with the needed objects (Classes) to process the packets.
50
+
51
+## Exercise 1: Familiriaze your self with the application
52
+
53
+####Instructions
54
+
55
+1. To load this project you need to run qt creator with root privileges.
56
+        ```sudo qtcreator Documents/eip/simplesniffer/SimpleSniffer.pro```
57
+
58
+2. The project `SimpleSniffer` is in the directory `Documents/eip/simplesniffer` of your computer. You can also go to `http://bitbucket.org/eip-uprrp/classes-simplesniffer` to download the folder `classes-simplesniffer` to your computer.
59
+
60
+3. Configure the project.  The project consists of several files.  In this laboratory you will be working with the files `ethernet_hdr.h`, `ethernet_packet.h`, `ethernet_packet.cpp`, `ip_packet.h` and `ip_packet.cpp`
61
+
62
+
63
+## Exercise 2: Complete the class ethernet_packet
64
+
65
+Read the file `ethernet_hdr.h`, it contains the definition of the data structure that represents an Ethernet header.  It is also shown below:
66
+
67
+```
68
+#define ETHER_ADDR_LEN 6
69
+
70
+struct sniff_ethernet {
71
+        u_char  ether_dhost[ETHER_ADDR_LEN];    /* destination host address */
72
+        u_char  ether_shost[ETHER_ADDR_LEN];    /* source host address */
73
+        u_short ether_type;                     /* IP? ARP? RARP? etc */
74
+};
75
+```
76
+
77
+The Ethernet header above is used to decode the ethernet part of the raw data in each packet.  It is composed of the source MAC address (ether_shost, 6 bytes), the destiantion MAC address (ether_dhost, 6 bytes), and the type of Ethernet packet (ether_type, 2 bytes) which is used to determine if the packet is an IP packet.
78
+
79
+As you can see, it is not a good idea to show this information format to a regular user.  Your first task is to define the functions of the C++ class that defines the functions to translate the MAC address information into human readable strings.
80
+
81
+The class header is in file `ethernet_packet.h` and is also shown below:
82
+
83
+```
84
+class ethernet_packet
85
+{
86
+
87
+    sniff_ethernet ethernet ;
88
+    // Returns a 6 bytes MAC address in string representation.
89
+    string mac2string(u_char []) ;
90
+
91
+public:
92
+    ethernet_packet();  // Default constructor
93
+
94
+    // Set the ethernet variable member ether_dhost to the values
95
+    // received in the array
96
+    void setEtherDHost(u_char []) ;
97
+    // Same as above but to the ether_shost
98
+    void setEtherSHost(u_char []) ;
99
+
100
+    // Set the ethernet type to the value received.
101
+    void setEtherType(u_short) ;
102
+
103
+    // returns the string representation of the ethernet addresses
104
+    string getEtherDHost() ;
105
+    string getEtherSHost() ;
106
+
107
+    // Return the ethernet type
108
+    u_short getEtherType() ;
109
+
110
+};
111
+```
112
+
113
+Define the functions in file `ethetnet_packet.cpp`
114
+
115
+## Exercise 3: Construct the header of class ip_packet  
116
+
117
+For Exercise 3 see the definitions of the functions of the class ip_packet found in file `ip_packet.cpp`
118
+
119
+Your task is to define the class header following the functions inside the file.  The member variables are:
120
+* two `string`s to store the source and destination IP addresses
121
+* a one byte (`char`) variable to store the IP protocol
122
+* two `unsigned short` variables to store the source and destination port
123
+* one `string` to store the packet payload.
124
+
125
+This class header that you are defining inherits from the class that you defined in Exercise 2.
126
+
127
+### Deliverables
128
+
129
+Use "Deliverables" in Moodle to upload the files `ethernet_packet.cpp` y `ip_packet.h` that you defined.
130
+
131
+### References
132
+
133
+[1]http://en.wikipedia.org/wiki/Packet_analyzer

+ 100
- 37
README-en.md View File

@@ -1,68 +1,107 @@
1 1
 # Classes - Simple Sniffer
2 2
 
3
+![header.png](images/header.png)  
4
+
5
+*Object Oriented Programming* (OOP) is a programming paradigm that promotes the design of programs by having different objects interacting together to solve a problem. C++ is one of the programming languages that promotes object oriented programming, allowing programmers to create their own classes from scratch or derive them from other existing classes. Other languages that promote OOP are Java, Python, Javascript and PHP.
6
+
7
+In OOP, each object encapsulates within itself certain properties about the entity being modeled (for example, an object that models a *point* encapsulates the coordinates *x* and *y* of the point being represented). Furthermore, each object allows certain actions to be carried out on itself with the  *methods* that the object contains. For example, an object of class *point* could carry out the action of changing the value of the *x* coordinate.
8
+
9
+When an object class we need to use in our program has not been predefined in a library, we need to declare and implement our own class. To do this, we define *classes* that contain data with certain *properties* or *attributes* and actions that we want to carry out with this data through the use of *methods* or *member functions*. This way, we can organize the information and processes in *objects* that have the properties and methods of a class. In today's laboratory experience you will practice defining a class and implementing some of its methods by completing a simple network sniffer. The sniffer captures all the internet protocol (IP) packets that flow through your computer in the lab, and some other packet information.
10
+
3 11
 ##Objectives
4 12
 
5
-1. Practice Data Structures, Classes and Inheritance
13
+1. Practice the implementation and declaration of classes in C++.
14
+2. Implement methods in a class.
6 15
 
7 16
 ## Pre-Lab:
8 17
 
9 18
 Before you get to the laboratory you should have:
10 19
 
11
-1. Reviewed C++ classes and structures
12
-2. Studied the concepts and instructions for this laboratory session.
13
-3. Taken the Pre-Lab quiz in Moodle
20
+    1. Reviewed the implementation and declaration of C++ classes
21
+    2. Studied the concepts and instructions for this laboratory session.
22
+    3. Taken the Pre-Lab quiz in Moodle
14 23
 
15
-## Simple Sniffer
24
+## Communication among computers
16 25
 
17
-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), the source port of the application that is sending the message, the Internet address of the receiving computer(destination address), and the port of the application that will receive the message.
26
+Computers communicate with each other through the Internet Protocol (IP).  When a computer sends information (or message) to another computeri, the information is sent via *Internet packets* that contain the *source address*, which is the Internet address of the computer sending the information, and the *destination address*, which is the Internet address of the computer that receives the message.  The Internet addresses are used to guide the information from one computer to another, but, once the arrives to its destination, ?who is supposed to receive the information? ?Which application must receive the information?  
18 27
 
19
-We can compare the Internet address to the address of a house, and the applications to the members of the house. When sending a letter from one house to another, the address on the letter identifies the destination house, and the name on the letter identifies the house member to who it is sent.
28
+The Internet packets must also specify the application that is sending the information and the application that must receive it. We can think of the Internet addresses like home postal mail addresses, and that the applications that send and receive the information are the persons that send and receive postal letters.  To send a letter via postal mail, the recipient of the letter must be specified. This corresponds to the application that receives the information.  To identify the source and destination application, the Internet protocol uses what is known as *port numbers*. This way, looking the packet information, the source and destination addresses and ports can be identified.
20 29
 
21
-For instance when your lab computer is contacting the department's web server, the packets that carry the information from your computer to the web server contains the source address of the lab computer and the destination address of the web server;  and the source port of your web browser and the destination port of the web server.
30
+For instance when your lab computer communicates with the server for Moodle, the packets that carry the information from your computer to the web server contains the source address, which is the address of the lab computer, and the destination address which is the Moodle server.  The source port is the port of your web browser and the destination port is of the Moodle web server.
22 31
 
23
-Internet addresses are represented on 4 bytes (32 bits) normally presented to users as strings of 4 decimal values. Each decimal value 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, and so on.
32
+The Internet addresses are represented on 4 bytes (32 bits), and usually are presented to users as strings of 4 decimal values. Each decimal value is the decimal representation of one of the 4 bytes:  "(0-255).(0-255).(0-255).(0-255)". Some examples of IP addresses are: 10.0.1.10, 192.168.10.11, 136.145.54.10.
24 33
 
25 34
 Port numbers are composed of 2 bytes or 16 bits.  Therefore port numbers range from 0-65535. There are ports numbers assigned to known application services such as number 22 for ssh, 23 for telnet, 25 smtp, 80 for http, and so on.
26 35
 
27 36
 To complicate things a little bit, each computer network card has an unique identifier that is used for the communication between you computer and the network device that routes the network traffic from the Internet and local network to your computer and vice-versa (Ethernet protocol).  This unique identifier is known as the Hardware address (a.k.a Multiple Access Controll (MAC) addres), is represented on 6 bytes (48 bits), and is presented to users as strings of 6 hexadecimal values. Each hex value is the hex representation of the 6 bytes: "(00-ff):(00-ff):(00-ff):(00-ff):(00-ff):(00-ff)".  Examples of MAC addresses are: e0:f8:47:01:e9:90, 70:ad:60:ff:fe:dd:79:d8 , and so on.
28 37
 
29
-A packet sniffer (a.k.a packet analyzer, protocol analyzer, or network analyzer) is a computer program that can intercept and log traffic passing over a digital network, or network device.  As data flow across the network, the sniffer captures each packet and, if needed decodes the packet's raw data[1].
38
+---
30 39
 
40
+## Packet Sniffer
31 41
 
32
-The packets captured by this program follow the following packet structure:
42
+A packet sniffer (also known as packet analyzer, protocol analyzer, or network analyzer) is a computer program that can intercept and log traffic passing over a digital network, or network device.  As data flow across the network, the sniffer captures each packet and, if needed decodes the packet's raw data[1].
33 43
 
34
-1. first an Ethernet header which contains the source and destination MAC addresses
35
-2. second a IP header that contains the source and destination IP addresses
36
-3. third a header that contains the source and destination port numbers.
44
+Each packet captured by a sniffer has a structure similar to the ilustrated in Figure 1.
37 45
 
38
-In this application we create a simple packet sniffer that captures all the IP packets that flow across your lab computer, and for each packet, decodes the IP addresses, the port numbers, and some additional information of the packets.  Additionaly it detects the unencrypted request of images in the web, and displays the images in the GUI.
46
+---
39 47
 
40
-See the following snapshot of the application:
41
-![](images/ss.png)
48
+![figure1.png](images/figure1.png)
49
+
50
+
51
+**Figure 1.** Structure of each Ethernet packet captured by a *sniffer*.
52
+
53
+---
54
+
55
+Inside the structure shown in Figure 1 is found:
56
+
57
+1. **Destination MAC Address** and **Source Mac Address**: are the source and destination MAC addresses
58
+2. **Ether type**: is used to indicate the type of protocol used in the **payload**. One of the possible **payloads** is an IP packet.
59
+3. **Payload**: contains an IP packet (in reality it can contain other protocols, but for this laboratory experience we will asume that it contains only IP).
42 60
 
43
-Each row in the table is the information of each captured packet, the text box under the table presents a ASCII summary of a selected packet from the table, and the list in the right presents the images that have been requested and are seen in you network card.  
61
+Inside the payload, the IP packet contains various field, among them:
44 62
 
45
-The application that you are about to complete gives the user the ability to analyze the network traffic and monitor the images that are being watched in your network.  
63
+1. The **source and destination IP** addresses
64
+2. The **source and destination port** numbers
65
+3. The IP packet **payload**.  Inside this payload the data that wants to be communicated is contained.
66
+
67
+
68
+In this laboratory experience you will complete a simple packet sniffer that captures all the IP packets that flow through your laboratory computer, and some addtional information of the packets.  Additinally it detects the non encrypted requests of images in the web, and displays the images in a GUI.
69
+
70
+---
71
+---
46 72
 
47 73
 ## Laboratory session:
48 74
 
49
-To create a packet sniffer you can use the *pcap* library that provides an interface to access the data passing across your network card.  This library contains a function that returns a raw stream of bytes of each packet captured.  It is the task of the sniffer programmer to decode the raw stream into human readable information.  Fortunately this is not your task, but you can learn how to do it, if you want, by reading the source code of this laboratory.  Your task is to follow the exercises below so you provide the packet sniffer with the needed objects (Classes) to process the packets.
75
+The application that you will complete today allows the users to analyze network traffic and to monitor the images that are being tranfered through the net.
50 76
 
51
-## Exercise 1: Familiriaze your self with the application
77
+---
52 78
 
53
-####Instructions
79
+![](images/ss.png)
54 80
 
55
-1. To load this project you need to run qt creator with root privileges.
56
-        ```sudo qtcreator Documents/eip/simplesniffer/SimpleSniffer.pro```
81
+**Figure 2.** The user interface of the *Simple Packet Sniffer* application.
82
+
83
+--- 
57 84
 
58
-2. The project `SimpleSniffer` is in the directory `Documents/eip/simplesniffer` of your computer. You can also go to `http://bitbucket.org/eip-uprrp/classes-simplesniffer` to download the folder `classes-simplesniffer` to your computer.
59 85
 
60
-3. Configure the project.  The project consists of several files.  In this laboratory you will be working with the files `ethernet_hdr.h`, `ethernet_packet.h`, `ethernet_packet.cpp`, `ip_packet.h` and `ip_packet.cpp`
86
+Figure 2 shows an image of the application interface. Each row in the table is the information of each captured packet. The text box under the table presents a ASCII summary of a selected packet from the table. The list in the right presents the images that have been captured by the sniffer.  
87
+
88
+To create a packet sniffer you can use the *pcap* library that provides an interface to access the data passing across your network card.  This library contains a function that returns a raw stream of bytes of each packet captured. 
89
+
90
+The task of the sniffer programmer to decode the raw stream into human readable information.  Fortunately this is not your task, but you can learn how to do it, if you want, by reading the source code of this laboratory.  Your task is to follow the exercises below so you provide the packet sniffer with the needed objects (Classes) to process the packets.
91
+
92
+## Exercise 1: Familiriaze your self with the application
93
+
94
+Instructions
95
+
96
+    1. To load this project you need to run qt creator with root privileges.
97
+        ```sudo qtcreator Documents/eip/simplesniffer/SimpleSniffer.pro```
98
+    2.The project `SimpleSniffer` is in the directory `Documents/eip/simplesniffer` of your computer. You can also go to `http://bitbucket.org/eip-uprrp/classes-simplesniffer` to download the folder `classes-simplesniffer` to your computer.
99
+    3. Configure the project.  The project consists of several files.  In this laboratory you will be working with the files `ethernet_hdr.h`, `ethernet_packet.h`, `ethernet_packet.cpp`, `ip_packet.h` and `ip_packet.cpp`
61 100
 
62 101
 
63 102
 ## Exercise 2: Complete the class ethernet_packet
64 103
 
65
-Read the file `ethernet_hdr.h`, it contains the definition of the data structure that represents an Ethernet header.  It is also shown below:
104
+Study the file `ethernet_hdr.h`. This file contains the definition of the data structure that represents an Ethernet header.:
66 105
 
67 106
 ```
68 107
 #define ETHER_ADDR_LEN 6
@@ -76,9 +115,9 @@ struct sniff_ethernet {
76 115
 
77 116
 The Ethernet header above is used to decode the ethernet part of the raw data in each packet.  It is composed of the source MAC address (ether_shost, 6 bytes), the destiantion MAC address (ether_dhost, 6 bytes), and the type of Ethernet packet (ether_type, 2 bytes) which is used to determine if the packet is an IP packet.
78 117
 
79
-As you can see, it is not a good idea to show this information format to a regular user.  Your first task is to define the functions of the C++ class that defines the functions to translate the MAC address information into human readable strings.
118
+As you know, it is not a good idea to show this information format to a regular user.  Your first task is to define the functions of the C++ class that defines the functions to translate the MAC address information into human readable strings.
80 119
 
81
-The class header is in file `ethernet_packet.h` and is also shown below:
120
+The following code is the definition of the class `ethernet_packet`, that can be found in file `ethernet_packet.h`:
82 121
 
83 122
 ```
84 123
 class ethernet_packet
@@ -110,19 +149,43 @@ public:
110 149
 };
111 150
 ```
112 151
 
113
-Define the functions in file `ethetnet_packet.cpp`
152
+Note that each object of the class `ethernet_packet` only has one attribute:
153
+
154
+	* one structure of type `sniff_ethernet` named `ethernet`
155
+
156
+The rest are methods that act as interface to the attribute:
157
+
158
+* `void setEtherDHost(u_char [])`: is a *setter* to the field `ether_dhost` of the attribute `ethernet`
159
+
160
+
161
+* `void setEtherSHost(u_char [])`: is a *setter* to the field `ether_shost` of the attribute `ethernet`
162
+
163
+* `void setEtherType(u_short)`:  is a *setter* for the field `ether_type` of the attribute `ethernet`
164
+
165
+* `getEtherDHost()` and `getEtherSHost()` are *getters* that return the values of `ether_dhost` and `ether_shost` in a human readable format, i.e. 6 pairs of hexadecimal digits (for example, `e0:f8:47:01:e9:90`).
166
+
167
+* `getEtherType()` is a *getter*  that returns the value of `ether_type` as *unsigned char*.
168
+
169
+* the private method `string mac2string(u_char [])` receives an array of six *unsigned characters* and returns the corresponding string to its hexadecimal representation. For example, if it receives `{ 0x8A, 0x11, 0xAB, 0xFF, 0x12, 0x34}` it must return the string `"8A:11:AB:FF:12:34"`.
170
+
171
+Your task in this exercise is to implement the seven functions listed above in the file `ethetnet_packet.cpp`.  The headers of some of the functions are provided in the file.
114 172
 
115 173
 ## Exercise 3: Construct the header of class ip_packet  
116 174
 
117
-For Exercise 3 see the definitions of the functions of the class ip_packet found in file `ip_packet.cpp`
175
+Study the definitions of the functions of the class `ip_packet` found in file `ip_packet.cpp`
176
+
177
+Your task is to create the *declaration* of the class `ip_packet` in the file `ip_packet.cpp`. The attributes of the class `ip_packet` must be:
178
+
179
+* two objects of the class `string`s to store the source and destination IP addresses
180
+* one variable of one byte (`char`) variable to store the IP protocol
181
+* two variables `unsigned short` to store the source and destination port
182
+* one object of the class `string` to store the packet payload.
183
+
184
+In the declaration of the class `ip_packet` you must especify that it is a **derived class** (inherits) of the class `ethernet_packet`.
118 185
 
119
-Your task is to define the class header following the functions inside the file.  The member variables are:
120
-* two `string`s to store the source and destination IP addresses
121
-* a one byte (`char`) variable to store the IP protocol
122
-* two `unsigned short` variables to store the source and destination port
123
-* one `string` to store the packet payload.
186
+---
124 187
 
125
-This class header that you are defining inherits from the class that you defined in Exercise 2.
188
+---
126 189
 
127 190
 ### Deliverables
128 191
 

+ 137
- 57
README-es.md View File

@@ -1,80 +1,134 @@
1
-# Clases - Sniffer Simple
1
+# Clases - Analizador de redes simple
2 2
 
3
-##Objetivos
3
+![header.png](images/header.png)  
4
+
5
+
6
+La *programación orientada a objetos* (object oriented programming, OOP) es un paradigma de programación que promueve el diseño de programas en el que distintos objetos interactúan entre sí para resolver un problema.   C++ es uno de los lenguajes de programación que promueve la programación orientada a objetos, permitiendo que los programadores creen sus propias clases desde cero o derivadas de otras clases existentes. Algunos otros lenguajes que promueven OOP son Java, Python, javascript y PHP.   
7
+
8
+En OOP, cada objeto encapsula dentro de él ciertas propiedades sobre el ente que está modelando (por ejemplo, un objeto que modela un *punto* encapsula dentro de sí las coordenadas *x* y *y* del punto que representa). Además, cada objeto permite realizar ciertas acciones sobre sí, i.e. contiene sus *métodos*. Por ejemplo, un objeto de clase *punto* puede realizar la acción de cambiar el valor de su coordenada *x*.
9
+
10
+Cuando la clase de objetos que necesitamos utilizar en nuestro programa no ha sido predefinida en el alguna librería, necesitamos declarar e implementar nuestra propia clase. Para esto definimos *clases* que contengan datos con ciertas *propiedades* o *atributos* y acciones que queremos hacer con esos datos por medio de *métodos* o *funciones miembro*. De esta manera, podremos organizar la información y procesos en *objetos* que tienen las propiedades y métodos de una clase. En la experiencia de laboratorio de hoy practicarás el definir una clase e implementar algunos de sus métodos completando analizador de redes (*sniffer*) simple. El sniffer captura todos los paquetes de protocolo de internet (IP) que fluyen a través de tu computadora en el laboratorio, y alguna información adicional de los paquetes.
11
+
12
+## Objetivos:
4 13
 
5 14
 1. Practicar la declaración e implementación de clases en C++.
6 15
 
16
+2. Implementar métodos de una clase.
17
+
7 18
 
8 19
 ## Pre-Lab:
9 20
 
10
-Antes de llegar al laboratorio debes:
21
+Antes de llegar al laboratorio debes haber:
11 22
 
12
-1. Haber repasado la declaración e implementación de clases en C++.
13
-2. Haber estudiado los conceptos e instrucciones para la sesión de laboratorio.
14
-3. Haber tomado el quiz Pre-Lab que se encuentra en Moodle.
15 23
 
16
-## Sniffer Simple
24
+1. Repasado la declaración e implementación de clases en C++.
17 25
 
18
-Las computadoras se comunican con otras a través del protocolo de Internet (IP).  Cuando una computadora envia información a otra computadora es via paquetes de Internet que contienen la dirección de Internet de la computadora que envia (computadora fuente), el puerto fuente de la aplicación que está enviando el mensaje, la dirección de Internet de la computadora que recibe (computadora destino), y el puerto de la aplicación que va a recibir el mensaje.
26
+2. Estudiado los conceptos e instrucciones para la sesión de laboratorio.
19 27
 
20
-Podemos comparar las direcciones de Internet a las direcciones de una casa, y las aplicaciones a los miembros de una casa.  Cuando se envia una carta de una casa a otra, la dirección en la carta identifica la casa destino, y el nombre en la carta identifica al miembro de la casa al que se le envía.
28
+3. Tomado el quiz Pre-Lab que se encuentra en Moodle.
21 29
 
22
-Por ejemplo cuando tu computadora de laboratorio esta contactactando al servidor de web del departamento, los paquetes que cargan la informacion de tu computadora al servidor de web contienen la dirección fuente de la computadora del laboratorio y la dirección destino del servidor de web; y el puerto fuente del tu buscador de web (browser) y el puerto destino del servidor de web.
23 30
 
24
-Las direcciones de Internet son representados usando 4 bytes (32 bits), y comunmente son presentadas a los usuarios como cadenas de caracteres de 4 valores decimales.  Cada valor decimal es la representacion decimal de uno de los 4 bytes: "(0-255).(0-255).(0-255).(0-255)". Por ejemplo, las siguientes son tres direcciones IP  10.0.1.10, 192.168.10.11, 136.145.54.10.
31
+---
25 32
 
26
-Los números de los puertos son enteros sin signo en el rango de [0-65535]. Se representan usando 2 bytes (16 bits). Hay números de puertos que son asignados a servicios de aplicaciones comúnes tales como el número 22 para ssh, 23 para telnet, 25 smtp, y el 80 para http.
33
+---
27 34
 
28
-Para complicar las cosas un poco, cada tarjeta de red de computadoras tiene un identificador único que es usado para la comunicación entre tu computadora y el dispositivo de la red que enruta el tráfico de red de Internet y la red local a tu computadora y vice-versa (protocolo Ethernet). Este identificador único es conocido como la dirección de Hardware (también conocido como dirección MAC), es representado usando 6 bytes (48 bits), y es presentado a los usarios como una cadena de caracteres de 6 pares de dígitos hexadecimales (cada par de dígitos hexadecimal corresponde a 1 byte). Por ejemplo, los siguientes son direcciones MAC:  `e0:f8:47:01:e9:90` y  `70:ad:60:ff:fe:dd:79:d8`.
29 35
 
30
-Un sniffer de paquetes (también conocido como analizador de paquetes, analizador de protocolos, o analizador de red) es un programa de computadora que puede interceptar y registrar tráfico pasando a través de una red digital, o dispositivo de red.  Mientras los datos fluyen a través de la red, el sniffer captura cada paquet, y si es necesario decodifica los datos crudos del paquete[1].
36
+## Comunicación entre computadoras
31 37
 
32
-Cada paquete capturado por este programa tiene la siguiente estructura:
38
+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?
33 39
 
34
-1. un encabezado de Ethernet que contiene las direcciones MAC fuente y destino
35
-2. un encabezado de IP que contiene las direcciones IP fuente y destino
36
-3. un encabezado que contiene los números de puerto fuente y destino
40
+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.
37 41
 
38
-En esta experiencia de laboratorio completaremos un sniffer de paquetes sencillo que captura todos los paquetes de IP que fluyen a través de tu computadora de laboratorio, y alguna información adicional de los paquetes.  Adicionalmente detecta las solicitudes no encriptadas de imagenes en la web, y despliega las imágenes en el GUI.
42
+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.
39 43
 
44
+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:
45
+ "(0-255).(0-255).(0-255).(0-255)". Algunos ejemplos de direcciones de IP son:
46
+ `10.0.1.10`, `192.168.10.11`, `136.145.54.10`.
40 47
 
48
+Para complicar las cosas un poco, cada tarjeta de red de computadoras tiene un identificador único que es usado para la comunicación entre tu computadora y el dispositivo de la red que enruta el tráfico de red de Internet y la red local a tu computadora y vice-versa (*protocolo Ethernet*). Este identificador único es conocido como la dirección de Hardware (también conocido como *dirección MAC*), es representado usando 6 bytes (48 bits), y es presentado a los usuarios como una cadena de caracteres de 6 pares de dígitos hexadecimales (cada par de dígitos hexadecimal corresponde a 1 byte). Por ejemplo, las siguientes son direcciones MAC:  `e0:f8:47:01:e9:90` y  `70:ad:60:ff:fe:dd`.
41 49
 
50
+---
42 51
 
43
-----
52
+---
44 53
 
45
-![](images/ss.png)
54
+## Analizador de redes simple
46 55
 
47
-**Figura 1** - La aplicación corriendo.
56
+Un *sniffer* de paquetes (también conocido como analizador de paquetes, analizador de protocolos, o analizador de redes) es un programa de computadora que puede interceptar y registrar el tráfico que pasa a través de una red digital, o dispositivo de red.  Mientras los datos fluyen a través de la red, el sniffer captura cada paquete, y si es necesario lo descifra para obtener los datos crudos del paquete [1].
48 57
 
49
-----
58
+Cada paquete capturado por un sniffer tiene una estructura como la que ilustra la Figura 1.
50 59
 
51
-La Figura 1 muestra una foto de la aplicación. Cada fila en la tabla es la información de un paquete capturado, la caja de texto bajo la tabla presenta un resumen en ASCII del paquete seleccionado en la tabla, y la lista en el lado derecho presenta las imagenes que han sido solicitadas y se han visto en la tarjeta de red.
52 60
 
53
-La aplicación que tu estas a punto de completar le da a los usuarios la habilidad de analizar el tráfico de red y monitorear imagenes que estan siendo vistas en tu red.
54 61
 
62
+---
55 63
 
56
-## Sesión de laboratorio
64
+![figure1.png](images/figure1.png)
57 65
 
58
-Para crear un sniffer de paquetes puedes usar la librería de *pcap* que provee una interface para accesar la data que está pasando a través de tu tarjeta de red.  Esta librería contiene una función que devuelve un torrente crudo de los bytes de cada paquete capturado.
66
+**Figura 1.** Estructura de cada paquete de Ethernet capturado por un *sniffer*.
59 67
 
60
-Es la tarea del programador del sniffer decodificar el torrente en crudo a información legible por humanos.  Afortunadamente esta no va a ser tu tarea, pero tu puedes aprender a hacerlo, si quieres, leyendo el código fuente de este laboratorio.  Tu tarea es seguir los ejercicios abajo para que puedas proveerle al sniffer los objetos necesarios (Clases) para procesar los paquetes.
68
+---
61 69
 
62
-## Ejercicio 1: Familiriarizate con la aplicación
63 70
 
64
-**Instrucciones**
65 71
 
66
-1. Para cargar este proyecto necesitas correr qt creator con privilegios de administrador (root).
67
-        ```sudo qtcreator Documents/eip/simplesniffer/SimpleSniffer.pro```
72
+Dentro de la estructura mostrada en la Figura 1 se encuentra:
68 73
 
69
-2. El proyecto `SimpleSniffer` está en el directorio `Documents/eip/simplesniffer` de tu computadora.  Alternativamente puedes crear un clon del repositorio git `http://bitbucket.org/eip-uprrp/classes-simplesniffer` para descargar el directorio `classes-simplesniffer` a tu computadora.
70 74
 
71
-3. Configura el proyecto. El proyecto consiste de varios archivos.  En este laboratorio trabajarás con los archivos `ethernet_hdr.h`, `ethernet_packet.h`, `ethernet_packet.cpp`, `ip_packet.h` and `ip_packet.cpp`.
75
+1. **Destination MAC Address** y **Source Mac Address**: son las direcciones MAC de la fuente y el destino.
76
+3. **Ether Type**: se utiliza para indicar el tipo de de protocolo utilizado en el **payload**. Uno de los **payloads** posibles es un paquete de IP.
77
+4. **Payload**: contiene un paquete de IP (en realidad puede contener otras cosas, pero para esta experiencia de laboratorio asumiremos que contiene solo IP).
72 78
 
73
-## Ejercicio 2: Completa la clase ethernet_packet
79
+Dentro del payload, el paquete de IP contiene varios campos, entre ellos:
74 80
 
75
-Lee el archivo `ethernet_hdr.h`, este contiene la definición de la estructura de datos que representa un encabezado de Ethernet. A continuación mostramos esa definición:
81
+1. Las direcciones **IP fuente y destino**
82
+2. Los números de **puerto fuente y destino**
83
+3. El **payload** del paquete IP. Dentro de este payload estarían los datos que se desean comunicar de una computadora a otra.
76 84
 
77
-```
85
+En esta experiencia de laboratorio completarás un sniffer de paquetes sencillo que captura todos los paquetes de IP que fluyen a través de tu computadora de laboratorio, y alguna información adicional de los paquetes.  Adicionalmente detecta las solicitudes no encriptadas de imágenes en la web, y despliega las imágenes en el GUI.
86
+
87
+---
88
+
89
+---
90
+
91
+
92
+## Sesión de laboratorio:
93
+
94
+
95
+La aplicación que completarás hoy permite a los usuarios analizar el tráfico de red y monitorear las imágenes que están siendo transferidas a través de tu red.
96
+
97
+
98
+---
99
+
100
+![figure2.png](images/figure2.png)
101
+
102
+**Figura 2.** Interface de la aplicación *Simple Packet Sniffer*.
103
+
104
+---
105
+
106
+
107
+
108
+
109
+La Figura 2 muestra una foto de la interfaz de la aplicación. Cada fila en la tabla es la información de un paquete capturado. La caja de texto bajo la tabla presenta un resumen del paquete seleccionado en la tabla. La lista en el lado derecho presenta las imágenes que han sido capturadas por el sniffer.
110
+
111
+
112
+Para crear un sniffer de paquetes puedes usar la librería de *pcap* que provee una interfaz para accesar la data que está pasando a través de la tarjeta de red de tu computadora.  Esta librería contiene una función que devuelve un torrente crudo de los bytes de cada paquete capturado.
113
+
114
+La tarea del programador del sniffer es decodificar el torrente en crudo a información legible por humanos.  Afortunadamente esta no va a ser tu tarea, pero tu puedes aprender a hacerlo, si quieres, leyendo el código fuente de este laboratorio.  Tu tarea es seguir los ejercicios de abajo para que puedas proveerle al sniffer los objetos necesarios (Clases) para procesar los paquetes.
115
+
116
+### Ejercicio 1: Familiriarizate con la aplicación
117
+
118
+#### Instrucciones
119
+
120
+1. Descarga la carpeta `Classes-SimpleSniffer` a tu computadora escribiendo `git clone http://bitbucket.org/eip-uprrp/classes-simplesniffer` en el terminal.
121
+
122
+2. Para cargar este proyecto necesitas correr `Qt Creator` con privilegios de administrador (root). Para lograr esto, escribe lo siguiente en el terminal:
123
+`sudo qtcreator Documents/eip/classes-simplesniffer/Classes-SimpleSniffer.pro`.
124
+
125
+3. Configura el proyecto.  El proyecto consiste de varios archivos.  En esta experiencia de laboratorio trabajarás con los archivos `ethernet_hdr.h`, `ethernet_packet.h`, `ethernet_packet.cpp`, `ip_packet.h` y `ip_packet.cpp`.
126
+
127
+### Ejercicio 2: Completar la clase `ethernet_packet`
128
+
129
+Estudia el archivo `ethernet_hdr.h`. Este archivo contiene la siguiente definición de la estructura de datos que representa un encabezado de Ethernet:
130
+
131
+```cpp
78 132
 #define ETHER_ADDR_LEN 6
79 133
 
80 134
 struct sniff_ethernet {
@@ -84,27 +138,30 @@ struct sniff_ethernet {
84 138
 };
85 139
 ```
86 140
 
87
-El encabezado de Ethernet arriba es usado para decodificar la parte Ethernet de los datos crudos en cada paquete.  Este se compone de la dirección MAC fuente (ether_shost, 6 bytes), la dirección MAC destino (ether_dhost, 6 bytes), y el tipo de paquete de Ethernet (ether_type, 2 bytes) que es usado para determinar si el paquete es un paquete de IP.
141
+El encabezado de Ethernet de arriba es usado para decodificar la parte Ethernet de los datos crudos en cada paquete.  Este se compone de la dirección MAC fuente (`ether_shost`, 6 bytes), la dirección MAC destino (`ether_dhost`, 6 bytes), y el tipo de paquete de Ethernet (`ether_type`, 2 bytes) que es usado para determinar si el paquete es un paquete de IP.
88 142
 
89
-Como puedes ver, no es una buena idea enseñar este formato de información a un usario regular.  Tu primer tarea es definir las funciones de la clase de C++ que define las funciones para traducir la información de las direcciones MAC a cadenas de caracteres legibles por humanos.
143
+Como sabes, no es una buena idea enseñar este formato de información a un usuario regular.  Tu primer tarea es definir los métodos de la clase de C++ que traducen la información de las direcciones MAC a cadenas de caracteres legibles por humanos.
90 144
 
91
-El encabezado de la clase está en el archivo `ethernet_packet.h` y también la mostramos a continuación:
145
+El siguiente código es la definición de la clase `ethernet_packet`, que se encuentra en el archivo `ethernet_packet.h`:
92 146
 
93
-```
147
+```cpp
94 148
 class ethernet_packet
95 149
 {
96 150
 
97 151
     sniff_ethernet ethernet ;
152
+
98 153
     // Devuelve una direccion de 6 bytes MAC en una cadena de caracteres.
99 154
     string mac2string(u_char []) ;
100 155
 
101 156
 public:
102 157
     ethernet_packet();  // Constructor por defecto
103 158
 
104
-    // Ajusta la variable miembro ether_host a los valores
159
+    // Ajusta la variable miembro ether_dhost a los valores
105 160
     // recibidos en el arreglo
106 161
     void setEtherDHost(u_char []) ;
107
-    // Lo mismo que arriba pero al  ether_shost
162
+
163
+    // Ajusta la variable miembro  ether_shost a los valores
164
+    // recibidos en el arreglo
108 165
     void setEtherSHost(u_char []) ;
109 166
 
110 167
     // Ajusta el ethernet type al valor recibido.
@@ -119,32 +176,55 @@ public:
119 176
     u_short getEtherType() ;
120 177
 
121 178
 };
179
+
180
+
181
+
122 182
 ```
123 183
 
124
-Implementa las funciones en el archivo `ethetnet_packet.cpp`.
184
+Nota que cada objeto de clase `ethernet_packet` solo tiene el siguiente atributo:
185
+* una estructura tipo `sniff_ethernet` llamada `ethernet`
186
+
187
+El resto son métodos que actúan como interfaz al atributo:
188
+
189
+* `void setEtherDHost(u_char [])`: es un *setter* para el campo `ether_dhost` del atributo `ethernet`
190
+
191
+* `void setEtherSHost(u_char [])`: es un *setter* para el campo `ether_shost` del atributo `ethernet`
192
+
193
+* `void setEtherType(u_short)`:  es un *setter* para el campo `ether_type` del atributo `ethernet`
194
+
195
+* `getEtherDHost()` y `getEtherSHost()` son *getters* que devuelven los valores de `ether_dhost` y `ether_shost` en formato legible por humanos, i.e. 6 pares de dígitos hexadecimales (por ejemplo, `e0:f8:47:01:e9:90`).
125 196
 
126
-**[Rafa] Puedes sugerir una forma para que validen si han implementado bien la función.**
197
+* `getEtherType()` es un *getter*  que devuelve el valor de `ether_type` como *unsigned char*.
127 198
 
128
-## Ejercicio 3: Construye el encabezado de ip_packet
199
+* el método privado `string mac2string(u_char [])` recibe un arreglo de seis *unsigned characters* y devuelve el string correspondiente a su representación hexadecimal. Por ejemplo, si recibe `{ 0x8A, 0x11, 0xAB, 0xFF, 0x12, 0x34}` debe devolver el string `"8A:11:AB:FF:12:34"`.
129 200
 
130
-Para el Ejercicio 3 debes estudiar las definiciones de las funciones de la clase `ip_packet` que se encuentra en el archivo `ip_packet.cpp`
201
+Tu tarea en este ejercicio es implementar las siete funciones listadas arriba en el archivo `ethetnet_packet.cpp`. Los encabezados de algunas de la funciones están provistos en el archivo.
131 202
 
132
-Tu tarea es definir el **encabezado** de la clase siguiendo las funciones en ese archivo.  Las variables miembro son:
203
+### Ejercicio 3: Construir la declaración de `ip_packet`
133 204
 
134
-* dos variables  `string` para almacenar las direcciones de IP fuente y destino
135
-* una variable de un byte (`char`) para almacenar el typo de protocolo IP
205
+Estudia las definiciones de las funciones de la clase `ip_packet` que se encuentra en el archivo `ip_packet.cpp`
206
+
207
+Tu tarea es crear la *declaración* de la clase `ip_packet` en el archivo `ip_packet.h` tomando como  base  los métodos que aparecen en el archivo `ip_packet.cpp`.  Los atributos de la clase `ip_packet` deben ser:
208
+
209
+* dos objetos de clase `string` para almacenar las direcciones de IP fuente y destino
210
+* una variable de un byte (`char`) para almacenar el tipo de protocolo IP
136 211
 * dos variables `unsigned short` para almacenar el puerto fuente y destino
137
-* una variable `string` para almacenar la carga del paquete.
212
+* un objeto de clase `string` para almacenar la carga (*payload*) del paquete.
138 213
 
139
-En la declaración de la clase `ip_packet` debes especificar que es una clase derivada de la clase `ethernet_packet`.
214
+En la declaración de la clase `ip_packet` debes especificar que es una **clase derivada** de la clase `ethernet_packet`.
140 215
 
141
-### Entregas
216
+---
142 217
 
143
-Utiliza "Entrega" en Moodle para entregar los archivos `ethernet_packet.cpp` y `ip_packet.h` que definistes.
218
+---
144 219
 
145
-### Referencias
220
+## Entregas
146 221
 
147
-[1]http://en.wikipedia.org/wiki/Packet_analyzer
222
+1. Utiliza "Entrega" en Moodle para entregar los archivos `ethernet_packet.cpp` y `ip_packet.h` que completaste. Recuerda utilizar buenas prácticas de programación, incluir el nombre de los programadores y documentar tu programa.
148 223
 
224
+---
149 225
 
150
-----
226
+---
227
+
228
+## Referencias
229
+
230
+[1]http://en.wikipedia.org/wiki/Packet_analyzer

+ 150
- 0
README-es.md-bk View File

@@ -0,0 +1,150 @@
1
+# Clases - Sniffer Simple
2
+
3
+##Objetivos
4
+
5
+1. Practicar la declaración e implementación de clases en C++.
6
+
7
+
8
+## Pre-Lab:
9
+
10
+Antes de llegar al laboratorio debes:
11
+
12
+1. Haber repasado la declaración e implementación de clases en C++.
13
+2. Haber estudiado los conceptos e instrucciones para la sesión de laboratorio.
14
+3. Haber tomado el quiz Pre-Lab que se encuentra en Moodle.
15
+
16
+## Sniffer Simple
17
+
18
+Las computadoras se comunican con otras a través del protocolo de Internet (IP).  Cuando una computadora envia información a otra computadora es via paquetes de Internet que contienen la dirección de Internet de la computadora que envia (computadora fuente), el puerto fuente de la aplicación que está enviando el mensaje, la dirección de Internet de la computadora que recibe (computadora destino), y el puerto de la aplicación que va a recibir el mensaje.
19
+
20
+Podemos comparar las direcciones de Internet a las direcciones de una casa, y las aplicaciones a los miembros de una casa.  Cuando se envia una carta de una casa a otra, la dirección en la carta identifica la casa destino, y el nombre en la carta identifica al miembro de la casa al que se le envía.
21
+
22
+Por ejemplo cuando tu computadora de laboratorio esta contactactando al servidor de web del departamento, los paquetes que cargan la informacion de tu computadora al servidor de web contienen la dirección fuente de la computadora del laboratorio y la dirección destino del servidor de web; y el puerto fuente del tu buscador de web (browser) y el puerto destino del servidor de web.
23
+
24
+Las direcciones de Internet son representados usando 4 bytes (32 bits), y comunmente son presentadas a los usuarios como cadenas de caracteres de 4 valores decimales.  Cada valor decimal es la representacion decimal de uno de los 4 bytes: "(0-255).(0-255).(0-255).(0-255)". Por ejemplo, las siguientes son tres direcciones IP  10.0.1.10, 192.168.10.11, 136.145.54.10.
25
+
26
+Los números de los puertos son enteros sin signo en el rango de [0-65535]. Se representan usando 2 bytes (16 bits). Hay números de puertos que son asignados a servicios de aplicaciones comúnes tales como el número 22 para ssh, 23 para telnet, 25 smtp, y el 80 para http.
27
+
28
+Para complicar las cosas un poco, cada tarjeta de red de computadoras tiene un identificador único que es usado para la comunicación entre tu computadora y el dispositivo de la red que enruta el tráfico de red de Internet y la red local a tu computadora y vice-versa (protocolo Ethernet). Este identificador único es conocido como la dirección de Hardware (también conocido como dirección MAC), es representado usando 6 bytes (48 bits), y es presentado a los usarios como una cadena de caracteres de 6 pares de dígitos hexadecimales (cada par de dígitos hexadecimal corresponde a 1 byte). Por ejemplo, los siguientes son direcciones MAC:  `e0:f8:47:01:e9:90` y  `70:ad:60:ff:fe:dd:79:d8`.
29
+
30
+Un sniffer de paquetes (también conocido como analizador de paquetes, analizador de protocolos, o analizador de red) es un programa de computadora que puede interceptar y registrar tráfico pasando a través de una red digital, o dispositivo de red.  Mientras los datos fluyen a través de la red, el sniffer captura cada paquet, y si es necesario decodifica los datos crudos del paquete[1].
31
+
32
+Cada paquete capturado por este programa tiene la siguiente estructura:
33
+
34
+1. un encabezado de Ethernet que contiene las direcciones MAC fuente y destino
35
+2. un encabezado de IP que contiene las direcciones IP fuente y destino
36
+3. un encabezado que contiene los números de puerto fuente y destino
37
+
38
+En esta experiencia de laboratorio completaremos un sniffer de paquetes sencillo que captura todos los paquetes de IP que fluyen a través de tu computadora de laboratorio, y alguna información adicional de los paquetes.  Adicionalmente detecta las solicitudes no encriptadas de imagenes en la web, y despliega las imágenes en el GUI.
39
+
40
+
41
+
42
+
43
+----
44
+
45
+![](images/ss.png)
46
+
47
+**Figura 1** - La aplicación corriendo.
48
+
49
+----
50
+
51
+La Figura 1 muestra una foto de la aplicación. Cada fila en la tabla es la información de un paquete capturado, la caja de texto bajo la tabla presenta un resumen en ASCII del paquete seleccionado en la tabla, y la lista en el lado derecho presenta las imagenes que han sido solicitadas y se han visto en la tarjeta de red.
52
+
53
+La aplicación que tu estas a punto de completar le da a los usuarios la habilidad de analizar el tráfico de red y monitorear imagenes que estan siendo vistas en tu red.
54
+
55
+
56
+## Sesión de laboratorio
57
+
58
+Para crear un sniffer de paquetes puedes usar la librería de *pcap* que provee una interface para accesar la data que está pasando a través de tu tarjeta de red.  Esta librería contiene una función que devuelve un torrente crudo de los bytes de cada paquete capturado.
59
+
60
+Es la tarea del programador del sniffer decodificar el torrente en crudo a información legible por humanos.  Afortunadamente esta no va a ser tu tarea, pero tu puedes aprender a hacerlo, si quieres, leyendo el código fuente de este laboratorio.  Tu tarea es seguir los ejercicios abajo para que puedas proveerle al sniffer los objetos necesarios (Clases) para procesar los paquetes.
61
+
62
+## Ejercicio 1: Familiriarizate con la aplicación
63
+
64
+**Instrucciones**
65
+
66
+1. Para cargar este proyecto necesitas correr qt creator con privilegios de administrador (root).
67
+        ```sudo qtcreator Documents/eip/simplesniffer/SimpleSniffer.pro```
68
+
69
+2. El proyecto `SimpleSniffer` está en el directorio `Documents/eip/simplesniffer` de tu computadora.  Alternativamente puedes crear un clon del repositorio git `http://bitbucket.org/eip-uprrp/classes-simplesniffer` para descargar el directorio `classes-simplesniffer` a tu computadora.
70
+
71
+3. Configura el proyecto. El proyecto consiste de varios archivos.  En este laboratorio trabajarás con los archivos `ethernet_hdr.h`, `ethernet_packet.h`, `ethernet_packet.cpp`, `ip_packet.h` and `ip_packet.cpp`.
72
+
73
+## Ejercicio 2: Completa la clase ethernet_packet
74
+
75
+Lee el archivo `ethernet_hdr.h`, este contiene la definición de la estructura de datos que representa un encabezado de Ethernet. A continuación mostramos esa definición:
76
+
77
+```
78
+#define ETHER_ADDR_LEN 6
79
+
80
+struct sniff_ethernet {
81
+        u_char  ether_dhost[ETHER_ADDR_LEN];    /* direccion destino */
82
+        u_char  ether_shost[ETHER_ADDR_LEN];    /* direccion fuente */
83
+        u_short ether_type;                     /* IP? ARP? RARP? etc */
84
+};
85
+```
86
+
87
+El encabezado de Ethernet arriba es usado para decodificar la parte Ethernet de los datos crudos en cada paquete.  Este se compone de la dirección MAC fuente (ether_shost, 6 bytes), la dirección MAC destino (ether_dhost, 6 bytes), y el tipo de paquete de Ethernet (ether_type, 2 bytes) que es usado para determinar si el paquete es un paquete de IP.
88
+
89
+Como puedes ver, no es una buena idea enseñar este formato de información a un usario regular.  Tu primer tarea es definir las funciones de la clase de C++ que define las funciones para traducir la información de las direcciones MAC a cadenas de caracteres legibles por humanos.
90
+
91
+El encabezado de la clase está en el archivo `ethernet_packet.h` y también la mostramos a continuación:
92
+
93
+```
94
+class ethernet_packet
95
+{
96
+
97
+    sniff_ethernet ethernet ;
98
+    // Devuelve una direccion de 6 bytes MAC en una cadena de caracteres.
99
+    string mac2string(u_char []) ;
100
+
101
+public:
102
+    ethernet_packet();  // Constructor por defecto
103
+
104
+    // Ajusta la variable miembro ether_host a los valores
105
+    // recibidos en el arreglo
106
+    void setEtherDHost(u_char []) ;
107
+    // Lo mismo que arriba pero al  ether_shost
108
+    void setEtherSHost(u_char []) ;
109
+
110
+    // Ajusta el ethernet type al valor recibido.
111
+    void setEtherType(u_short) ;
112
+
113
+    // Devuelve la representación en cadenas de caracteres de las direcciones
114
+    // Ethernet
115
+    string getEtherDHost() ;
116
+    string getEtherSHost() ;
117
+
118
+    // Devuelve el tipo de ethernet.
119
+    u_short getEtherType() ;
120
+
121
+};
122
+```
123
+
124
+Implementa las funciones en el archivo `ethetnet_packet.cpp`.
125
+
126
+**[Rafa] Puedes sugerir una forma para que validen si han implementado bien la función.**
127
+
128
+## Ejercicio 3: Construye el encabezado de ip_packet
129
+
130
+Para el Ejercicio 3 debes estudiar las definiciones de las funciones de la clase `ip_packet` que se encuentra en el archivo `ip_packet.cpp`
131
+
132
+Tu tarea es definir el **encabezado** de la clase siguiendo las funciones en ese archivo.  Las variables miembro son:
133
+
134
+* dos variables  `string` para almacenar las direcciones de IP fuente y destino
135
+* una variable de un byte (`char`) para almacenar el typo de protocolo IP
136
+* dos variables `unsigned short` para almacenar el puerto fuente y destino
137
+* una variable `string` para almacenar la carga del paquete.
138
+
139
+En la declaración de la clase `ip_packet` debes especificar que es una clase derivada de la clase `ethernet_packet`.
140
+
141
+### Entregas
142
+
143
+Utiliza "Entrega" en Moodle para entregar los archivos `ethernet_packet.cpp` y `ip_packet.h` que definistes.
144
+
145
+### Referencias
146
+
147
+[1]http://en.wikipedia.org/wiki/Packet_analyzer
148
+
149
+
150
+----