# Extensible Messaging and Presence Protocol

Extensible Messaging and Presence Protocol, más conocido como XMPP (Protocolo extensible de mensajería y comunicación de presencia) (anteriormente llamado Jabber), es un protocolo abierto y extensible basado en XML, originalmente ideado para mensajería instantánea.
Con el protocolo XMPP queda establecida una plataforma para el intercambio de datos XML que puede ser usada en aplicaciones de mensajería instantánea. Las características en cuanto a adaptabilidad y sencillez del XML son heredadas de este modo por el protocolo XMPP.
A diferencia de los protocolos propietarios de intercambio de mensajes como ICQ, Y! y Windows Live Messenger, se encuentra documentado y se insta a utilizarlo en cualquier proyecto. Existen servidores y clientes libres que pueden ser usados sin coste alguno.
Tras varios años de su existencia, ha sido adoptado por empresas como Facebook, WhatsApp Messenger y Nimbuzz, entre otras, para su servicio de chat.
Google lo adoptó para su servicio de mensajería Google Talk, y en 2013 anunció que lo abandonaría en favor de su protocolo propietario Hangouts.

## Historia

Jeremie Miller comenzó el proyecto Jabber en 1998. Su primera liberación de software importante sucedió en mayo de 2000. El principal producto del proyecto era jabberd, un servidor XMPP.
Este protocolo XMPP inicial creó las bases para el XMPP, publicado como RFC 3920. A menudo, ha sido considerado competidor de SIMPLE, basado en el protocolo SIP, como protocolo estándar de mensajería instantánea y notificación de presencia.
En agosto de 2005, Google introdujo Google Talk, una combinación de VoIP y sistemas de gestión de identidades que usa XMPP para sus funciones de mensajería instantánea y como base para su protocolo de señalización de transferencias y su sistema de voz. El lanzamiento inicial no incluía comunicaciones de servidor a servidor, pero el 17 de enero de 2006, fueron añadidas. Desde este año existió cerca de una media docena de implementaciones de servidores XMPP, escritos en diferentes lenguajes de programación.
Jabber Software Foundation fue renombrado como XMPP Standards Foundation el 15 de enero de 2007.

## Ventajas
### Descentralización

    La arquitectura de las redes XMPP es similar a la del correo electrónico; cualquiera puede poner en marcha su propio servidor XMPP, sin que haya ningún servidor central.

### Estándares abiertos

    La Internet Engineering Task Force ha formalizado el protocolo XMPP como una tecnología de mensajería instantánea estándar, y sus especificaciones han sido publicadas como los RFC 3920 y RFC 3921. El desarrollo de esta tecnología no está ligado a ninguna empresa en concreto y no requiere el pago de regalías.

### Historia

    Las tecnologías XMPP llevan usándose desde 1998. Existen múltiples implementaciones de los estándares XMPP para clientes, servidores, componentes y bibliotecas, con el apoyo de importantes compañías como Sun Microsystems y Google.

### Seguridad

    Los servidores XMPP pueden estar aislados de la red pública XMPP, y poseen robustos sistemas de seguridad (como SASL y TLS). Para apoyar la utilización de los sistemas de cifrado, la XMPP Standards Foundation pone a disposición de los administradores de servidores XMPP Autoridad de certificación en xmpp.net ofreciendo certificados digitales gratis.

### Flexibilidad

    Se pueden hacer funcionalidades a medida sobre XMPP; para mantener la interoperabilidad, las extensiones más comunes son gestionadas por la XMPP Software Foundation.

## Desventajas
### Sobrecarga de datos de presencia

    Típicamente cerca de un 70% del tráfico entre servidores son datos de presencia, y cerca de un 60% de estos son transmisiones redundantes. Actualmente se están estudiando nuevos protocolos para aliviar este problema.

### Escalabilidad

    XMPP también sufre el mismo problema de redundancia en los servicios de chatroom y de suscripción. Actualmente se está trabajando en su solución.

### Sin datos binarios

    XMPP es codificado como un único y largo documento XML, lo que hace imposible entregar datos binarios sin modificar. De todas formas, las transferencias de archivos se han solucionado usando otros protocolos como HTTP. Si es inevitable, XMPP también puede realizar transferencias codificando todos los datos mediante base64.

