Redes
para las masas – Tercera Parte
En
los artículos pasados vimos elementos que nos permitieron conocer
aspectos más que nada físicos de las redes de datos. Sus
materiales, velocidades, y normas, entre otros.
En
éste analizaremos algo que nos permitirá entender cómo es que dos
o más máquinas logran comunicarse sin fallar en el intento. Veremos
qué es el modelo de las siete capas OSI, y por qué es tan necesario
que exista un estándar como ese.
Finalmente,
y como para amenizar tanta teoría, nos pondremos a filtrar paquetes
de red, entendiendo qué es lo que ocurre por debajo de una
comunicación entre sistemas informáticos. ¡Manos a la obra!
Una
arquitectura modelo
El
conjunto de protocolos TCP/IP es conocido de esta forma por dos de
sus más importantes componentes, que son el Protocolo de Control de
Transmisión (“Transmission Control Protocol”, o “TCP”) y el
Protocolo de Internet (“Internet Protocol”, o “IP”). En
algunos manuales viejos podremos encontrar para esto denominaciones
tales como “Conjunto de Protocolos de Internet”, ya que en los
documentos oficiales originalmente publicados aparecieron con ese
nombre.
El
éxito de diseño de TCP/IP consistió en lograr la interconexión de
redes de datos, referido en algunos documentos como “internetwork”,
o “internet”, y entregar servicios de conexión a redes
heterogéneas desde el punto de vista físico. Nótese que hemos
escrito esta palabra (“internet”) con una “i” minúscula,
volveremos a esto más adelante.
Uno
de los beneficios de ese diseño fue el de permitir que sistemas
separados geográficamente puedan “conversar” entre sí, aún
cuando esa separación sea inmensa. Hoy en día vemos cómo este
éxito continúa de la mano de usar Internet (ahora con “I”
mayúscula) y conectarnos a los sitios más remotos sin casi darnos
cuenta.
Antes
comenté que había que notar que estaba usando la palabra “internet”
con minúscula. Pues bien, eso es porque esa palabra no es más que
una contracción del término “interconnected network”, y no
hacen referencia a la red a la que nos conectamos para recibir
nuestro correo electrónico, por ejemplo, llamada “Internet”, con
una “I” mayúscula.
Internet
(con mayúscula) está compuesta por muchos elementos, como ser
backbones (redes grandísimas que fueron diseñadas en un principio
para interconectar otras redes, por eso la traducción de backbone
será la de “hueso de atrás”, que es el que sostiene a los demás
huesos. En algunos manuales los veremos nombrados como “Puntos de
Acceso a Redes”, o “Network Access Points”, abreviados como
“NAPs”, y en otros como “Puntos de Intercambio de Internet”,
o Internet Exchange Points”, en este caso abrevados como “IPXs”),
redes regionales (éstas interconectan diferentes edificios, como ser
empresas, escuelas, universidades, etc.), redes comerciales (aquí
vemos redes que se suscriben a uno o más backbones para lograr su
salida a otras redes) y redes locales (sólo interconectan las
máquinas que se encuentran dentro de una organización).
Como
vimos en las entregas anteriores, las redes generalmente estarán
limitadas por la cantidad de personas que a ellas pertenecen (cuando
decimos “personas”, léase también “máquinas”), por la
distancia geográfica máxima que pueden cubrir, o por su grado de
aplicación a diferentes ambientes. Entonces, podremos tener dos o
más “internets” (con minúscula) que están interconectadas por
un ruteador para formar una “internet” más grande. Será el
mismo ruteador quien entienda la forma de retransmitir paquetes de
red de una a otra parte de la red en forma transparente.
Un
aspecto que brinda importancia a la forma en la que está diseñado
TCP/IP es su capacidad de crear una abstracción estandarizada de los
mecanismos de comunicaciones provistos por cada una de las redes,
desde el punto de vista físico. Cada red tiene sus sistemas físicos
de interconexión que le son propios, y que han sido adoptados en
base a la tecnología disponible, el tipo de máquinas que deben
interconectar, o la distancia que deben cubrir. Para cada una de esas
interfaces físicas se programan funciones primitivas, específicas,
pero que TCP/IP permite utilizar en su trabajo de interconexión de
las porciones físicas de la comunicación para con las porciones
lógicas.
Como
la mayor parte de los programas de comunicaciones, TCP/IP está
diseñado pensando en capas que funcionan casi como si se tratara de
edificios con ascensores. Así es que tendremos un conjunto de capas
ordenadas que regirán la forma en la cual las máquinas logran
comunicarse, y que son muy útiles a los programadores para que no
tengan que rearmar desde el punto inicial todo cada vez que deban
armar un programa de comunicaciones. Divide y vencerás, es el lema,
y en TCP/IP se pone de manifiesto de la mejor forma.
Imaginemos
este escenario: Vivimos en el séptimo piso de un edificio, y nuestro
departamento tiene un ventanal que nos permite ver otros edificios.
Un buen día vemos por ese ventanal una persona que por su grado de
atracción no nos deja dormir en paz.
Para
acercarnos e intentar la conquista tendríamos que abrir nuestra
puerta, viajar en ascensor, salir por la puerta de nuestro edificio,
caminar hasta el edificio de nuestro punto de atención, abrir la
puerta de su edificio, acercarnos a su ascensor, luego tocar el
timbre, y si tenemos suerte, habremos recibido una respuesta a
nuestra propuesta.
Igual
funcionan las capas del modelo OSI, en el que nos adentraremos a
continuación.
Haciéndose
el OSI
OSI
es la sigla correspondiente a “Open Systems Interconnections”, un
producto que nació gracias a la entidad “International
Organization for Standarization”, o “ISO”, aunque la sigla no
siga estrictamente el orden de las palabras. Esta organización nació
en 1926 como la “International Federation of the National
Standardizing Associations”, o “ISA”, y cuyo principal objetivo
era el de normalizar aspectos de ingeniería mecánica. Claro, en esa
época, la electrónica no estaba tan difundida, y todo lo que luego
vino estaba en un estado germinal absoluto.
Como
muchas organizaciones de ese estilo, cuando la segunda guerra mundia,
en 1942, fue completamente desbaratada, para luego reorganizarse como
la “ISO” en 1946, y recomenzar sus operaciones a principios de
1947.
Uno
podría tener una idea bastante romántica de lo que es la “ISO”
por pensar en su generación de estándares abiertos, pero lo cierto
es que como muchas organizaciones, estuvo sostenida económicamente
por empresas, muchas de las cuales estaban bastante deseosas de ver
como estándar sus propios diseños, y así imponer en el mundo una u
otra patente que les permitiera salir a flote. Hoy en día se
establecen “estándares de facto”, y antes la tendencia era a
tener un ente que los regule. Las caras han cambiado, las caretas son
las mismas.
Pero
dejando eso de lado, una de las buenas cosas que salió de la “ISO”
fue el modelo “OSI” que divide la comunicación entre las
siguientes capas:
- Capa Física: Capa 1. La capa física define las especificaciones físicas y eléctricas de los dispositivos de interconexión. Específicamente, define la relación entre los dispositivos y sus medios de transmisión, como ser la fibra óptica, el cobre, y otros. Entre las cosas que podremos ver en esta capa está la tensión (voltaje) que debe tener cada pata de un conector, cómo se definen las patas de esos conectores, su impedancia máxima, aspectos de tiempo de señales, y demás. Si no fuera por esta capa, oleríamos a quemado cada vez que conectáramos un nuevo dispositivo a nuestra máquina, ya que no es lo mismo conectar un cable de red que tenga unos pocos voltios, a un cable de la pared, con 220 voltios alternos, al menos donde yo vivo.
- Capa de Enlace de Datos: Capa 2. Provee los aspectos funcionales y procedurales para transferir datos entre redes de diferentes entidades, detectando y en lo posible eliminando cualquier tipo de error que se pudiera producir en el proceso de comunicación desde el punto de vista físico. Actualmente, sólo se maneja en esta capa el control de errores, y no el control de flujo eléctrico, como ocurría en un principio. Para entender mejor esta capa, imaginemos que enviamos un mensaje, y le agregamos datos de corroboración para que quien lo reciba pueda saber si lo que obtuvo es el mensaje correcto, o si tiene errores, y en este último caso, que cuente con los elementos para sobrellevar esta corrección de errores en la mayor parte de los casos. Si enviara un mail, por ejemplo, en el que al final de cada palabra le agregara un número que representa la suma de los números de orden de cada caracter, podría pensar en un control de errores. “hola” sería seguido por 8 (posición de la “h” en el alfabeto) + 15 (ídem para la “o”) + 12 + 1 = 36, y el receptor recibiría “hola36”. Si le llega “holo36”, o “halo32”, sabría que algo anduvo mal en esa comunicación. Un punto importante a tener en cuenta es que esta capa sólo interconecta elementos de la misma red, no entiendo cómo armar rutas entre redes. Elementos de red que se encuentran en esta capa son los hubs, o los switches de capa 2, ya que sólo tendremos control, en este caso, de elementos tales como la dirección “MAC”, o “Machine Address Code”.
- Capa de Red: Capa 3. La capa de red provee los elementos funcionales y procedurales para transferir secuencias de datos de longitud variable desde una fuente hacia un destino en diferentes redes, a diferencia de la capa anterior, que sólo lo hacía entre elementos de la misma red. Entonces, esta capa permite que funciones de ruteo tengan lugar, y por ende conocerá la forma de enviar paquetes de información desde una red a otra, así como recibir sus respuesta, y enviarlas a la máquina correspondiente. Los sistemas que operan en este nivel son los ruteadores (routers), que interconectan, por ejemplo, la red de nuestra casa con Internet. La capa de red, a la vez, se puede dividir en otras subcapas, que si bien son importantes, no aportarán mucho más a nuestro conocimiento de redes. Como se estarán imaginando, todo lo que se relacione con IP estará alojado en esta capa, ya que para poder armar rutas, debe haber un esquema de direcciones IP de las máquinas. Por supuesto, lo serán Ipv4, así como Ipv6, ARP, ICMP, IPSec, y otros tantos.
- Capa de Transporte: Capa 4. Esta capa permite la transferencia transparente de datos entre usuarios, entregando servicios de datos confiables a las capas superiores. Esta capa controla el grado de confiabilidad que un determinado enlace tendrá a través de controles de flujo, segmentación y desegmentación de paquetes, y control de errores. Veremos más adelante que algunos de los protocolos de comunicación que utilizaremos serán orientados a la conexión, pues entonces tendremos en esta capa la responsable de guardar un detalle del estado de cada uno de los segmentos recibidos, y de retransmitirlos en caso de errores. Por lo tanto, esta capa debe guardar también un detalle de cuáles son las transmisiones de datos existentes, si fueron o no exitosas, y de transmitir los siguientes datos si los anteriores llegaron a destino. Como se podrán imagina, todo lo que sea TCP será cercano a esta capa. También lo serán UDP, o SPX.
- Capa de Sesión: Capa 5. La capa de sesión controla los diálogos (si hacemos que las máquinas tomen consistencia humana, podremos hablar de este tipo de comunicación) o conexiones existentes entre distintas computadoras. Eso quiere decir que debe tener una tabla en algún lugar donde estén registradas todas las conexiones, y a la que deberá acudir cada vez que necesite conectar o desconectar alguna. Pero como es lógico, si esta tabla existe, tendrá también otros elementos, como ser detalles del tipo de comunicación establecida (si es half-duplex, full-duplex, etc.), metodologías de chequeo de conexiones, etc. Es muy común que esta capa esté implementada en aplicaciones que necesitan de la apertura o cierre de conexiones, como ser el caso de RPC, o “Remote Procedure Call”. Otros casos son NetBIOS, PPTP, o TLS/SSL.
- Capa de Presentación: Capa 6. Esta capa es un claro ejemplo de cómo se puede independizar al programador de aplicaciones orientadas a la red de tener que conocer todo sobre cada una de las anteriores capas, permitiéndole focalizarse sólo en lo que mejor (o peor) hace. La capa de presentación establece el contexto entre entidades a nivel de aplicación, entonces entendiendo su semántica, y mapeándolas para entregar datos en unidades encapsuladas siguiendo una norma estándar. Para que veamos esta capa con un poco más de claridad, veamos cómo una cadena puede ser transformada de un formato particular al ASCII, o cómo se pueden manejar las estructuras de datos existentes en archivos XML para ser generados e interpretados por las máquinas intervinientes en la comunicación. MIME o XDR son ejemplos de elementos que podremos encontrar en esta capa.
- Capa de Aplicaciones: Capa 7. Finalmente hemos llegado a la capa 7, la más cercana al usuario. Esta capa contiene al software de aplicaciones que luego hará uso de todas las demás capas inferiores para lograr una correcta y adecuada comunicación entre diferentes sistemas. Ejemplos de esta capa son el uso de HTTP, FTP, SMTP, IMAP, NNTP, NTP, NFS, o cualquier otro programa que permita la comunicación de cara al usuario.
A
continuación, un diagrama que muestra todas estas capas:
Es
común que, como broma “nerd”, se hable de “errores de capa 8”.
Como podremos imaginarnos, la capa 8 es el mismo usuario, con lo cual
se hace referencia a que cuando algo falla, es el usuario quien debe
ser reescrito, o puesto de acuerdo a algún estándar. Así nos
divertimos los nerds, somos gente jocosa, qué se le va a hacer.
Por
otro lado, si bien vemos una división estricta y bastante taxativa
en lo que a cada capa refiere, veremos en la vida real que no lo es
tanto. Inclusive, es muy común que a nivel de TCP/IP, algunas capas
parezcan solaparse con otras, o que varias estén incorporadas en una
misma, como pasa con las capas 4, 5 y 6, normalmente implementadas en
nuestro stack como un único módulo, denominado “Capa de
Transporte”, análoga a la que tenemos en el modelo OSI
tradicional.
Paquete
para su servidor
Ahora
bien, ya sabiendo cómo funciona el modelo OSI, y cómo se mapea con
el stack TCP/IP, podremos ver cómo se compone un paquete de red, y
cómo se encuentran representadas, en él, cada una de las capas de
este modelo.
Un
paquete de red es toda aquella unidad de datos transportada por una
red de computadoras, sabiendo que los enlaces en sí mismos no
transmiten paquetes, sino flujos de bits representados como “0's”
y “1's”, y esos valores son conformados por impulsos eléctricos
que dependiendo de si presentan o no tensión en sus conductores en
un momento determinado así lo definirán.
Un
paquete de red consiste de dos tipos de datos bien definidos, y que
son los siguientes:
- Información de control: Provee la información que necesita la red para entregar los datos del usuario. Ejemplos son las direcciones de origen y destino, los datos de chequeo de errores y recuperación, información de secuencia de datos, etc. Esta información se encuentra en su cabecera y en su cola (conocidos también como “header” y “trailer”).
- Cabecera: La cabecera contiene instrucciones sobre los datos transmitidos por el paquete. Estas instrucciones pueden incluir la longitud del paquete (dado que algunas redes pueden transmitir paquetes de dimensión fija, mientras que otros se basan en la información de esta misma cabecera para establecer su tamaño), datos de sincronización, numero de paquete (cuando se reconstruya la información será esencial contar con esta información), información de origen y de destino del paquete.
- Cola: El trailer también es conocido como el pié del paquete, y normalmente contiene algunos bits que le explican al sistema que recibe la comunicación que ha llegado el final del paquete, así como alguna información de control de errores, como ser un CRC (“Cyclic Redundancy Check”, o chequeo de redundancia cíclica). Si los datos de control de errores no validaran al contenido del paquete, el sistema le pediría al que lo originó que lo reenvíe. Veamos una cabecera típica:
Notemos
algunos datos interesantes: La dirección de origen utiliza 32 bits,
así como la de destino. Recordemos que una dirección IP del
protocolo Ipv4 se puede descomponer en cuatro octetos de bits,
entonces nos cierra perfectamente la dimensión.
- Datos de usuario: Esta parte también se conoce como el cuerpo (“body”) o sencillamente como la sección de datos (“payload”). Es ésta la parte que contiene los datos que realmente se deben entregar al destinatario. Si el paquete fuera de dimensión fija, la parte del cuerpo que no contiene datos sería rellenada con ceros hasta cumplir con su tamaño.
Como
ejemplo, consideremos un paquete de un mail (un mail de seguro
implicará muchísimos más paquetes, pero veamos uno). Encontraremos
en él una cabecera de unos 96 bits (32 bits de dirección origen, 32
bits de dirección destino, 8 para el protocolo, 16 para el número
de fragmento, y 8 para otros elementos, como ser el TTL), luego un
payload de 896 bits, y finalmente un trailer de 32 bits:
Basta
de teoría, pongamos las manos en la grasa
Ahora
bien, imaginemos lo que pasa cuando ejecuto algo tan sencillo como
ser un “ping”. En mi caso, ejecutaré, desde la máquina con
dirección IP 10.100.100.2, un “ping 10.100.100.1”, mientras que
ejecuto el programa “Wireshark” utilizando “sudo wireshark”,
ya que necesitaré de acceso de root a las interfaces de red.
A
continuación, la pantalla inicial de Wireshark al momento de ser
abierto, cuando presionaré el botón que me permitirá seleccionar
una interfaz de red, y comenzar a capturar paquetes:
NOTA:
El programa Wireshark es un analizador de protocolos de red
formidable. No es la idea de este artículo en particular el explicar
cómo funciona, si bien en próximas entregas se hará especial
hincapié en él, ya que en caso de problemas será una de nuestras
herramientas más espectaculares. Se puede instalar en nuestras
máquinas con “apt-get install wireshark”, “yum install
wireshark”, o “pacman -S wireshark-gtk”, dependiendo de si la
versión de sistema operativo es basada en Debian, en Fedora, o en
Arch GNU/Linux.
Entonces,
seleccionaré mi interfaz eth0, y la pondré a capturar paquetes:
Ejecutaremos,
en una terminal, “ping 10.100.100.1”:
hecsa@dshecsa01:~$
ping 10.100.100.1
PING
10.100.100.1 (10.100.100.1) 56(84) bytes of data.
64 bytes from
10.100.100.1: icmp_req=1 ttl=64 time=1.02 ms
64 bytes from
10.100.100.1: icmp_req=2 ttl=64 time=0.732 ms
64 bytes from
10.100.100.1: icmp_req=3 ttl=64 time=0.736 ms
64 bytes from
10.100.100.1: icmp_req=4 ttl=64 time=0.705 ms
64 bytes from
10.100.100.1: icmp_req=5 ttl=64 time=0.722 ms
^C
--- 10.100.100.1
ping statistics ---
5 packets
transmitted, 5 received, 0% packet loss, time 4001ms
rtt
min/avg/max/mdev = 0.705/0.784/1.027/0.124 ms
Luego
de unos segundos de ejecución del ping, presionaremos “Control+C”
para finalizar este programa, y veremos en la ventana de nuestro
Wireshark cómo han quedado logueada muchísima información, no sólo
de nuestro ping, sino de cualquier cosa que haya pasado por la
interfaz eth0:
Entonces,
seleccionaremos alguna línea que contenga la cadena “ICMP” y
“10.100.100.1”, para ver qué es lo que ha ocurrido.
Veremos
que en la sección intermedia aparecen varias subsecciones
desplegables que nos entregarán información de lo que ocurrió
cuando lanzamos el mencionado ping, en cada una de las capas donde
intervino:
- Capa 1: En esta capa nos mostrará lo que ha ocurrido a nivel eléctrico en el cable, y la interfaz de red en sí misma. Encontramos que se han enviado 98 bytes (784 bits), y los mismos han sido capturados en la interfaz “0”. El número de “frame” es el 126, lo que me serviría, en caso de problemas de red, para saber si ese mismo número llegó al sistema “10.100.100.1”, que es el destino de mi “ping”. No profundizaremos en lo que es y significa WTAP_ENCAP, u otros elementos de esta sección, ya que eso nos llevaría a meternos en el código de wtap.c, y no es la idea volveros más locos de lo que ya están.
- Capa 2: Si revisamos lo que más arriba vimos, la capa 2 es la que ya comprenderá lo que es una dirección MAC, y si asociamos eso con lo que vimos en el artículo anterior, sabremos que la dirección MAC tiene embebido un código que hace referencia al fabricante de cada una de las tarjetas de red intervinientes en la comunicación.
En
nuestro caso, la máquina de donde sale el paquete de red tiene la
dirección MAC 00:1f:c6:08:f5:7f, que se corresponde con una del
rango asignado a Asustek, y por eso es que el programa Wiresharek así
lo reconoce.
Por
otro lado, el primer punto que tocó el paquete de red fue un router
Cisco Linksys, cuya dirección MAC es la 00:21:29:77:b2:66. Eso
también lo podremos ver representado en esta parte de la pantalla.
Nótese
que en esta sección no hay más elementos que los dos que se
interconectan directamente. ¿Por qué? Si releemos la parte donde
explicamos las características de la capa 2, veremos que aún no
posee ningún elemento que nos permita ver todas las rutas utilizadas
para llegar de nuestro origen a nuestro destino, que es, en sí, el
equipo Cisco Linksys.
- Capa 3: En esta capa veremos a nuestro querido protocolo IP abrir sus alas con todo el esplendor, cual pavo real atrayendo a su pareja. A diferencia del pavo, con Wireshark podremos ver sus intenciones y contenido verdaderos, encontrando elementos que nos muestran las direcciones IP de origen, de destino, el tipo de protocolo (Internet Protocol Version 4), y otras tantas. Ya en este caso, nos muestra que el protocolo es el ICMP, que es el que se corresponde al “ping”. Nótese también quese han ejecutado pruebas en la cabecera del paquete de red, y se ha llegado a la conclusión de ser correcta.
- Elementos directamente relacionados con el “ping”: Veremos, en la siguiente parte de la misma sección, que se describe todo lo que ha ocurrido a nivel de ICMP, que es el protocolo que se utiliza cuando ejecutamos “ping”.
Conclusión
Ya
tenemos los elementos necesarios para entender claramente cómo
funciona una red de datos, así como contamos con algunas incipientes
herramientas que nos permiten determinar qué está bien y qué está
mal cuando algo falla.
En
las siguientes entregas nos adentraremos en comprender un poco más
de TCP/IP, motivo por el que tendremos que activar nuestras máquinas
virtuales para poder jugar un poco con los diferentes protocolos de
red.
Tendremos
la oportunidad de entender qué es lo que hacemos cuando configuramos
direcciones IP en nuestras máquinas, tanto desde el punto de vista
estático como dinámico, veremos qué es un ruteador predeterminado,
e infinitas cosas más que nos permitirán, cada día, conocer más
de lo que hacemos cuando hacemos, y cómo analizar una red con
conceptos bien sólidos.
¡Nos
vemos!
No hay comentarios:
Publicar un comentario