Browse Source

README-es.md edited on August 3, 2016 at 11:55am

Jose R Ortiz Ubarri 8 years ago
parent
commit
6429653432
1 changed files with 25 additions and 33 deletions
  1. 25
    33
      README-es.md

+ 25
- 33
README-es.md View File

4
 
4
 
5
 [Verano 2016 - Ive - Coralys]
5
 [Verano 2016 - Ive - Coralys]
6
 
6
 
7
-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. Otros lenguajes que promueven OOP son Java, Python, JavaScript y PHP.   
7
+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. Otros lenguajes que promueven OOP son Java, Python, JavaScript y PHP.   
8
 
8
 
9
-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 la clase *punto* puede realizar la acción de cambiar el valor de su coordenada *x*.
9
+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í, con los *métodos* que contiene. Por ejemplo, un objeto de la clase *punto* puede realizar la acción de cambiar el valor de su coordenada *x*.
10
 
10
 
11
 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 los 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 el 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
 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 los 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 el 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.
12
 
12
 
35
 
35
 
36
 ## Clases y objetos en C++
36
 ## Clases y objetos en C++
37
 
37
 
38
-Un *objeto* es un ente que contiene datos y procedimientos para manipularlos. Al igual que cada variable tiene un *tipo* de dato asociada a ella, cada objeto tiene una *clase* asociada que describe las propiedades de los objetos:
39
-sus datos (*atributos*), y los procedimientos con los que se pueden manipular los datos (*métodos*).
38
+Un *objeto* es un ente que contiene datos y procedimientos para manipularlos. Al igual que cada variable tiene un *tipo* de dato asociada a ella, cada objeto tiene una *clase* asociada que describe las propiedades de los objetos: sus datos (*atributos*), y los procedimientos con los que se pueden manipular los datos (*métodos*).
40
 
39
 
41
-Para definir y utilizar un objeto no hay que saber todos los detalles de los métodos del objeto pero hay que saber cómo crearlo, y cómo interactuar con él. La  información necesaria está disponible en la documentación de la clase. Antes de crear objetos de cualquier clase debemos familiarizarnos con su documentación. La documentación nos indica, entre otras cosas, que ente se está tratando de representar con la clase, y cuáles son los interfaces o métodos disponibles para manipular los objetos de la clase.
40
+Para definir y utilizar un objeto no hay que saber todos los detalles de los métodos del objeto, pero hay que saber cómo crearlo, y cómo interactuar con él. La  información necesaria está disponible en la documentación de la clase. Antes de crear objetos de cualquier clase, debemos familiarizarnos con su documentación. La documentación nos indica, entre otras cosas, qué ente se está tratando de representar con la clase, y cuáles son los interfaces o métodos disponibles para manipular los objetos de la clase.
41
+
42
+
43
+Para que veas un ejemplo de una clase, dale un vistazo a la documentación de la clase `Bird` que se encuentra en [este enlace] (http://ada.uprrp.edu/~ranazario/bird-html/class_bird.html). 
42
 
44
 
43
-Dale un vistazo a la documentación de la clase `Bird` que se encuentra en [este enlace] (http://ada.uprrp.edu/~ranazario/bird-html/class_bird.html). 
44
 
45
 
45
 ### Clases
46
 ### Clases
46
 
47
 
47
 Una clase es una descripción de los datos y procesos de un objeto. La declaración de una clase establece los atributos que tendrá cada objeto de esa clase y los métodos que pueden invocar.
48
 Una clase es una descripción de los datos y procesos de un objeto. La declaración de una clase establece los atributos que tendrá cada objeto de esa clase y los métodos que pueden invocar.
48
 
49
 
49
-
50
 Si no se especifica lo contrario, los atributos y métodos definidos en una clase serán privados. Esto quiere decir que esas variables solo se pueden acceder y cambiar por los métodos de la clase (*constructores*, *"setters"* y *"getters"*, entre otros). 
50
 Si no se especifica lo contrario, los atributos y métodos definidos en una clase serán privados. Esto quiere decir que esas variables solo se pueden acceder y cambiar por los métodos de la clase (*constructores*, *"setters"* y *"getters"*, entre otros). 
51
 
51
 
52
 Lo siguiente es el esqueleto de la declaración de una clase:
52
 Lo siguiente es el esqueleto de la declaración de una clase:
80
 
80
 
81
 ---
81
 ---
82
 
82
 
83
+
83
 ## Comunicación entre computadoras
84
 ## Comunicación entre computadoras
84
 
85
 
85
 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 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 destino* ("destination address"), que es la 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?
86
 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 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 destino* ("destination address"), que es la 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?
86
 
87
 
87
-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 pueden identificar las direcciones y puertos de la fuente y del destino.
88
+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 de 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 pueden identificar las direcciones y puertos de la fuente y del destino.
88
 
89
 
89
-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.
90
+Por ejemplo, cuando la computadora que usas en el 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.
90
 
91
 
91
-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:
92
- "(0-255).(0-255).(0-255).(0-255)". Algunos ejemplos de direcciones de IP son:
93
- `10.0.1.10`, `192.168.10.11`, `136.145.54.10`.
92
+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`.
94
 
93
 
95
-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`.
94
+Los números de puertos están compuestos de 2 bytes (16 bits). Por lo tanto, los números de puertos ocilan entre 0 y 65535. Existen números de puertos asignados a serivicios de aplicaciones conocidas como el número 22 para ssh, 23 para telnet, 25 para smtp, 80 para http, y así sucesivamente. 
95
+
96
+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). Cada valor hexadecimal es la representación hexadecimal de 6 bytes: "(00-ff):(00-ff):(00-ff):(00-ff):(00-ff):(00-ff)". Por ejemplo, las siguientes son direcciones MAC:  `e0:f8:47:01:e9:90` y  `70:ad:60:ff:fe:dd`.
96
 
97
 
97
 ---
98
 ---
98
 
99
 
100
 
101
 
101
 ## Analizador de redes simple
102
 ## Analizador de redes simple
102
 
103
 
103
-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].
104
+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].
104
 