## Descentralización y direccionamiento

La red XMPP está basada en servidores, pero descentralizada; por diseño, no hay ningún servidor central, como sucede con servicios como AOL Instant Messenger o MSN Messenger. Sobre este punto, surge cierta confusión, puesto que existe un servidor XMPP público en "Jabber.org", al que están suscritos un gran número de usuarios, pero no hay que olvidar que cualquiera puede poner en marcha su propio servidor. El puerto estándar utilizado para XMPP es el 5222.
Cada usuario en la red XMPP tiene un único identificador (Jabber ID, normalmente abreviado como JID). Para evitar la necesidad de un servidor central con una lista exhaustiva de identificadores, el Jabber ID está estructurado como una dirección de correo electrónico, con un nombre de usuario y una dirección DNS para el servidor en el que reside el usuario, separado por un signo @. Un identificador Jabber sería algo como nombredeusuario@dominio.com.
Como un usuario puede querer identificarse desde distintos lugares, el servidor permite al cliente especificar una cadena de referencia conocida como recurso, que identifica el cliente que está utilizando el usuario (por ejemplo: casa, trabajo, portátil, etc.). Esto será incluido en el JID añadiendo un carácter / seguido del nombre del recurso. Cada recurso debe tener especificada un valor numérico de prioridad. Por ejemplo el JID completo de la cuenta del trabajo del usuario sería: nombredeusuario@dominio.com/trabajo. Los mensajes de la forma nombredeusuario@dominio.com serán dirigidos al cliente con mayor prioridad, y los de la forma nombredeusuario@dominio.com/trabajo serán dirigidos al cliente del trabajo.
Los JID sin la parte del nombre de usuario también son válidos y se utilizan para enviar mensajes de sistema y control.

## Proceso de entrega de mensajes

Supongamos que julieta@capulet.com desea chatear con romeo@montague.net. Julieta y Romeo tienen sus respectivas cuentas en los servidores capulet.com y montague.net. Cuando Julieta escribe y envía su mensaje, entra en acción la siguiente secuencia de eventos:
* El cliente de Julieta envía su mensaje al servidor capulet.com.
** Si el servidor capulet.com no tiene acceso al servidor montague.net , el mensaje es desechado.
* El servidor capulet.com abre una conexión con el servidor montague.net.
* El servidor montague.net entrega el mensaje a Romeo.
** Si el servidor capulet.com no tiene acceso al servidor montague.net, el mensaje es desechado.
** Si Romeo no está conectado, el mensaje es guardado para su posterior entrega.

## Conectando a otros protocolos

Otra característica muy útil del protocolo XMPP son las pasarelas, que permiten a los usuarios el acceso a redes con otros protocolos de mensajería instantánea como MSN Messenger, ICQ u otros tipos de mensajería como SMS o Correo electrónico. Este servicio no es proporcionado desde el cliente, sino desde el servidor mediante servicios de pasarela que proporcionan conectividad con alguna otra red. Cualquier usuario se puede registrar con alguna de estas pasarelas proporcionando sus datos de acceso a la nueva red como nombre de usuario y contraseña, y comunicarse con los usuarios de la nueva red. Esto significa que cualquier cliente XMPP puede ser usado para acceder cualquier red para la que haya una pasarela, sin necesidad de adaptar el cliente o de que tenga acceso directo a Internet.

## XMPP y HTTP

Gran parte de los cortafuegos están configurados para permitir el paso del tráfico TCP dirigido al puerto usado por el protocolo HTTP, mientras que por lo general se bloquea el puerto utilizado por XMPP. Para solucionar este problema, XMPP utiliza HTTP para permitir el acceso a los usuarios que se encuentran tras cortafuegos. En las especificaciones originales, XMPP podía utilizar HTTP de dos formas:
* Polling: Ya no está en uso, básicamente se trataba de utilizar las funciones 'GET' y 'POST' de HTTP para enviar los mensajes al servidor a intervalos de tiempo regulares.
* Binding: Con este método, el cliente utiliza conexiones HTTP de vida más larga para recibir los mensajes tan pronto como son enviados. Este modelo es más eficiente que el de polling.
Existen algunos servidores públicos que escuchan en los puertos estándar HTTP y HTTPS, permitiendo la conexión mediante XMPP desde detrás de la mayoría de los cortafuegos.

