El comentario de Marcos en el post anterior en el que reporto un bug en GTalk me despertó mucha curiosidad. Por eso, con la ayuda de mi amigo Dionisio, estuvimos probando todo con GTalk y Jabber en general. Si bien las pruebas fueron realizadas con menos cuidado y control de lo que me hubiese gustado hacerlo, mayormente debido a que fue casi espontánea, creo que puede brindar un poco de luz sobre lo que puede llegar a estar causando ese comportamiento indeseado.
¿De qué hablo?
Para quienes no hayan leído el post anterior, o simplemente no lo recuerden, básicamente me topé con un comportamiento indeseado en GTalk. Dejando la PC de mi casa conectada con GTalk y logueándome en la PC del trabajo me dí con que no recibía los mensajes de gente que intentaba comenzar una conversación conmigo. No así con los mensajes que pertenecían a una conversación en curso que recibía perfectamente, al llegar a casa me topaba con una serie de ventanas abiertas desde GTalk con los mensajes que me habían enviado mis contactos a GTalk y yo nunca recibí en la otra PC en la que estaba conectado.
Las pruebas realizadas
Como casi cualquier otro día yo estaba logueado en GTalk con dos PCs. Había dejado la PC de mi casa prendida y conectada a GTalk y también había iniciado la sesión en la PC del trabajo. Dionisio, por su parte, se encontraba logueado con una cuenta Jabber en Gaim (sobre Windows) y también en otra PC utilizando centerICQ (un excelente IM multiprotocolo de consola para Linux). Además, tenía corriendo un Ethereal (analizador de protocolo de red multiplataforma) para poder ver exactamente qué se enviaba y qué se recibía por medio de la conexión a internet (y la red local).
Cabe destacar que el Gaim, mi segunda sesión de GTalk estaba corriendo sobre la misma PC junto con el Ethereal. Además, la sesión de centerICQ estaba corriendo sobre una consola ssh en la misma PC gracias a PuTTY.
Por si no se entendió teníamos las siguientes cuentas abiertas, en orden en el que fueron abiertas:
- GTalk corriendo mi cuenta GMail en la PC de mi casa
- GTalk corriendo mi cuenta GMail en la PC de mi trabajo
- centerICQ corriendo una cuenta Jabber de Dionisio por medio de una sesión ssh a otra PC desde mi trabajo
- Gaim corriendo una cuenta Jabber de Dionisio en mi trabajo
- GChat corriendo con una cuenta GMail de Dionisio en un Firefox 1.5.0.1 en la PC de mi trabajo (casi no utilizada)
Con todo esto corriendo comenzamos a hacer pruebas enviando mensajes de acá para allá y viceversa. Cerrando y abriendo ventanas y revisando los paquetes que entraban y salían.
Resultados
El error se duplicó también en las cuentas Jabber de Dionisio. Básicamente cualquier conexión que yo comenzara desde mi PC con él iban a parar al centerICQ, por más que la cuenta haya estado chateando conmigo desde Gaim hacía unos minutos. Cualquier conversación comenzada desde cualquier sesión Jabber a mi cuenta GMail iba a parar a mi casa (lo comprobé cuando llegué a casa pasadas unas horas) y el GTalk de la PC del trabajo no indicaba indicios de haber recibido nada.
Nos costó un poco más de lo que yo creía duplicar el error porque había algo que no sabíamos. Una vez abierta una serie de conversaciones de prueba, dejamos pasar unos minutos para que se desconectaran por timeout. Enviábamos mensajes y los recibíamos perfectamente. Esto se debía a que Gaim envia un paquete cada 10 segundos para decir que todavía tiene la conversación abierta (keepalive). Si bien no lo probamos demasiado exhaustivamente en todos los clientes, estaría casi convencido que es así para la mayoría; eso explicaría el que recibiera los mensajes en conversaciones que yo comienzo. Esto también podría ser un factor influyente en conversaciones recibidas a GChat. Las comenzadas con GChat sufren del mismo problema; pero debo reconocer que no lo probamos demasiado.
Entonces podríamos concluir que existe un problema común a cuentas GMail y cuentas Jabber. Es lógico suponer que el problema está en el protocolo Jabber; pero yo no estaría tan seguro. Mi opinión es que el bug se encuentra en el servidor jabber (que es común a Jabber y a GMail - este último con algunas modificaciones) y el manejo de conexiones activas.
¿Soluciones?
Disclaimer: esto son sólo ideas mías y de ninguna forma aseguro que sean razonables o viables debido a mi escaso conocimiento sobre cómo funciona un servidor de IM.
La solución más obvia, y es la adoptada por MSN por ejemplo, es simplemente no permitirle a un usuario estar logueado en dos PCs al mismo tiempo. Cuando se conecta la segunda PC automáticamente se desloguea la primera y listo. Desconozco si esta solución es compatible con la especificación actual de Jabber, pero lo dudo por la posibilidad de desloguear a alguien simplemente enviándole un paquete especial a su cuenta. Esto último puede ser complicado de hacer desde un cliente cualquiera; pero puede ser más sencillo desde un servidor Jabber (que cualquiera puede instalar libremente).
El problema puede ser fácilmente solucionable si, al igual que en las conversaciones activas, el cliente envía un paquete al servidor informado que aún está activo. Esto parecería la solución más obvia si no fuese porque deberíamos encontrar una forma de evitar que el cliente deje de enviar dicha notificación cuando no se usa más la PC. Cuando la PC está sin mover el mouse o sin teclear por mucho tiempo es una buena opción si no tenemos en cuenta a quienes deben compartir la PC con gente de confianza como para dejar la cuenta abierta.
Otra solución es modificar la contabilidad que mantiene el servidor con las cuentas. Si bien desconozco cómo funciona en la actualidad, se podría mantener un registro de las conexiones en las que se encuentra una cuenta. Supongo que actualmente existirá algo similar pero está limitado a un registro y éste contiene a la primera sesión iniciada y no tiene en cuenta las restantes al momento de recibir una conversación nueva (esto es una asumción mía basándome en todo este problema). Si se modifica ese registro para que pueda contener más de un valor y se fuese cambiando el órden de dichos valores según el último con actividad (haber iniciado una sesión, una conversación o lo que sea). Es una buena opción pero sufre de un problema de concurrencia: sirve para 2 conexiones, pero no para más. En caso de tener 3 PCs logueadas en orden de numeración, si salgo de la tercera PC y me voy a la primera todas las coversaciones irán a parar a la segunda hasta que yo reporte algún tipo de actividad desde la primera y se cambie el orden (es más fácil generar situaciones de este tipo con más PCs).
No se me ocurre ninguna otra que sea totalmente limipa de implementar. Por “limpia” entiendo que no requiera intervención alguna del usuario. También escuché por ahí la posibilidad de especificar, en cada sesión, una prioridad o parámetro para establecer un order predefinido. No sé si realmente existe, cuán difundido esté o cómo lo utiliza cada cliente; pero supongo que tiene las mismas falencias que la última solución que se me ocurrió.
A ustedes seguro que algo más se les ocurre.
Actualización 02/03/2006:
El grupo de soporte de Google me envía un nuevo mail:
Gracias por hacernos notar este inconveniente. Hemos enviado toda la información que se nos proveyó al equipo apropiado para más investigaciones. Apreciamos su paciencia y pedimos disculpas por cualquier inconveniente que esto le pueda haber ocasionado.
2 Comments
Epa! Que alegria saber de usted en la blogsofera!! Saludos!
Creo que el error que comentas no es un fallo sino una cualidad del protocolo jabber, que permite tener abierto varios clientes con distintas prioridades.
El problema esta cuando dos clientes tiene la misma prioridad; En ese caso creo que el el servidor es el que decide a donde se mandan los mensajes.
Pasa mas información podéis mira esta web: http://www.jabberes.org/node/664
One Trackback
[…] Actualización 19/02/2006: Estuve buscando más información y probando sobre Jabber. Los resultados en el próximo post: Bug en Jabber […]