lunes, 11 de noviembre de 2013

Redes - Segunda Parte

Segunda parte de los artículos de redes publicados en la revista Tuxinfo #57.


Redes para las masas – Parte II


 

Introducción

En el artículo pasado comenzamos a estudiar algunos conceptos generales de comunicaciones. Entendimos qué es un emisor, un receptor, un mensaje, sus medios de difusión, y de una forma lo más humana y amena posible nos introdujimos en una de las formas de diferenciar las redes de datos según su topología física.

En esta nueva entrega, veremos cómo se diferencian según su alcance, y expondremos ejemplos que nos harán la vida un poco más sencilla sobre los distintos elementos de red que veremos en nuestra caminata por el mundo de las redes de datos.

Clasificación de redes de datos según su alcance

Cuando analicemos redes de datos según su alcance, tengamos en cuenta que salvo casos donde las diferencias son en extremo claras, hay varios en los que la frontera que existe entre las de un tipo y las del que le sigue en cuestión de distancias puede estar algo confusa. Es en estos casos en los que la tecnología utilizada para la interconexión de los sistemas de dicha red puede marcar la verdadera diferencia.

Habiendo salvado este punto, veamos cómo las redes se diferencian según su alcance.

  • Red de área local: Las redes de área local son también conocidas, dadas sus siglas en inglés, como “LAN” (Local Area Network). Originalmente se consideraba locales a las redes que interconectaban sistemas dentro de una misma sala, y en el mejor de los casos, en el mismo edificio. Pero el tiempo, y nuevos dispositivos de interconexión tales como bridges, repeaters, y otros tantos cambiaron este concepto para que primero se piense en extensiones de un kilómetro, y luego de más (las redes de fibra pueden llegar a los 200 Km, por ejemplo) en lo que a espacio físico entre sistemas conectados respecta. Éste es uno de los casos donde el tipo de interconexión y el direccionamiento IP puede marcar la verdadera diferencia. Más adelante veremos de qué se tratan estos conceptos.


  • Red de área ámplia: Este tipo de red, dadas sus siglas en inglés, es conocida como “WAN” (Wide Area Network). Sobre la distancia que puede cubrir aún hay acaloradas discusiones, ya que se pretende pensar en unos mil kilómetros de separación entre sistemas, pero como antes mencionamos, será el direccionamiento IP y la tecnología de interconexión lo que determine si la red es o no WAN. Si miramos la parte de atrás de nuestros modems de conexión a internet, notaremos que una de las bocas de red, específicamente la que nos conecta a Internet, tiene esta sigla. Eso se debe a que interconectan la red local de nuestra casa, o empresa, o sencillamente nuestra computadora, con Internet. En Internet el rango de direcciones IP será diferente al de nuestra LAN, así como de seguro los medios de interconexión utilizados. Es muy común que se haga uso de sistemas de interconexión públicos para este tipo de redes (red de telefonía, de televisión por cable, etc.).

  • Red de área personal: Como en los casos anteriores, su nombre derivado de sus siglas en inglés es “PAN” (Personal Area Network) y no tiene nada que ver con lo que usamos para hacer nuestros sandwiches. La idea de este tipo de redes es que interconecten dispositivos que están al alcance de una misma persona. Para clarificar el caso con un ejemplo, si tenemos un teléfono celular al que le deseamos conectar un auricular Bluetooth, la red establecida entre dichos dispositivos es considerada una PAN. Si queremos pensar en distancias y coberturas, lo que cubra nuestra voz (si te llamás Pavarotti o Marcel Marceau no estarás representado en este ejemplo) será la distancia que una red PAN podrá cubrir. En general, son inalámbricas.

  • Red de área local inalámbrica: De sus siglas en inglés recibe el nombre de “WLAN” (Wireless Local Area Network). Cuando las personas que implementaban redes de cobertura local se cansaron de cablear como locos edificios enteros, taladrar paredes para pasar cables, y colocar conectores en los lugares más inesperados (he llegado a ver conectores de red en baños, al lado de rollos de papel higiénico), descubrieron que si un locutor podía hacer pasar su ronca voz usando una onda de radio también podrían, ellos, pasar bits y bytes. Así nació la red inalámbrica de cobertura local.

Lógicamente, la frecuencia que se usa en el caso de las redes de datos es mucho mayor. También lo son los peligros a los que una red de este estilo está expuesta, ya que el tener ni más ni menos que el aire como medio de interconexión da la idea de tener conectores en cualquier lugar donde dicha onda llegue, permitiendo entonces a cualquier persona, lógicamente sin necesidad de contar con un cable, a conectarse a ella si posee el código o los conocimientos adecuados para hacerlo. Una de cal, y una de arena, como siempre. Para grandeza de males, todos los días se publican nuevos métodos para romper los sistemas de autenticación de este tipo de redes.


  • Red de área local virtual: Como antes, de sus siglas en inglés recibe el nombre de “VLAN” (Virtual Local Area Network). Ocurre que en una misma red física, aún cuando se encuentre en un único edificio, pueden coexistir diferentes redes lógicas. Si éste fuera el caso, tendríamos que multiplicar la infraestructura y por ende el cableado de red por cada una de las diferentes redes que deban montarse. Para bajar los costos de este tipo de conexiones, se pensó en virtualizar y separar desde un punto de vista lógico diferentes redes aún cuando sean transportadas por el mismo cable. Así nacieron las VLANs. Un uso muy común de las VLANs es la reducción del tráfico de red existente evitando el broadcast desmedido, y segmentando las redes de una determinada forma. Veremos un poco más de esto en futuros apartados sobre VLANs, como generarlas, y cómo aprovecharlas para mejorar el rendimiento de nuestras redes.

  • Red de área de almacenamiento: Sí, lo adivinaron. En inglés se denominan “SAN” (Storage Area Network). Cuando varios equipos distintos necesitaron conectarse a discos de determinadas características (generalmente asociadas a la robustez, la que como es de esperarse, conlleva que su elevadísimo valor llegue a millones de dólares, a menos que se haga uso de los artículos presentados en números anteriores sobre la forma de armar complejos sistemas de almacenamiento usando ZFS, de mi humilde autoría), se pensó en poner todos los discos en los mismos tipos sistemas de almacenamiento, y crear una serie de protocolos que permitan que las computadoras que los requerían los “perciban” como si fueran discos locales.

Dadas las elevadísimas velocidades de comunicación que se necesita en estos casos, es muy común ver que este tipo de redes, establecidas entre sistemas informáticos puros y otros de almacenamiento, estén montadas, como mínimo, con fibras ópticas. ISCSI (Internet SCSI) es un ejemplo de protocolo utilizado para interconectar sistemas de almacenamiento con computadoras.

  • Red privada virtual: Seguramente habrán escuchado algo sobre las “VPNs”. Esas son las siglas de “red privada virtual” en inglés (Virtual Private Network). Si un sistema, o red, se encuentra lógicamente separada de otra, y posee la capacidad de contactar a la segunda mediante protocolos de red comunes, se puede establecer una interconexión segura entre ellas. Pero esa interconexión, por ejemplo, si se hiciera a través de Internet, permitiría a cualquier persona que tenga un par de manuales leídos (ustedes también lo podrán hacer un poco más adelante en esta serie de artículos) mirar los paquetes de red (para ir acostumbrándonos al lenguaje técnico, este proceso se denomina “sniffing”) que están circulando en algo tan público como lo es, justamente, Internet, y entonces extraer información, en el mejor de los casos, o inyectarla, en los no tan afortunados. Entonces, se desarrollaron estándares y paquetes de software destinados a agregar, a la comunicación a establecer, un grado de criptografía (la criptografía es el arte de escribir con una clave secreta o de un modo enigmático) suficiente para generar una suerte de túnel de una red dentro de otra.

