XMPP & BOSH

6 01 2011

Si estás leyendo esto seguro que alguna vez has utilizado un “chat”. Los encontramos de las maneras más variadas, desde simples chats de dos personas (punto a punto se podría llamar), en páginas webs con decenas de personas, el ya bastante obsoletillo IRC, el malvado MSN Messenger…. alguno incluso habrá infectado a alguien con un troyano el cual trae una herramienta de chat para hablar con tu víctima. Como ves, existen infinidad de herramientas y cada una con sus normas y sus características. Hoy voy a hablar de un sistema potente, estándar y sobre todo libre. Hablo de XMPP.

¿Qué es XMPP y por qué usar XMPP?

En informática un protocolo son una serie de normas para que dos máquinas sean capaces de entenderse. Esto nos da la posibilidad de que dos (o más) máquinas (o programas dentro de una máquina) puedan compartir información, dialogar entre ellas, discutir y llegar a acuerdos, etc. Sí, las máquinas hablan entre ellas, y mucho. Son unas cotorras, lo que pasa es que no nos damos cuenta. Nosotros sólo vemos el resultado de toda esa “burocracia” entre máquinas. Cuando dos máquinas conocen el protocolo son capaces de trabajar conjuntamente pero si una usa un protocolo extraño pues le costará encontrar otras máquinas con la que trabajar.

Ahora un símil entre protocolo cerrado y abierto con la realidad sería el siguiente. Quieres aprender un idioma, vas a una escuela donde te dan unas clases pero tienes la posibilidad de ir a la biblioteca pública y tomar libros para aprenderlo mejor. También puedes buscar por internet e incluso preguntar a gente que gustosamente te ayudará. En resumidas cuentas, nadie te pondrá trabas a que aprendas ese idioma. En cambio, si quieres aprender un idioma pero para conocerlo tienes que entrar en una secta y no hay ningún libro ni persona fuera de esa secta que habla sobre el idioma pues lo vas a tener bastante complicado. Esto equivale a un protocolo cerrado.

Quizá te ronda por la cabeza que ¿Quién en su sano juicio querría usar un protocolo cerrado? Pues en su sano juicio supongo que muy pocos pero el problema es que los usamos sin saberlo (la ignorancia, ese gran arma de los “poderosos”). Como estamos hablando de protocolos de mensajería instantánea les voy a poner un ejemplo de este tipo que seguro que conoces: MSN Messenger. Es un protocolo cerrado y sucio. También si te hablo de uno que usa XMPP igual te suena, GTalk. Podría iniciar una guerra diciendo lo malos que son los de Microsoft y lo bien que me caen los de Google pero eso ya para otro día.

Una duda que puede surgir es que si el protocolo de MSN Messenger es cerrado, ¿Cómo hay tantos programas libres ajenos a la secta que lo “entienden”? En informática esto se llama ingeniería inversa. Consiste en capturar mensajes y volver a enviarlo, observar qué pasa y al cabo de muchas horas ir comprendiendo cómo funciona. Un símil sería como irte a china sin saber nada de chino. Con el tiempo acabarás aprendiendo el idioma (que remedio) relacionando palabras que dicen con acciones que hacen luego. Nunca aprenderás chino como si te explicaran la gramática y todo eso, pero acabarás aprendiendo lo suficiente como para manejarte.

Requiere de mucho más tiempo comprender un protocolo de esos que hacer un programa que use el protocolo. De ahí que sea tan importante que el protocolo sea libre, que a nadie le gusta perder el tiempo.

Todo esto de poner facilidades para que los demás te entiendan puede llevar a otra cuestión. ¿Y si no quiero que nadie sepa lo que estoy comunicando? Por ejemplo, yo no quiero que sepan lo que hablo con la gente. Me alegra que me hagas esa pregunta!
Eso no forma parte del protocolo sino del canal. No voy a explicarlo porque no viene al caso pero la solución es usar un canal seguro que en resumidas cuentas en cifrar la información. He de decir que el que un protocolo sea cerrado no es sinónimo (ni mucho menos) de seguridad. La información viaja intacta. Mientras el protocolo cerrado de microsoft es totalmente inseguro (ya que no va cifrado) el XMPP siendo libre es totalmente seguro ya que sí va cifrado. Esto lo demostramos un día cuando crackeamos un wifi y sabíamos lo que hablaba por el messenger. Eso con xmpp no hubiera sido posible). Creo que han quedado explicados los puntos “Qué es” y “Por qué usarlo”. Pasemos a centrarnos en XMPP.