## Pasarela

Las pasarelas o transportes (del inglés transport) son un servicio ofrecido por diversos servidores que permiten la interoperabilidad de la red XMPP con otros protocolos de mensajería instantánea (como los empleados por Windows Live Messenger, Yahoo! Messenger, AOL Instant Messenger, ICQ, etcétera).Para ello es necesario registrarse a este servicio en el servidor XMPP que lo ofrezca. Esto no hace necesario disponer de una cuenta en este servidor, ya que muchos de ellos permiten la suscripción a cualquier JID.

## Clientes

Algunos clientes que implementan el protocolo XMPP son:
* Dino: Cliente de XMPP basado en GTK+, programado en Vala. Se centra en brindar una interfaz de usuario integrada con el sistema, moderna y limpia. Actualmente está disponible para sistemas GNU/Linux y soporta encriptación OMEMO y GPG. El programa es distribuido bajo los términos de la licencia GNU GPL.
* iChat: Cliente de Mensajería instantánea incluido en el Sistema operativo OS X de Apple.
* Freelab messenger : Cliente de Mensajería instantánea para el Sistema operativo Android con comunicación cifrada
* Jabbear: Cliente de Mensajería instantánea incluido en el Sistema operativo Windows, Web.
* LJTalk: Cliente de Mensajería instantánea utilizado por el producto LiveJournal.
* Psi: Un cliente con licencia GNU GPL que se puede utilizar bajo Windows, Linux, u OS X.
* Gajim: Cliente multiplaforma disponible para Windows y GNU/Linux. Se encuentra programado en Python y para la interfaz utiliza PyGTK. Al igual que Psi es un cliente solo enfocado a Jabber.
* Exodus: Cliente con licencia GNU GPL que se puede utilizar en Windows.
* Coccinella: Cliente que proporciona VoIP mediante Jigle y que se puede utilizar bajo Windows, Linux, u OS X.
* Tkabber: Cliente con licencia GNU GPL escrito con Tcl/Tk que se puede utilizar bajo Windows y Linux.
* Champoo Chat: Cliente con licencia GNU GPL escrito en Java, que provee una experiencia de chat tipo IRC, con soporte para canales, conferencias y chats privados. Posee además un cliente de Twitter muy simple, totalmente integrado con el sistema.
* Pidgin (software): Uno de los clientes más usados en GNU/Linux, soporta otros protocolos como el de MSN, Yahoo!, etc.
* Telepathy: La infraestructura de Freedesktop.org para comunicación en tiempo real. Es la predeterminada para Ubuntu, Maemo y Meego.

## Desarrollo

El grupo de trabajo IETF XMPP ha producido los siguientes documentos RFC:
RFC 3920, RFC 3921, RFC 3922, RFC 3923, RFC 4622, RFC 4854, RFC 4979
* RFC 3920, Extensible Messaging and Presence Protocol (XMPP), core: Describe la mensajería Cliente-servidor mediante el uso de dos flujos XML. Los flujos XML consisten en <presence/>, <message/> y <iq/> (info/query). Una conexión es autentificada mediante SASL y cifrado mediante TLS.
* RFC 3921, Extensible Messaging and Presence Protocol (XMPP), Instant Messaging and Presence: Describe la Mensajería instantánea, la aplicación más común del protocolo XMPP.
* RFC 3922, Mapping the Extensible Messaging and Presence Protocol (XMPP) to Common Presence and Instant Messaging (CPIM): Describe las especificaciones del protocolo XMPP.
* RFC 3923, End-to-End Signing and Object Encryption for the Extensible Messaging and Presence Protocol (XMPP): Describe el cifrado extremo a extremo de los mensajes XMPP usando S/MIME.
Las siguientes extensiones son de uso particularmente extendido:
* Data Forms
* Service Discovery
* Multi-User Chat
* XHTML-IM
* File Transfer
* Entity Capabilities
* HTTP Binding
Actualmente el protocolo XMPP está siendo ampliado para el manejo VoIP. El protocolo de señalización que se utilizará es Jingle, que está diseñado para ser compatible con el servicio de Google Talk.