De esta forma, una persona externa a dicha red, que no cuente con los elementos necesarios para poder entender su tráfico verá impedida su malicia, y el usuario que sí lo requiera podrá trabajar conectado a la red de destino tal y como lo haría si estuviera con un cable directamente conectado a ella.

Ese es el concepto subyacente al establecimiento de redes privadas virtuales entre sistemas, muy difundido hoy en día gracias el ancho de banda disponible en una conexión hogareña, y a la simplicidad de implementación de este tipo de redes. El alcance de este tipo de redes es tan variado como las distancias que hay en Internet entre dos sistemas.

Ejemplos de protocolos de VPN son: IPSec (IP Security), SSL-VPN (Secure Sockets Layer Virtual Private Network), o PPTP (Point to Point Tunnel Protocol), cada una de ellas con una implementación en nuestro sistema operativo *nix favorito.
Hay muchos más tipos de redes, siempre que se las diferencie por su alcance, pero con las que enumeramos antes tendremos para divertirnos un buen tiempo, y podremos movernos holgadamente en la mayor parte de los casos que se nos presenten.

La pregunta para pensar: Tenemos un teléfono celular que se puede conectar a Internet, y a él conectado un auricular Bluetooth. Conectamos el celular a una red WiFi de un cybercafé. Levantamos un programa para usar servicios de voz sobre IP, como lo es Skype. Entonces, ¿a qué tipo de red estaría conectado el auricular Bluetooth? ¿La respuesta? Se la dejo a ustedes, mis queridos Padawanes.

Clasificación por tipo de transmisión

Las redes de datos podran transmitir en un único sentido, en forma alternada entre el emisor y el receptor, o en forma bidireccional. Es por eso que las comunicaciones, siguiendo este concepto, se pueden clasificar en:

  • Simplex: Tal como ocurre con una alarma sonora, que sólo maneja tráfico de información en un sentido (desde el emisor hacia nuestros oídos, generalmente dejándolos bastante doloridos, y alterando nuestros delicados nervios), existen casos donde se utiliza la comunicación unidireccional, y en un único sentido. Un ejemplo podría ser un programa que sólo funcione recibiendo mensajes de un servidor, para luego mostrarlos en una pantalla, y que no envíe ningún tipo de confirmación a dicho sistema.

  • Half Duplex: El caso de las comunicaciones Half Duplex es similar al de las Simplex, con la única diferencia de poder cambiar el sentido de la comunicación cuando sea necesario. Primero la comunicación viajará en un sentido, y luego en otro. Casi como si se tratara de una charla entre personas bien educadas. Uno habla y el otro escucha, luego el primero escucha, y el segundo habla. Todo va a ir bien hasta que se establezca el siguiente tipo de comunicación que veremos, que si no está bien orquestado normalmente se verá seguido por una notable escalada de violencia que puede terminar en pugilatos combates, y hasta participación de fuerzas del orden.

  • Full Duplex: En este tipo de comunicación, los datos viajarán en ambos sentidos al mismo tiermpo, casi como si se tratara de una autopista de dos manos, permitiendo que las velocidades, y también los errores, sean mucho mayores. Siguiendo el caso de la charla entre personas, veremos que es muy común en estos días encontrar gente que por cuestiones formacionales deficitarias, o sencillamente por una falta de limpieza en sus orificios auditivos no logran percibir que alguien les está hablando y se ponen a hablar sobre la primera voz. Alguien notó tan desagradable hecho, y decidió usarlo a su favor. A ese héroe debemos este tipo de comunicaciones.


Elementos de interconexión

En este apartado veremos algunos de los tantos elementos utilizados en la interconexión de equipos informáticos. Será gracias a estos elementos, algunos más inteligentes, elaborados, y caros que otros, que podremos diseñar un esquema de red acorde a las necesidades que se nos presenten.

Algunos de estos elementos de red son:

  • Tarjetas de red: Su sigla es “NIC”, gracias a “Network Interface Card”, su denominacion en inglés. Las tarjetas de red serán aquellos elementos que nos permitirán conectar nuestras computadoras a la red en sí misma. Las tenemos en diferentes sabores y colores: cableadas, de fibra óptica, inalámbricas, y un largo etcétera. Un ejemplo de tarjetas particular es la Ethernet, que conecta, en forma cableada, una computadora a una red. Para hacer esto, posee una dirección física única entre todas las tarjetas de red del mundo, denominada MAC por “Media Access Controller”, constituida por tres octetos de bits expresados en hexadecimal, y otros tres que refieren al número de tarjeta dentro de las generadas por ese fabricante. Si ejecutamos, en nuestras máquinas GNU/Linux el siguiente comando, podremos encontrar la dirección MAC:

hecsa@dshecsa01:~$ ip address show
1: lo: mtu 16436 qdisc noqueue state UNKNOWN
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0: mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 00:1f:c6:08:f5:7f brd ff:ff:ff:ff:ff:ff
inet 10.100.100.2/24 brd 10.100.100.255 scope global eth0
inet6 fe80::21f:c6ff:fe08:f57f/64 scope link
valid_lft forever preferred_lft forever

Veremos en la entrada correspondiente a eth0 que el campo “link/ether” posee el valor 00:1f:c6:08:f5:7f. Entonces, visitando la página http://standards.ieee.org/develop/regauth/oui/oui.txt podremos encontrar al fabricante de la tarjeta de red:

00-1F-C6 (hex) ASUSTek COMPUTER INC.
001FC6 (base 16) ASUSTek COMPUTER INC.
15,Li-Te Rd.,Peitou,Taipei 112
Taipei 112
TAIWAN, PROVINCE OF CHINA

Entonces, nuestra tarjeta de red habrá sido fabricada por la empresa Asus.

  • Repetidores: Un repetidor (“repeater”) es un dispositivo que recibe una determinada señal electrónica codificada en base a una norma preestablecida, la limpia de los posibles errores que pudiera contener, y la reenvía por otro conductor luego de haberla recompuesto, o regenerado.

La idea de un repetidor es la de poder enviar una determinada señal a una distancia mayor que aquella soportada por el medio de enlace que estemos utilizando. Para tener una analogía que nos suene algo más familiar, quienes vivan en lugares donde los canales de televisión deban ser repetidos por emisoras locales, tienen en sus manos un caso de un repetidor.

El canal local toma los programas, les quita la publicidad correspondiente a sus zonas de origen, luego le agrega las publicidades locales, y retransmite esos programas para ser vistos por los televidentes que viven en las zonas más cercanas.


  • HUB: Habiendo entendido lo que un repetidor es, nos preguntamos qué pasaría si intentáramos reenviar la misma señal que hemos recibido no por uno, sino por varios cables (u otro medio) conductores. Cuando hacemos eso, tenemos, a diferencia del caso anterior, un HUB. Como nos podremos imaginar, un HUB es un dispositivo, entonces, que tiene no dos sino varias bocas de red a las que se conectarán diferentes computadoras.

Hoy por hoy, el uso de HUBs está algo dejado de lado, ya que el sólo hecho de retransmitir por todas sus bocas de red el mismo conjunto de paquetes de información si bien ayuda porque interconecta de una forma muy económica dispositivos, también genera un tráfico de red innecesario, por ende degradando la velocidad y prestaciones de dicha red.

Para tener una analogía algo acuosa, vayamos al baño de un restaurant grande, que tenga varios lavatorios conectados al mismo caño proveedor de agua, y abramos varias canillas de una a la vez. La primera tendrá un chorro de agua de buen caudal, pero le segunda canilla bajará dicho caudal de ambas dos. Si abrimos tres el caudal se dividirá por tres, y así consecutivamente, hasta no alcanzar para lavarnos las manos.