Cómo funciona XMPP

XMPP funciona a base de enviar XML. XML es una manera estándar de enviar información y que a día de hoy está hasta en la sopa aunque, de nuevo, no nos damos cuenta. Por ejemplo, el HTML (lo de las páginas web) es XML. Voy a explicar brevemente como va esto del XML (es realmente sencillo)

<cosa atributo1=valor1>Cotenido</cosa>

la palabra “cosa” se denomina tag e indica el tipo de elemento que es. El resto de campos son bastantes intuitivos. Un ejemplo real de mensaje XMPP sería el siguiente:

<message from="mylatia@gmail.com" to="prueba@gmail.com">Hola, ¿que tal?</message>

Sobra explicarlo pero esto envía un mensaje de “mylatia@gmail.com” a “prueba@gmail.com” con el contenido “Hola, ¿que tal?”

En XMPP existen 3 tipos de elementos diferentes: message, presence e iq

  • Message: Son los mensajes que se envían los usuarios entre sí.
  • Presence: Los eventos de presencia de usuarios. Cuando se desconectan o conectan, cuando cambian de estado, de nombre….
  • Iq: Sirve para enviar comandos internos. Por ejemplo para iniciar una nueva conexión, informar de errores y cosas que no tienen nada que ver con los usuarios.

Pero antes de poder conectarte te tienes que conectar, verdad? Eso se hace al principio (qué listo) y en este proceso el cliente y el servidor negocian a través del protocolo cómo se sincronizarán, el cifrado que usarán y todas esas cosas.

En el título comentaba algo de BOSH. Eso de BOSH es una pasarela para poder establecer una conexión a un servidor XMPP desde HTTP. Esto es necesario por lo siguiente.

  • XMPP es una conexión persistente. Se mantiene la conexión desde el principio hasta el final, y mientras se envían todos los mensajes que quieran.
  • HTTP es una conexión de petición y respuesta. Esto es que tu te conectas y haces una petición. El servidor responde y se termina la conexión.

Con este método haces una petición y estas a la espera de que el servidor responda y en ese momento lanzas otra. Hay otro método (polling) que consiste en enviar muchas peticiones cortitas (cada medio segundo por ejemplo) pero personalmente prefiero la primera.
Esta tarea requiere de una pequeña sincronización. Esta sincronización se hace mediante un numerito que le pasamos en cada petición y que se debe ir incrementando después de cada respuesta NO vacía, luego explico que es eso.

Siempre debemos tener una conexión abierta hacia el servidor. Podemos conectarnos al servidor de dos maneras:

Enviando una petición nuestra (por ejemplo queremos enviar un mensaje a un contacto) o escuchando (nos quedamos escuchando al servidor hasta que nos diga algo).
Sólo podemos tener dos conexiones abiertas y en caso de abrir una tercera o un numero de sincronización incrementado incorrectamente provocada que finalice la sesión (el servidor nos llama violadores y nos manda de paseo).
Voy a explicar qué es un mensaje vacío y la relación que tiene con el número de sincronización. El numerito en cuestión se llama RID y debe ser generado de manera aleatoria. Es importante tener un buen algoritmo que genere un número lo más difícil posible de precedir ya que teniendo el RID junto al SID (un numero que identifica la conexión y se crea en ese momento) alguien podría hacerse pasar por nosotros ya que si envias un SID y un RID correcto la cosa va a funcionar (al ser por HTTP el servidor no tiene manera de conocer de dónde viene la petición). Describo un ejemplo.