105
 
105
 Cada paquete capturado por un sniffer tiene una estructura como la que ilustra la Figura 1.
106
 Cada paquete capturado por un sniffer tiene una estructura como la que ilustra la Figura 1.
106
 
107
 
115
 ---
116
 ---
116
 
117
 
117
 
118
 
118
-
119
 Dentro de la estructura mostrada en la Figura 1 se encuentra:
119
 Dentro de la estructura mostrada en la Figura 1 se encuentra:
120
 
120
 
121
-
122
 1. **Destination MAC Address** y **Source Mac Address**: son las direcciones MAC de la fuente y el destino.
121
 1. **Destination MAC Address** y **Source Mac Address**: son las direcciones MAC de la fuente y el destino.
123
 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.
122
 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.
124
-4. **Payload**: contiene un paquete de IP (en realidad puede contener otras cosas, pero para esta experiencia de laboratorio asumiremos que contiene solo IP).
123
+4. **Payload**: contiene un paquete de IP (en realidad puede contener otras cosas, pero para esta experiencia de laboratorio asumiremos que solamente contiene IP).
124
+
125
 
125
 
126
 Dentro del "payload", el paquete de IP contiene varios campos, entre ellos:
126
 Dentro del "payload", el paquete de IP contiene varios campos, entre ellos:
127
 
127
 
135
 
135
 
136
 ---
136
 ---
137
 
137
 
138
-!INCLUDE "../../eip-diagnostic/simple-sniffer/es/diag-simple-sniffer-01.html"
139
-<br>
140
-
141
----
142
-
143
----
144
-
145
-
146
 
138
 
147
 ## Sesión de laboratorio:
139
 ## Sesión de laboratorio:
148
 
140
 
157
 
149
 
158
 ![figure2.png](images/figure2.png)
150
 ![figure2.png](images/figure2.png)
159
 
151
 
160
-**Figura 2.** Interface de la aplicación *Simple Packet Sniffer*.
152
+**Figura 2.** Interfaz de la aplicación *Simple Packet Sniffer*.
161
 
153
 
162
 ---
154
 ---
163
 
155
 
173
 
165
 
174
 1. Carga a `QtCreator` el proyecto `SimpleSniffer`. Hay dos maneras de hacer esto:
166
 1. Carga a `QtCreator` el proyecto `SimpleSniffer`. Hay dos maneras de hacer esto:
175
 
167
 
176
-    * Utilizando la máquina virtual, necesitas correr QtCreator con privilegios de administrador (root): 
168
+    * Utilizando la máquina virtual, necesitas correr Qt Creator con privilegios de administrador (root): 
177
 `sudo qtcreator /home/eip/labs/classes-simplesniffer/SimpleSniffer.pro` 
169
 `sudo qtcreator /home/eip/labs/classes-simplesniffer/SimpleSniffer.pro` 