Lo bueno de los HUBs es que su valor puede ser casi despreciable para cualquier bolsillo, son bien pequeños, y silenciosos. Otra vez, una de cal y una de arena.


  • Switches: Un switch de red puede verse casi como un HUB, con algunas sutiles diferencias que lo transforman en el elemento preferido a la hora de montar una red, inclusive una hogareña, dado su notable descenso de precios en los últimos tiempos. A diferencia del HUB, el switch no reenvía los paquetes de red hacia todas las bocas de red disponibles, sino que lo hace sólo hacia aquella a la que está conectada la dirección MAC que se desea contactar.

Como se podrán imaginar, es notable el descenso de paquetes de red que se envían y que nunca llegarán a un destino útil. Como también estarán pensando, el nivel de lógica que este tipo de dispositivos posee es más inteligente que el de su hermano menor, el HUB.

Tiene en cuenta más datos provenientes de la red, los almacena en alguna tabla interna, y los compara con los valores de los paquetes de red recibidos. La duda que de seguro estarán teniendo es sobre qué tipo de información se intercambia en una red, y si hay varios estratos de información que tener en cuenta a la hora de entablar una comunicación entre dos máquinas. ¿No estaban pensando en eso? No hay problema, lo mejor aún está por venir.


  • Bridges: Un bridge muchas veces puede confundirse con un switch, al menos en lo que a funcionalidad respecta. La idea de un bridge es la de contar con la inteligencia necesaria para analizar los paquetes de red que llegan en cada una de sus bocas, e interconectar diferentes LANs sin enviar paquetes por todas sus bocas, como lo hacen los HUBs.

Lo interesante de un bridge radica en que al recibir un paquete de red que contiene una determinada dirección MAC, considera que en la boca de red donde lo recibió estará, efectivamente, conectado el equipo que posee dicha dirección, y siempre que reciba un paquete de red cuyo destino sea esa dirección, sólo lo retransmitirá por esa boca, no otra. Nuevamente, vemos una inteligencia superior a la del HUB.

Es común ver bridges cuando se pretende interconectar las redes LAN de dos locaciones geográficamente separadas, utilizando por ejemplo equipos de radio con dos antenas.

El nombre de “bridge” nos da una idea de lo literal que es su analogía con un puente, que une dos partes de una misma ciudad para permitir que autos de un lado pueda llegar al otro.

  • Enrutadores: Un enrutador (“router” en inglés) es un dispositivo que permite interconectar redes LAN de DIFERENTES características en lo que a direccionamiento IP se refiere, así como que los paquetes de red provenientes de un lado lleguen en forma adecuada al otro. Si nos detuviéramos en esta parte de la definición pensaríamos en dispositivos similares a los switches o bridges.

El tema es que si bien una máquina puede tener un router predeterminado declarado, también puede tener otros que permitan el envío de paquetes a otras redes. Si éste fuera el caso, encontraría entonces la capacidad de analizar los paquetes de red sabiendo que si deben llegar a una red deben ir en un sentido que he declarado, pero si deben ir en un sentido que no tengo declarado, sencillamente utilizarán el router predeterminado, ya que es él quien sabe para qué lado debe enviar los paquetes de red.

Lo más común es tener declarado un determinado enrutador, y que él se ocupe de manejar los envíos y recepción de todos los paquetes de red, tal como lo hace un controlador aéreo de una torre de control de un aeropuerto.

En nuestras máquinas podemos ver cuál es la tabla que rige las rutas que nuestros paquetes de red tomarán ejecutando el comando:

hecsa@dshecsa01:~$ netstat -nr
Kernel IP routing table
Destination Gateway Genmask Flags MSS Window irtt Iface
0.0.0.0 10.100.100.1 0.0.0.0 UG 0 0 0 eth0
10.100.100.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0
169.254.0.0 0.0.0.0 255.255.0.0 U 0 0 0 eth0

Observemos por un segundo esta sencilla tabla de rutas. Veremos resaltada la entrada que hace referencia al destino “0.0.0.0”, que simboliza todos los destinos para los que no se haya declarado específicamente una ruta. Eso quiere decir que si quiero enviar un paquete de red a cualquier lugar que no tenga una dirección IP del estilo “10.100.100.x”, lo enviaré a través de la dirección 10.100.100.1. Entonces, el enrutador predeterminado será ese, el 10.100.100.1, que sabe qué hacer con los paquetes de red para que lleguen a destino.

La pregunta que les hago entonces es la siguiente: ¿el enrutador predeterminado que tengo en mi tabla, tiene también declarado un enrutador predeterminado en su tabla? ¿Por qué?


  • Cortafuegos: El nombre cortafuegos seguramente no signifique mucho para muchos, pero sí el término inglés “firewall”. La idea del firewall, cuyo nombre deriva de la industria automovilística (un “firewall” es un separador entre el motor y el habitáculo que impide que un posible incendio nos enrule el flequillo si estamos dentro del rodado) es la de separar diferentes redes permitiendo sólo el paso de determinados paquetes de red, hacia un determinado destino, y desde determinados orígenes. Los hay muy variados, de diferentes caracteristicas, mejores y peores.

Lo cierto es que GNU/Linux, *BSD y OpenIndiana poseen, incorporados en sus núcleos, versiones excelentes de firewalls que nos permitirán dormir en paz al menos en lo que a acceso a los recursos de red refiere. En ellos podremos declarar reglas que funcionan como si fueran derechos de admisión de paquetes de red.

A quienes se lo preguntan, no nos hemos olvidado de los cables, pero eso pertenece a un mundo tan vasto que tendremos que explorarlo en un apartado especial sólo para eso, que a continuación se despliega.

Cableados varios

Veremos en este apartado algunos de los métodos más comunes de interconexión de redes de datos utilizando cableados, sea cual fuere su característica o naturaleza.

  • Cableado de par trenzado: Este tipo es muy antiguo, pero aún así de los todavia más usados en la industria. Se conoce como “Twisted Pair” por su traducción al inglés. Un par trenzado consta de dos conductores de cobre trenzados uno sobre el otro en forma helicoidal. Se preguntarán el motivo de tan bonito trabajo al hacer una trenza con los conductores, y la respuesta radica en que si analizamos el comportamiento de dos conductores de cobre cuando se colocan en paralelo, estaremos en presencia de una hermosa antena. Y el problema de tener delante una antena es que lo que justamente no queremos es interferencia cuando estemos comunicando sistemas informáticos. Cuando los conductores se trenzan de la forma que lo están en el cable de pares trenzados, cualquier señal por ellos generada es automáticamente cancelada. Las conexiones cableadas de par trenzado pueden desplegarse en distancias de varios kilómetros, luego de los cuales el uso de un repeater se hace necesario si no queremos perder paquetes de red.
El ancho de banda que este tipo de conexión pueda transmitir dependerá en gra medida del largo del conductor, del tipo de aislamiento que posea, y demás factores constructivos.

Según sus características constructivas, podemos encontrar varios tipos de cables de pares trenzados diferentes, como ser los de tipo 3, más antiguos y entonces con soporte para velocidades menores, y los de tipo 5, o tipo 5 especial, que permitirán por ejemplo el uso de redes del tipo gigabit ethernet. Lo que normalmente diferencia a un tipo del otro es la forma en la cual se han trenzado los conductores, que será mucho más densa en el caso de las velocidades mayores.