Inicio sesión y estoy a la escucha de un mensaje del servidor. Estoy usando una conexión.
Decido que a mi amigo “Prueba” quiero saludarle así que le escribo “Hola”. Esto genera un objeto message que se envía al servidor. En este instante estoy usando dos conexiones. Si se me ocurre enviar otra cosa el servidor nos cerrará sesión y adiós muy buenas. Lo que se debe hacer en este momento es cerrar la primera conexión, que devolverá un mensaje vacío. Entonces NO tenemos que incrementar el RID.
Nuestro amigo Prueba nos responde diciendo “Eyyyy” y el servidor nos lo hace saber, creando un message y a través de la conexión creada nos lo envía. Como dije antes, en HTTP una vez recibida la respuesta se finaliza la conexión. En este momento debemos lanzar una petición para escuchar pero como sí recibimos un mensaje incrementamos el RID. Si no lo hacemos ya sabes lo que pasa. Remarco que mensaje no es lo mismo que message. Message es un tipo de mensaje como también lo es presence o iq.

Esa es la parte complicadilla. Conceptualmente no es complejo ni mucho menos pero crear un algoritmo pues ya tiene algo de dificultad. Si te interesa saber más hay un plugin jQuery (en javascript) y que en apenas 200 líneas es capaz de manejar ese protocolo y facilitar manejadores de eventos que hiso mi amigo Maxpowel.

Gracias a Maxpowel.

Anuncios




Que hacer después de instalar Fedora 13

17 07 2010

Por si no lo sabes y te acabas de instalar Fedora 13 Goddadrd o cualquier otra distribución de Fedora y quieres comenzar a utilizarlo, es que no trae por defecto los codecs necesarios para la reproducción de música o video en formato privativo (mp3, wma, avi, mp4, etc) ya que es una distribución libre y no los incluye, pero no te preocupes, ya que todos esos detalles se pueden instalar aparte y en esta guía te diré como.

Antes que nada lo primero que debes hacer es actualizar el sistema. Actualizar es muy importante para el correcto desempeño del sistema. Aunque yo lo que hago antes de actualizar es instalarme estos 3 Plug-Ins  que me facilitan más la tarea (NOTA: Puedes instalarlos al comenzar como hago yo o instalar después del update).

Plug-Ins de YUM

Tienes que instalarlos desde una termina (En KDE SC esta en Lanzador de aplicaciones > Aplicaciones > Sistema > Terminal) se identifican como root y listo.

Fastest Mirror
Hará que descargue los paquetes desde los mirrors más rápidos.

yum -y install yum-plugin-fastestmirror

Download Order
Con este plugin YUM descargará los paquetes de mayor tamaño a menor tamaño.

yum -y install yum-plugin-download-order

LangPack
Nuevo plugin en Fedora13 que detectará automáticamente el idioma que tengas y al momento de instalar alguna aplicación que disponga de múltiples paquetes de idioma, instalará automáticamente el indicado que uses.

yum -y install yum-langpacks

Update mediante YUM

Ahora, ya puedes actualizar el sistema a través de cualquier interfaz gráfica o también desde la terminal (en lo personal me gusta más la Terminal) accedemos a ella en KDE Lanzador de aplicaciones > Aplicaciones > Sistema > Terminal.

Deberás identificarte como root y posteriormente actualizar con yum:

su
yum update

Una vez que tengas el sistema actualizado a lo último, tendrás que reiniciar.

Una vez reiniciado en Fedora abre la terminal como hicimos en el primer paso, ahora si pasamos a  personalizarlo instalando aplicaciones, repositorios, cambiando configuraciones, etc.

Repositorios

Estos repositorios no deben faltarte ya que nos permitirán instalar aplicaciones y codecs mas adelante.

RPM Fusion
Este repositorio básicamente contiene todo lo que quieres: códecs no libres de audio y vídeo, drivers privativos de vídeo, y un montón de aplicaciones actualizadas en sus versiones más recientes.

Desde la terminal ejecutando el siguiente comando:

rpm -Uvh http://download1.rpmfusion.org/free/fedora/rpmfusion-free-release-stable.noarch.rpm  http://download1.rpmfusion.org/nonfree/fedora/rpmfusion-nonfree-release-stable.noarch.rpm

KDE RedHat
Si utilizas este entorno de escritorio y te gusta mucho creo que no te puede hacer falta este repositorio.

yum -y install wget
wget http://apt.kde-redhat.org/apt/kde-redhat/fedora/kde.repo  -O /etc/yum.repos.d/kde.repo