178
-    * Descargando la carpeta del proyecto de `Bitbucket`: Utiliza un terminal y escribe el commando `git clone http:/bitbucket.org/eip-uprrp/classes-simplesniffer` para descargar la carpeta `classes-simplesniffer` de `Bitbucket`. En esa carpeta, necesitas correr QtCreator con privilegios de administrador (root):
170
+    * Descargando la carpeta del proyecto de `Bitbucket`: Utiliza un terminal y escribe el comando `git clone http:/bitbucket.org/eip-uprrp/classes-simplesniffer` para descargar la carpeta `classes-simplesniffer` de `Bitbucket`. En esa carpeta, necesitas correr Qt Creator con privilegios de administrador (root):
179
 `sudo qtcreator ./SimpleSniffer.pro` 
171
 `sudo qtcreator ./SimpleSniffer.pro` 
180
 
172
 
181
 2. Configura el proyecto. 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`.
173
 2. Configura el proyecto. 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`.
193
            u_short ether_type;                     /* IP? ARP? RARP? etc */
185
            u_short ether_type;                     /* IP? ARP? RARP? etc */
194
          };
186
          };
195
 
187
 
196
-     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.
188
+     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.
197
 
189
 
198
      Como sabes, no es una buena idea enseñar este formato de información a un usuario regular.  Tu primera 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.
190
      Como sabes, no es una buena idea enseñar este formato de información a un usuario regular.  Tu primera 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.
199
 
191
 
236
      * `void setEtherDHost(u_char [])`: es un *setter* para el campo `ether_dhost` del atributo `ethernet`
228
      * `void setEtherDHost(u_char [])`: es un *setter* para el campo `ether_dhost` del atributo `ethernet`
237
      * `void setEtherSHost(u_char [])`: es un *setter* para el campo `ether_shost` del atributo `ethernet`
229
      * `void setEtherSHost(u_char [])`: es un *setter* para el campo `ether_shost` del atributo `ethernet`
238
      * `void setEtherType(u_short)`:  es un *setter* para el campo `ether_type` del atributo `ethernet`
230
      * `void setEtherType(u_short)`:  es un *setter* para el campo `ether_type` del atributo `ethernet`
239
-     * `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`).
231
+     * `getEtherDHost()` y `getEtherSHost()` son *getters* que devuelven los valores de `ether_dhost` y `ether_shost` en formato legible por humanos, e.g. 6 pares de dígitos hexadecimales (por ejemplo, `e0:f8:47:01:e9:90`).
240
      * `getEtherType()` es un *getter*  que devuelve el valor de `ether_type` como *unsigned char*.
232
      * `getEtherType()` es un *getter*  que devuelve el valor de `ether_type` como *unsigned char*.
241
      * 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"`.
233
      * 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"`.
242
 
234
 
246
 
238
 
247
 1. Estudia las definiciones de las funciones de la clase `ip_packet` que se encuentra en el archivo `ip_packet.cpp`
239
 1. Estudia las definiciones de las funciones de la clase `ip_packet` que se encuentra en el archivo `ip_packet.cpp`
248
 
240
 
249
-2. 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:
241
+2. 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:
250
 
242
 
251
        * dos objetos de clase `string` para almacenar las direcciones de IP fuente y destino
243
        * dos objetos de clase `string` para almacenar las direcciones de IP fuente y destino
252
        * una variable de un byte (`char`) para almacenar el tipo de protocolo IP
244
        * una variable de un byte (`char`) para almacenar el tipo de protocolo IP
253
        * dos variables `unsigned short` para almacenar el puerto fuente y destino
245
        * dos variables `unsigned short` para almacenar el puerto fuente y destino
254
-       * un objeto de clase `string` para almacenar la carga (*payload*) del paquete.
246
+       * un objeto de la clase `string` para almacenar la carga (*payload*) del paquete.
255
 
247
 
256
        En la declaración de la clase `ip_packet` debes especificar que es una **clase derivada** de la clase `ethernet_packet`.
248
        En la declaración de la clase `ip_packet` debes especificar que es una **clase derivada** de la clase `ethernet_packet`.
257
 
249
 
261
 
253
 
262
 ## Entregas
254
 ## Entregas
263
 
255
 
264
-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, al incluir el nombre de los programadores y documentar tu programa.
256
+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, incluye el nombre de los programadores y documenta tu programa.
265
 
257
 
266
 ---
258
 ---
267
 
259