Muchas veces escucharemos de este tipo de tecnología también como “UTP”, que se corresponde con la sigla en inglés para “Unshielded Twisted Pair”, o par trenzado sin apantallado (se le dice apantallado a una cobertura exterior que un cable posee y que permite eliminar interferencias).


  • Cable coaxil: El cable coaxil es algo así como el dinosaurio de los cableados, pero siempre nos sorprende con una nueva aplicación. Está normalmente mejor aislado y construido que el de par trenzado, lo que permite que cubra distancias y velocidades mayores. Típicamente se usan dos tipos de cable coaxil: uno que tiene una impedancia de 50 ohms (el más común, y utilizado en muchas implementaciones) y el de 75 ohms. Los que tengan conexión a Internet por medio del cable de la TV podrán ver que tienen un coaxil completamente funcional.

  • Fibras ópticas: La fibra óptica es una clara muestra de cómo la evolución de las comunicaciones le ganó a la de los procesadores. Mientras que los procesadores crecen en potencia a razón de veinte veces por década, las comunicaciones lo hacen a razón de cientoveinticinco veces, bajando su nivel de error de 0,0001 a aproximadamente cero.

Es en este campo donde juega su papel fundamental la fibra óptica, que no es más que un filamente extremadamente delgado y delicado de fibra de vidrio que transmite haces de luz entre dos extremos. Un transceptor (dispositivo que transforma un medio en otro) convierte los pulsos eléctricos en haces de luz, los que viajan por la fibra a elevadísimas velocidades para impactar en otro transceptor que convierte haces de luz en pulsos eléctricos.

Dado el valor de las redes de fibra óptica, notablemente mayor que las de cobre, es común ver que en edificios donde hay varios pisos que cablear se distribuya la red de piso en piso con fibra óptica, y dentro del mismo piso con cables de cobre, a menos que se trate de interconectar servidores que requieran de elevados usos de la red, en cuyo caso también se hace llegar la fibra óptica hasta ellos.



Las fibras ópticas se pueden clasificar a la vez en dos grandes grupos:

  • Multimodo: Las fibras multimodo usan equipamiento de red más barato que las monomodo, y pueden cubrir distancias de por ejemplo unos 550 metros sosteniendo una velocidad de 10 Gbps. El filamento de este tipo de fibra es más grueso que en otros casos, por lo que el equipamiento para darle soporte no debe ser tan preciso, bajando también los costos por ese lado, ya que pueden usar LEDs (diodo emisor de luz, o “Light Emiter Diode”) especiales para emitir el haz de luz.
  • Monomodo: Las fibras monomodo son extremadamente delgadas, y por lo tanto también delicadas, y por su pequeño diámetro no soportan el uso de LEDs para emitir haces de luz, requiriendo un laser en su lugar. Este tipo de fibra puede transportar sólo un haz de luz por filamento, cubriendo distancias de 80 Km a una velocidad de 10 Gbps. Es muy común que se usen estas fibras para interconectar sistemas de almacenamiento ubicados en sitios de contingencia, o para armar clústers de alta disponibilidad distribuidos geográficamente.

Rápidas convenciones

Un punto fundamental a tener en cuenta es la velocidad de cada tipo de red. Nos habremos maravillados al ver la velocidad de las redes de fibra óptica, pero es muy posible que no entendamos bien la diferencia entre un caso y el otro.

Para denominar las velocidades de las redes se suelen usar valores basados en la cantidad de “bits por segundo” que ella puede transmitir. A no confundirnos con “bytes por segundo”, ya que el número es notablemente distinto.

Normalmente, los “bits por segundo” se escriben “bps”, y los “bytes por segundo” “B/s”.

Entre las medidas más usadas encontramos las siguientes:

  • Kbps: Kilobits por segundo, lo que es mil bits por segundo (1 Kbps = 1000 bps).

  • Mbps: Megabits por segundo, lo que es un millón de bits por segundo (1 Mbps = 1000000 bps).

  • Gbps: Un gigabit por segundo equivale a mil millones de bits por segundo (1 Gbps = 1000000000 bps).

  • Tbps: Aún no tenemos redes que soporten este inmenso tráfico, pero para evitar tener que reescribir este artículo dentro de un par de años, les comento que equivale a un billón de bits por segundo, usando el término latino del billón, y no el norteamericano, referido a “mil millones” (1 Tbps = 1000000000000 bps).

Comparando velocidades

Para que tengamos una rápida idea de las diferentes velocidades de cada tecnología de red, les paso un listín de referencia.

  • Red digital de servicios integrados: Conocida por su nombre en inglés como “ISDN” (Integrated Services Digital Network). Su velocidad llega, según se trate de simple o dual, a los 64 ó 128 Kbps. Es un estándar de transmisión de voz, video, datos, y otro tipo de información sobre circuitos tradicionales “PSTN”. PSTN es la sigla de “Public Switched Telephone Network”, o red de telefonía pública conmutada. Sencillamente se usaba la red de teléfonos para transmitir algo más que la voz de un ser humano.

  • Tramas T1/DS1: Llega a los 1,54 Mbps. T1 es una especificación de hardware para redes troncales, y un troncal es un canal de transmisión simple entre dos puntos, o dos dispositivos. Uno de esos dispositivos podría ser un teléfono, por ejemplo. Antes de la existencia de las tramas T1, un conductor sólo podía transportar una llamada telefónica, o un flujo de datos, pero con la llegada de la tecnología digital, este tipo de tramas logró hasta 24 llamadas al mismo tiempo, o la suma de sus anchos de banda para comunicaciones de datos.

  • Ethernet 10 base T: Llega a los 10 Mbps. Allá en el año 1980 Michael Jackson entrenaba pasos de baile exótico para el video de Thriller, y algunos científicos de la empresa Xerox (sí, la de las fotocopiadoras, y la creadora del entorno de ventanas “X”) sentían sus estómagos crujir porque el invento de unos cinco años antes (1975) ya esataba comercialmente en la calle. Para los que quieran cablear sin caer en la desesperación, les dejo una figura que define de forma bien sencilla los colores de los cables, y la forma de armar un cable que se conecte a un switch (Ethernet Patch Cable), así como de uno que conecte una máquina a otra, sin switches en el medio (Ethernet Crossover Cable):


  • Ethernet 100 base T: Ídem, pero con velocidades de 100 Mbps.

  • Red óptica sincrónica: Sus siglas son “SONET” y llega a los 155 Mbps (159252,48 Mbps, para ser precisos). Es un estándar de fibras ópticas que permite manejar una jerarquía de señales, entonces definiendo para cada escalafón su velocidad máxima.

  • Gigabit Ethernet y Fibra óptica: Llega a 1 Gbps, y vienen en sabor de cobre (Ethernet) y vidriado (fibra óptica). La diferencia entre una y otra tecnología es que la de cobre es más barata, pero también mentirosa, porque el rendimiento de una red de cobre a esas velocidades si logra un 65% del Gbps, podremos sentirnos los reyes del cableado.

  • Fibre Channel: Claramente se trata de una fibra óptica cuya velocidad llega a los 2, 4, 8 ó 16 Gbps. Se simboliza como “FC” por su nombre en inglés, y si bien su desarrollo comenzó en 1988 (Guns N' Roses sacaba en ese año el disco “Sweet Child O' Mine”), se estableció como estándar recién en 1994 (Brian Adams sacaba, para delicia de los que nos gustaba abrazar chicas en las fiestas, el tema “Please Forgive Me”, que tantas alegrías me ha dado).

  • Infiniband: Esta belleza parte con su norma de los 2 Gbps (Infiniband SDR 1.x), pero llega a los 300 Gbps (Infiniband EDR 12.x), aparte de contar con estrategias de interconexión más integradas al hardware destino que las demás redes. Si hay que armar un clúster de alta performance, es la elegida. Nació de una serie de proyectos del año 1999 (en ese momento yo me estaba rompiendo los cuernos para entender si mis máquinas se transformarían en el anticristo por efectos del año 2000), y en el año 2010 comenzó a ser utilizado para interconectar CPUs.



  • 100 GE: Este nombre proviene de “100 Gigabit Ethernet”, y si bien anuncia la capacidad de transmitir a esa velocidad, es interesante ver cómo se puede tostar un pollo si decide caminar cerca de un cable de esta tecnología. Consideremos que el mensaje de esta nueva tecnología es que puede sostener dicha velocidad en distancias de 40 Km.