Adobe
Si vas a instalar el plugin de flash para algún navegador web, necesitarás este repositorio instalado para obtener el paquete.

rpm -ivh http://linuxdownload.adobe.com/adobe-release/adobe-release-i386-1.0-1.noarch.rpm

Drivers gráficos

Nvidia
En este blog encontraras como instalarlo. Clic Aqui

ATI
Lamentablemente el equipo de ATI no ha sacado aun la versión para Fedora 13, así que a esperar.

Mesa drivers

Es un paquete que contiene drivers experimentales que mejorarán el rendimiento gráfico de tu tarjeta sea NVIDIA o ATI. Realmente a mi no me ha dado problema alguno y consigo un desempeño optimo de mi tarjeta recomiendo su utilización si no pueden instalar el driver propietario.

Comando para instalación desde terminal:

yum -y install mesa-dri-drivers-experimental

Códecs

Los tan famosos códecs por los cuales no puedes reproducir tus mp3 XP, llego la hora de instalarlos. Recuerda instalar los códecs respectivos a tu entorno gráfico (Gnome o KDE) y ya podrás reproducirlos sin problemas.

Comando para KDE

yum -y install xine-lib-extras xine-lib-extras-freeworld

Comando para Gnome

yum -y install gstreamer-plugins-bad gstreamer-plugins-bad-free-extras gstreamer-plugins-bad-nonfree gstreamer-plugins-ugly gstreamer-ffmpeg

Soporte para reproducción de DVDs cifrados
Si deseas reproducir DVDs cifrados necesitarás instalar diversos paquetes extra.
Comandos necesarios a ejecutar:

yum -y install libdvdread libdvdnav

Arch x86:

rpm -ivh http://rpm.livna.org/repo/13/i386/libdvdcss-1.2.10-1.i386.rpm

Arch x86_64:

rpm -ivh http://rpm.livna.org/repo/13/x86_64/libdvdcss-1.2.10-1.x86_64.rpm

Permisos (sudo)

Activa sudo y permite a tu usuario realizar tareas administrativas.

echo 'user  ALL=(ALL)  ALL'  >> /etc/sudoers

Sustituyendo user por tu nombre de usuario.

Aplicaciones y utilidades

Aquí listo algunas de las aplicaciones que siempre suelo instalar y que son muy recomendables.

Flash Plugin
Primero debiste agregar el repositorio de adobe, en la sección repositorios esta como agregarlo y ejecutamos:

yum -y install flash-plugin

Unrar y p7zip
No podrás extraer ficheros .rar ni .7z si no instalas estos paquetes, así que hazlo.

yum -y install unrar p7zip p7zip-plugins

Java OpenJDK
Complemento libre de Java para poder ejecutar aplicaciones creadas en éste.

yum -y install java-1.6.0-openjdk

Firefox
A mi parecer uno de los mejores navegadores de internet.

yum -y install firefox

Multimedia

Amarok
Uno de los mejores reproductores de música para GNU/Linux.

yum -y install amarok

Exaile
Reproductor muy versátil para Gnome, bastante práctico.

yum -y install exaile

VLC
Reproductor de infinidad de formatos de vídeo.

yum -y install vlc

MPlayer
Es uno de los reproductores de video más poderosos del mundo del software libre.

yum -y install mplayer smplayer'

Inkscape
Una de las herramientas vectoriales esenciales para el diseño en Linux.

yum -y install inkscape

Gimp
Sin duda la mejor opción libre a Photoshop de Adobe.

yum -y install gimp

OpenOffice
La mejor suite ofimática para GNU/Linux, tu mejor alternativa para MS Office. Compatible con todos los formatos.

yum -y install openoffice.org-writer openoffice.org-impress openoffice.org-calc

Hasta aquí esta guía personalizada que les comparto para aquellos que son nuevos o no tan nuevos y que desean el máximo rendimiento de su Fedora.

De todos modos, aquí les dejo un enlace a una de las mejores guías por si sienten que les falta algo, estoy seguro que aquí lo encontraran. Fedoreando – Post-Instalacion Fedora 13.

Saludos.