Conclusiones

Espero que para este momento se sientan más cómodos con algunas de las tantas nomenclaturas y tecnologías existentes. Me encantaría volcar más de lo que en mis años de trabajo con diferentes redes de datos he tenido la suerte de utilizar, pero no quiero aburrirlos. Sigan enredándose, nos vemos en el artículo que viene, con mucho más de redes de datos.




Redes - Primera Parte

Este documento fue publicado en la revista Tuxinfo, número 56, y es la primera parte de un tutorial de redes de datos para las masas... 


Redes para las masas – Parte I



Introducción


 

Con este artículo comenzamos una serie de entregas destinadas a explicar de una forma sencilla y amena los aspectos más importantes de las redes de datos que nos permiten hoy en día interconectar nuestras computadoras.

Comenzaremos analizando conceptos de comunicación en general, luego veremos aspectos básicos de redes, construiremos una red en nuestras máquinas, explicaremos TCP/IP, revisaremos cuestiones atinentes a la seguridad de una red de datos, implementaremos servidores y clientes, y haremos prácticas que nos permitirán afianzar todo lo aprendido.

Dentro de los materiales que usaremos estarán:

  • Una PC con un procesador por lo menos de dos nucleos, 2 GB de memoria RAM, y mínimamente 50 GB de espacio libre en disco, o lo que tengamos a mano para ejecutar un sistema operativo GNU/Linux, un software de virtualización, y por lo menos dos máquinas virtuales también GNU/Linux.
  • Si en lugar de lo anterior contamos con dos o tres máquinas que puedan ser reinstaladas completamente sin llorar luego por los rincones, también nos sirve.
  • Software de virtualización Oracle© VirtualBox para la arquitectura de procesador que estemos utilizando (32 o 64 bits). Si usaremos varias máquinas físicas, no lo necesitaremos.
  • Distribución Debian GNU/Linux que se puede bajar desde la página de Debian (http://www.debian.org).
  • Nuestros pobres y cansados cerebros.

Dicho lo anterior, comencemos con las redes de datos.


Conceptos generales de comunicaciones

Hoy en día palabras tales como “globalización” y “estándar” suenan bastante vanguardistas. Lo cierto es que los esfuerzos por globalizar comenzaron mucho antes de lo que imaginamos, y casi me animaría a pensar en que la vida misma los trajo consigo.

Imaginemos un hombre prehistórico, y sus esfuerzos por comunicarse con los de su especie. Tantas fueron sus ganas de compartir información que debió crear con los pocos elementos de que disponía un estilo gráfico que pueda ser reconocido por otros, y hasta ajustar los sonidos que emitían sus poco dominadas cuerdas vocales para que sean comprensibles por otros. Fijó un estándar llamado lenguaje, y lo compartió con los demás. Planteó un método de difusión del nuevo estándar, y abrió su código lo suficiente para que llegue lo más lejos posible.

Claro que este esfuerzo no ocurrió sólo en un lugar del planeta, y por ello hoy en día tenemos varios idiomas, algunos muy parecidos y otros muy diferentes, dada su raíz y zona de desarrollo y evolución.

El ánimo de compartir información forma parte de la naturaleza del ser humano, y la historia del mundo puede dar fe de ello. Primero fue el arte rupestre, luego lenguajes primitivos, siguió su evolución y las tradiciones orales, entonces llegó la letra escrita, los medios mecánicos de comunicación, los eléctricos, y ahora los electrónicos. Como sea, la tendencia humana fue, es y será la misma. Por suerte.

En un proceso de comunicación existen ciertos elementos que se repiten, sin importar la tecnología que se use en cada caso. Ellos son:

  • Un emisor
  • Un receptor
  • Un mensaje
  • Un medio para transportar dicho mensaje


Y el proceso de comunicación en sí mismo implica, según los expertos, ocho pasos fundamentales que podremos asociar a cualquier caso:

  • Desarrollo de una idea o contenido: Este es el paso que en cierta forma le da sentido al proceso de comunicación. Sin el contenido, la comunicación carecería de sentido.
  • Codificación: El contenido se debe convertir a un formato que sea comprensible tanto para el emisor como para el receptor. Si yo le hablo en español a un ruso, en contenido no llegará, o llegará notablemente distorsionado. A nivel de máquinas, si dos de ellas no utilizan un protocolo de comunicaciones común a ambas, no existirá la comunicación.
  • Transmisión: Se elegirá para enviar el mensaje ya codificado un canal de comunicaciones que resulte accesible a todas las partes intervinientes en este proceso, y se evitarán las interferencias lo más que se pueda, justamente para garantizar la integridad del contenido.
  • Recepción: Independientemente de la herramienta utilizada, el mensaje debe ser recibido por alguien. Ojos, oídos, o un proceso son ejemplos de receptores de información codificada.
  • Decodificación: El mensaje recibido debe ser decodificado para ajustarse a los patrones cognocitivos del receptor. En el caso de un mensaje encriptado, se deberá utilizar un conjunto de claves previamente distribuidas, para luego poder leer lo que el mismo contiene.
  • Aceptación: Ya con el mensaje recibido y decodificado, el receptor podrá enviar una aceptación del mismo, para que se sepa que lo ha recibido.
  • Uso: El contenido recibido será utilizado para algo. Puede ser para saber que debemos encontrarnos para salir todos juntos, o para que se almacene un archivo, por citar ejemplos.
  • Retroalimentación: La retoalimentación se compone de un mensaje que el receptor entrega al emisor para saber que el mensaje se ha recibido, se ha decodificado, aceptado, y se ha hecho uso de su contenido.


De estos conceptos podemos, como es esperado, hacer analogías tanto con la comunicación verbal, diaria, como con la que existe entre los sistemas informáticos.

Redes de datos

La primer red de computadoras (no electrónicas) fue desarrollada por matemáticos que colocaron unas cuerdas en sus ábacos para que los cálculos de uno se transmitieran a los demás. Ahora, un buen tiempo después, las computadoras y sus redes han evolucionado lo suficiente como para no usar cuerdas. Ahora utilizamos conductores metálicos, o el mismo aire para transmitir nuestros mensajes.



Eso nos lleva al siguiente concepto: una red no es más que dos o más computadoras conectadas entre sí para intercambiar información. En gran parte, los medios de interconexión son cables metálicos, pero en otros pueden ser fibras ópticas, o el mismo aire, como pasa con las redes WiFi, por citar sólo un ejemplo.

Ahora bien, sólo con el hardware no se llegaría muy lejos. Necesitamos también software que permita que la comunicación se haga efectiva. Para citar una analogía con la comunicación verbal, si emitimos sonidos usando nuestro propio hardware, que es nuestra garganta, pero no hay un software, que es nuestro poder de raciocinio, que lo acompañe, la comunicación no tendrá lugar, o no habrá nada que comunicar.

En los albores de la informática las máquinas no estaban directamente interconectadas. Hoy en día, no concebimos siquiera que nuestro teléfono no esté interconectado a ciertas redes de datos.

Todas las redes, sin importar su tamaño, poseen determinados bloques constitutivos que veremos representados en porciones de hardware o de software, según el caso del que se trate. Estos bloques son:

  • Computadoras o proesos cliente: Las máquinas que usamos generalmente para acceder recursos existentes en una red se denominan clientes. Este concepto no está restringido sólo a computadoras enteras, ya que en una misma máquina podemos encontrar procesos cliente de otros servidores. Un ejemplo de este caso sería una aplicación basada en tecnologías web que usemos en nuestra propia máquina, o una aplicación que utilice una base de datos para funcionar. En el primer caso, de seguro nuestro navegador será un proceso cliente de un servidor Web (¿apache, quizá?) alojado en nuestra misma máquina, y en el segundo, la aplicación será un cliente del servidor de bases de datos.
  • Computadoras o procesos servidores: Las computadoras o procesos que ofrecen recursos a los clientes se denominan servidores. Por ejemplo, en el caso anterior, el servidor web apache es, valga la redundancia, un proceso servidor. Análogamente, cuando le hacemos una pregunta a alguien, nosotros somos clientes del conocimiento de quien es preguntado. El será nuestro servidor.
  • Interfaces de red: Las interfaces de red serán los componentes que permitirán a las máquinas conectarse a una red de datos. Cuando trabajamos dentro de nuestra propia máquina es muy común que usemos una interfaz llamada “loopback”, que si bien ahora está implementada como una porción de software, en los principios estaba constituida por un conector que se ponía en algún puerto de nuestras máquinas, y que tomaba las señales de salida de ellos para reingresarlas. Por eso “loop”, y “back”. Ejemplos de interfaces de red son Ethernet, Fiber-Channel, WiFi, etc.
  • Medios de conexión: En el caso de las redes cableadas, este medio puede ser un conductor de cobre, o una fibra óptica, y en el caso de las redes inalámbricas, puede ser el aire (WiFi, Vsat, etc.).
  • Sistemas de interconexión: Las redes de datos necesitan sistemas que interconecten sus componentes. Puede tratarse de hubs, switches, routers, puntos de acceso, modems, y un largo etcétera que será cubierto en esta serie de artículos.
  • Software de red: Tal como antes mencionamos, la red tal como la conocemos no sería tal si sólo se pensara en el hardware. Sin el conjunto de programas que permiten que los ocho pasos del proceso de comunicación antes analizado se hagan efectivos, no existiría la comunicación.

Ya tenemos una idea formada de los bloques que construyen una red, ahora vamos a ver cómo podríamos clasificarlas.

Marcando las diferencias

No sólo los pescadores tienen diferentes tipos de redes según el pez que quieran retirar del río o mar. Otros pescados más estudiosos de las redes de datos decidieron diferenciarlas según varios conceptos. Así las dividieron según su alcance, por el tipo de conexión, por su topología física (o el dibujo que representan en nuestras cabezas), por el sentido de dirección de sus datos, y mucho más. No es la idea de estos artículos enloquecernos con la epistemologia de las redes de datos, pero sí estar listos para entender lo que un experto puede decirnos con cara de “éste no me va a entender” (una paradoja, si hablamos de comunicación, ¿no?)

Las redes se clasifican, según su topología física en las siguientes:

  • Red de bus: La red de bus es aquella que posee un única canal o troncal por medio del cual se transmiten los datos interconectando todos los dispositivos. Las antiguas redes armadas con cables coaxiles (o BNC, por Bus Network Connection) utilizaban esta topología. Sus ventajas radican en que sólo se requiere de un cable para interconectar todas las máquinas, lo que simplifica su despliegue en un edificio, por ejemplo. Sus desventajas son el límite de equipos que se pueden conectar en un único canal, la degradación de la señal que puede existir (si todos hablan al mismo tiempo en una misma habitación, será más complicado escuchar a la persona que quiere hablar con uno mismo), el límite de longitud que se puede tener en un único canal, y la baja tolerancia a fallas, ya que sólo se requiere un problema en un cable para que todas las máquinas de la red dejen de comunicarse. Detectar el lugar donde la red está abierta, recuerdo, me trajo bastantes dolores de cabeza en su momento.


  • Red en anillo (o “ring”, por su traducción al inglés, y por tener que soportar el equivalente a un puñetazo de Mike Tyson cada vez que hay que detectar un error en ellas): Es la topología en la que cada computadora está conectada con la inmediatamente siguiente, y con la anterior, mediante dos conectores: uno de entrada, y otro de salida. Si un paquete de red es enviado a una máquina que está a “tres máquinas” de la nuestra, dicho paquete debe pasar por todas las máquinas hasta llegar a la de destino, que enviará su respuesta, la que recorrerá todas las demás máquinas hasta llegar a la original. Entre sus ventajas encontramos que el tiempo de acceso a los datos es el mismo en todas las máquinas, y que el rendimiento de la red no cae según se conecten más máquinas al anillo. Entre sus desventajas, encontraremos que la longitud del canal nuevamente está limitada por la tecnología, que si se rompe una parte del canal hay que aislar máquina por máquina hasta tanto se encuentre el problema, y que si eso ocurre, se pierde la conexión en todas las máquinas de la red.


  • Red en estrella (algunas redes tienen estrellas, y otras están estrelladas, que no es lo mismo): La red en estrella es aquella en la que todas las máquinas están conectadas a un punto central que las comunica a todas con todas. Su arquitectura es análoga a una estación de trenes, donde cada tren tiene su propia vía por la que circular, evitando así choques entre sus formaciones. Casi siempre se mantiene así. Como todas las conexiones se realizan a través de este punto central, ninguna máquina está conectada directamente a otra, como pasaba en los casos de bus o anillo. Ejemplos de puntos centrales son los hubs, switches, o routers, de los cuales hablaremos luego. Entre sus ventajas encontramos que un problema de conexión en una máquina no se propaga a las demás, su capacidad de agregar equipos a la red de forma muy simple, y su bajísimo costo de mantenimiento. Entre sus desventajas encontramos que si el punto central tiene un problema, la red entera falla (esto se ha solucionado a través de esquemas de alta disponibilidad de red), y que requiere un tendido de cables más complicado y por ende costoso que en los casos anteriores (se debe tender un cable de red desde el punto central hasta cada uno de las máquinas de la red), entre otros.


  • Red mallada: En este tipo de redes cada máquina está directamente conectada a todas y cada una de las demás máquinas. Suena casi como una teoría imposible de cumplir con realidades tecnológicas, pero más adelante veremos que Internet en sí es una red de este estilo, y que estándares tales como “OSPF” permiten su uso. Este tipo de red no necesita de un nodo central, por lo que las tareas de mantenimiento de la red misma se reducen notablemente. Entre sus ventajas encontramos que las máquinas contarán con un buen nivel de redundancia en los enlaces, ya que si alguno se cae, podrá utilizar otro conjunto de enlaces pasando por otras máquinas para llegar a destino, también entregando un servicio de características ininterrumpidas. Entre sus desventajas encontramos que el agregado de cada máquina a la red puede ser un verdadero problema, y que el ancho de banda disponible para cada máquina puede verse afectado cuando el número de máquinas aumenta. La red “Totalmente Conexa” es una variante de este tipo de red que interconecta a todas sus máquinas, sin dejar a ninguna con conexiones inexistentes hacia otra.


  • Red en árbol: No tiene que ver con que siempre está colgada, o que es una tecnología verde, a no llorar si se es vegetariano. Es una topología de red que conecta a sus máquinas en forma de árbol, permitiendo una estructura jerárquica de nodos. Los nodos más consultados se colocarán en la parte más angosta del árbol, colocando varias estrellas en cada una de las partes más frondosas de él. Hay quienes la consideran una de las versiones de las redes mixtas, pero como a los seres humanos se nos da bien eso de clasificar y catalogar todo, hemos creado un tipo de red para ella. Entre sus ventajas encontramos que sus segmentos se pueden conectar en forma muy sencilla, y que en ella los problemas se pueden detectar sin mayores dolores de cabeza. Entre sus desventajas encontramos que su cableado puede ser bastante complicado, y hasta engorroso, si la cantidad de estrellas aumenta en forma indiscriminada. Pero es ésta la topología más utilizada en las redes corporativas grandes ya que, como se podrán imaginar, el que un servidor, siempre más accedido que una estación de trabajo, pueda encontrarse en un segmento más liberado, entonces con menos colisiones (ya veremos qué son las colisiones), mejora su respuesta.


  • Red mixta: Cualquier combinación de todas las topologías anteriores, y que funcionen, claro está, será considerada por los clasificadores como una red mixta. Sencillo, al menos en este caso.

Ahora, un bonito cuadro para resumir todas las redes de datos de las que hemos hablado:




Conclusiones

Por esta entrega, ya hemos tenido material como para volvernos un poco locos. Y como nada es gratis en esta vida, los invito a pensar en los ejemplos que tienen más cerca, ya sea en sus empresas, como en sus casas, e intentar descifrar qué topología física les parece que la misma posee. Luego, piensen en las relaciones que tienen en su vida cotidiana, y hagan lo mismo. Piensen en la TV, el teatro, la radio, el chat, una charla con vuetros amigos o con uno solo, en un discurso político, y demás. Enrédense.







lunes, 9 de julio de 2012

Boys say GO!!!


Boys say Go!


Ya desde hace aproximadamente unos cinco años que la gigante empresa Google comenzó a trabajar en un nuevo lenguaje de programación. Desde 2007, al menos, tenemos noticias del desarrollo del lenguaje Go. Y desde fines del 2011 sabemos que está suficientemente estable como para darle una oportunidad en nuestras máquinas. En este artículo vamos a meternos un poco en las generalidades del lenguaje Go 1, y quién nos dice, quizá en los próximos podamos jugar un poco más con él.

Generalidades

En un anuncio de fines del año 2009, Google anunció la existencia de las primeras versiones beta del lenguaje de programación Go, autoproclamándose como rápido, productivo, y divertido para los desarrolladores. El concepto de “diversión de desarrolladores” me dejó algo preocupado. Los otros dos tampoco pasaron desapercibidos por mi cabeza.

En ese momento Goggle describió al lenguaje Go como experimental, y un intento de combinar la velocidad de trabajo de lenguajes dinámicos como lo es Python, con los niveles de performance que se pueden encontrar en C/C++. Cuando leemos las opiniones de algunos miembros del “Go team”, encontramos opiniones que lo ponen como “compilable en pocos segundos” y “veloz casi como el C/C++”.

Los que hemos tenido el gusto de trabajar con Java sabemos lo que eso significa, y cómo nuestros ojos se pueden llenar de lágrimas con el sólo hecho de pensar que la promesa de perfomance se cumpla de una vez por todas. Y si aparte hemos trabajado con Perl, Python ó Ruby, nos corre un frío por la espalda de pensar en términos de simplicidad de programación.

Según la literatura nativa del gigante de las nubes, el mundo ha cambiado radicalmente en términos de computación en la última década, pero no han emergido nuevos lenguajes de programación que los acompañen. Por ejemplo, la capacidad de procesamiento de las máquinas se ha multiplicado de forma exponencial, hecho no acompañado por un decremento en los tiempos necesarios para programar dichos sistemas.

Es cierto que la gente de sistemas lentamente (o no tanto) comenzó a dejar los leguajes de programación fuertes como lo son C/C++ y Java en favor de los interpretados como son Python y Javascript.

Por lo tanto, Go nace como respuesta a la creciente frustración generada en torno de los lenguajes y entornos de programación existentes, dado que la programación se ha vuelto en extremo complicada, así como la elección del lenguaje de programación adecuado para cada tarea. Dicha elección se debía basar en simplicidad en la programación versus rapidez en la compilación versus ejecución eficiente, no existiendo una combinación de las tres en un mismo lenguaje.

Go intenta cubrir el gap existente entre la simplicidad de programación existente en un lenguaje interpretado y dinámico con la eficiencia y velocidad de uno estático, del estilo de los compilados.

Algo de historia

Robert Griesemer, Rob Pike y Ken Thompson comenzaron a pensar en las bondades de este nuevo lenguaje de programación allá por el 21 de setiembre del 2007, cuando acá en Argentina estábamos festejando la primavera, y allá en USA estaban sintiendo los primeros fríos de otoño, y oían el ruido de empresas como Lehman Brothers que comenzaban a decir que tenían algunos problemitas económicos.

En unos pocos días los objetivos planteados se transformaron en un plan de desarrollo de una solución, y mejor aún, ya se sabía aproximadamente cómo debía ser esa solución. Claro está, en ese momento aún todo era una promesa, por lo que se trabajaba part-time en ese proyecto, mientras que se seguía con las tareas habituales.

En enero del 2008 Ken trabajó en un compilador sobre el cual volcar y explorar las ideas que se habían plasmado un tiempo atrás. Ese compilador ya generaba código C en su salida. Pero las cosas comenzaron a ponerse más jugosas para mediados del 2008.

En ese momento las acciones de Lehman Brothers habían bajado un 75%, AIG anunciaba que no podía seguir brindando seguridad para los fondos de inversión en USA, se veía en el horizonte una nueva crisis económica de dimensiones bíblicas, y en Google el proyecto se había vuelto de tiempo completo. Así es, todo el team comenzó a trabajar en forma intensiva en la generación del lenguaje de programación Go.

En mayo del 2008, IanTaylos de forma independiente comenzó a trabajar en un front end de GCC para Go usando el borrador de las especificaciones existentes. Para finales de ese mismo año, se unía al proyecto Russ Cox para ayudar a mover el proyecto del estado de prototipo al de realidad.

Así, Go se volvió público el 10 de noviembre del 2009, momento desde el cual mucha gente de diferentes comunidades contribuyeron con ideas, discusiones, y por supuesto, código.

De todo este proceso, obtuvimos un lenguaje nuevo, cuya sintáxis puede tener algo de parecido a C, pero con una intensa lavada de rostro, y alguna que otra cosa que nos hará la vida miserable a la hora de la depuración, como lo es la declaración del tipo de una variable luego de su nombre. Si antes pensábamos en “int x”, ahora debemos imaginar un “x int”.

Ah, también obtuvimos una mascota que es, desde mi humilde punto de vista, espantosa. La idea de ese bicho inmundo, dibujado por un niño que nunca la ha visto, con lápices gastados, y bajo los claros efectos de drogas pesadas, me deja pensando sobre la verdadera capacidad de la gente de marketing de Google. No entiendo cómo algunas cosas les salen tan bien y otras tan mal. Pero bueh, esta vez la gente de IT se llevó todas las rosas. Como debe ser, qué tanto.



Ni chicha ni limonada

Go es y no es un lenguaje orientado a objetos. Si bien tiene tipos y métodos y permite un estilo de programación orientada a objetos, no posee una jerarquía de tipos. El concepto de “interface” de Go provee un aspecto bastante diferente del que posee Java, por ejemplo, ya que se consideró desde el momento del diseño que como ahora está sería mucho más fácil de usar, y de una u otra forma, mucho más general.

Así y todo tenemos formas de embeber tipos dentro de otros tipos, logrando un comportamiento similar (nótese que digo similar, y no igual) al que tendrían las subclases. Luego, los métodos en Go son más sencillos que en C++ o Java, ya que se pueden definir para cualquier tipo de datos, aún para los incorporados en el mismo lenguaje.

En sí, en elementos como estos, o como los referidos al manejo de interfaces en general, funciones y métodos, o dispatch automático de método, vemos el intento de Google por generar un lenguaje de programación que simplifique muchas de las cosas que hoy en día nos molestan en otros lenguajes.



Empecemos

Sé que ya les debe estar picando el cuerpo por las ganas de probar este lenguaje de programación. Si no es así, hay médicos y otros dealers que pueden ayudarlos. Entonces vamos a ver cómo instalamos el lenguaje Go en nuestras máquinas, y comenzamos a hacer de las nuestras.

Lo primero será entender que tenemos dos tipos de compilador Go: uno llamado “gc”, independiente, y otro llamado “gccgo”, que apunta a ser parte del proyecto GCC. Duerman tranquilos, porque si ejecutan “yum search gccgo”, o “apt-cache search gccgo”, no van a encontrar nada.

Según dice Google, gc es más maduro y está mejor probado que gccgo. Por lo tanto, iremos por la primer opción.

Recordemos que para poder instalar gc nuestro sistema deberá poseer FreeBSD 7 o superior (al día de la fecha Debian GNU/kFreeBSD no está soportado), Linux 2.6.23 o superior con glibc (CentOS, RHEL, o sus derivados en versión 5 no están soportados, así como las distribuciones para ARM), MacOS X 10.6/7 (utilizando el gcc que obtenemos con Xcode), o Windows 200 o superior (usando mingw gcc, obviamente).

Bajaremos entonces el paquete correspondiente a nuestra distribución desde el URL http://code.google.com/p/go/downloads/list, lo descomprimiremos y destarearemos en /usr/local, y agregaremos los valores de este nuevo path a nuestras variables de entorno:

# cd /usr/local
# tar zxvf /home/hecsa/Downloads/go1.0.2.linux-amd64.tar.gz
...
$ vi .bash_profile
(agregar estas líneas)
export GOROOT=/usr/local/go
export PATH=$PATH:$GOROOT/bin
(salvar el archivo)
$ . ./.bash_profile
$ which go
/usr/local/go/bin/go

Listo, el prolongado proceso de instalación del lenguaje Go 1 ha llegado a su fín. Sencillo, ¿no?



La hora de la verdad

Como siempre, un programador no puede jactarse de serlo si no ha escrito su primer programa, es decir, el tan afamado “Hola, mundo!”. No podemos ser menos en este caso, así que aquí vamos:

$ vi hola.go
(agregar este contenido)
package main
import "fmt"
func main() {
fmt.Printf("Hola, mundo!\n")
}
(salvar el archivo)

Y como es de esperar, lo ejecutamos con el comando “go run”:

$ go run hola.go
Hola, mundo

Ahora bien, lo primero que me vino a la mente cuando ví este tan elaborado programa en base al cual se erigen cursos enteros de varios meses de duración fue analizar hasta dónde lo comentado por Google era o no real, y para eso, decidí armar dos programas más, también una nueva demostración de increíbles niveles de desarrollo por mi parte humildemente.

El primero es en C nativo:

$ vi hola.c
(agregar estas líneas al archivo)
#include
main()
{
printf("Hola, mundo!\n");
}
(salvar el archivo)

Y lo compilo con el GCC, pero utilizando el comando “time” antes, veremos para qué en breve:

$ time gcc -o hola hola.c
real 0m0.775s
user 0m0.085s
sys 0m0.079s

Como uno de los puntos de comparación es el lenguaje de programación Java, no quiero dejar de comparar el nivel de performance frente a un programa altamente elaborado como el que estamos escribiendo aquí.

Entonces, escribo su equivalente en Java:

$ vi HolaMundo.java
(agrego estas líneas al archivo)
class HolaMundo
{
public static void main(String args[])
{
System.out.println("Hola, mundo!");
}
}
(salvo el archivo)

Y lo compilo con el JDK 1.7.0_05 de Oracle:

$ time javac HolaMundo.java
real 0m2.020s
user 0m2.826s
sys 0m0.143s

Como el código de Go puede también compararse con un código interpretado (en palabras de los mismos desarrolladores, se lo compara en simplicidad con Python), he decidido armar el mismo código avanzadísimo, el “Hola, mundo!”, pero en Python:


$ vi Hola (nótese la mayúscula para diferenciarlo del programa en C)
(agregar estas líneas)
#!/usr/bin/python
print "Hola, mundo!"
(salvar el archivo)
$ chmod +x Hola

Ahora ha llegado la hora de la verdad. Ejecutaremos cada uno de los tres “Hola, mundo!”, y veremos el tiempo que significa para un mismo sistema:

$ time go run hola.go
Hola, mundo!
real 0m0.521s
user 0m0.433s
sys 0m0.074s

$ time java HolaMundo
Hola, mundo!

real 0m0.234s
user 0m0.138s
sys 0m0.040s

$ time ./hola
Hola, mundo!

real 0m0.003s
user 0m0.000s
sys 0m0.003s

$ time ./Hola
Hola, mundo!

real 0m0.077s
user 0m0.055s
sys 0m0.018s

Como podemos ver, el programa en C es por lejos una mejor opción para este tan elaborado ejemplo. Pero no olvidemos una pequeña trampa: nosotros nunca hemos compilado el programa en Go. Por lo tanto, si queremos ser justos, al menos en un primer momento, y con un razonamiento casi irracional, tendríamos que sumar los tiempos. Entonces:

Go:

real 0m0.521s
user 0m0.433s
sys 0m0.074s

C:

real 0m0.003s + 0m0.775s = 0m0.778s
user 0m0.000s + 0m0.085s = 0m0.085s
sys 0m0.003s + 0m0.079s = 0m0.082s

Java:

real 0m0.234s + 0m2.020s = 0m2.254s
user 0m0.138s + 0m2.826s = 0m2.964s
sys 0m0.040s + 0m0.143s = 0m0.183s

Python:

real 0m0.077s
user 0m0.055s
sys 0m0.018s

¿Es posible extraer una conclusión de esto? Sí, pero muy vaga: C es por lejos más rápido que Go, y ni que hablar que Java. La relación en tiempos de ejecución es de 1 a 180, aproximadamente. A Java directamente lo dejamos fuera de este partido, juega en otra liga, mucho más lenta, por supuesto. PERO, si consideramos que Go contempla también dentro de su entorno el interpretar el código, vemos que Python aún es más rápido que Go en una relación de 1 a 7.

Obviamente, no es esto lo que hay que evaluar en un lenguaje de programación, ya que estamos de acuerdo que escribir, por ejemplo, una página web utilizando C va a llevarnos notáblemente más tiempo que 0.778 segundos, así como dudo que podamos armar un driver en html.

Pero bueno, son las primeras pruebas que ejecuto, y son reales.

Conclusión

En este artículo hemos entregado sólo una breve reseña de lo que es el lenguaje de programación Go 1, y hemos hecho una despiadada demostración de genialidad de desarrollo al adentrarnos en complicadísimos algoritmos dignos de la más avanzada bibliografía (no se lo crean, por favor). En futuros números podremos ponernos a sacarle un poco más de jugo a este nuevo lenguaje, viendo para qué es bueno, y qué podemos hacer con él. ¡Hasta pronto, amigos!
Y recuerden: “Don't say no, boys say Go!”

Hernán “HeCSa” Saltiel
AOSUG leader
CaFeLUG Member
Boca happy fan
Club Amigos de Pumper Nic


PD: El título de este artículo y su frase final se refieren a un tema musical antiquísimo de Depeche Mode que se puede escuchar aquí, en su excelente versión en vivo en Londres, año 1986: http://www.youtube.com/watch?v=qVAUOxveuvc