5 votes

Comment utiliser XMPP/Jabber tout en changeant de réseau ?

Lorsque vous exécutez un client Jabber, que se passe-t-il (ou que devrait-il se passer) lorsque vous changez de réseau (ou lorsque vous perdez la connectivité et que le modem GSM/UMTS se reconnecte) ?

Un client mobile Android Jabber (par exemple Jabiru ) être intelligent dans de telles situations ?

Le pire scénario que je puisse imaginer : Le client ne s'en soucie pas, la connexion TCP (sur TLS) au serveur Jabber est perdue, l'état de Jabber (affiché à distance) est bidon et il y a une fenêtre de temps où les messages (des copains) sont perdus.

J'ai observé un tel cas de figure, par exemple avec un client Jabber standard sur un ordinateur portable utilisant une connexion UMTS peu fiable.

Lorsque j'utilise un ordinateur portable, je peux facilement protéger ma session Jabber comme ceci :

  • connecter via autossh à un système avec une connexion réseau stable et exécuter directement screen -Rd
  • lancer un client Jabber en console dans screen

Ainsi, en cas de perte de la connexion Internet mobile, la connexion au serveur Jabber est toujours possible. Et autossh se reconnecte et se rattache automatiquement à la session d'écran en cours lorsqu'une nouvelle connexion mobile est établie.

Une configuration similaire à celle-ci est-elle nécessaire pour utiliser Jabber sur un appareil Android ?

Ou existe-t-il des extensions du protocole Jabber pour les clients mobiles qui permettent d'éviter la perte de messages, etc. en cas d'activation ou de désactivation du réseau (lors de la connexion à un serveur Jabber) ?

6voto

Flow Points 18254

Je ne suis pas sûr que cette question soit sur le sujet sur Android Enthusiasts. Mais je travaille avec XMPP et Android, alors voici ma réponse :

Comme Le mensonge que Ryan a déjà déclaré Le transfert d'une cellule mobile à une autre est presque toujours transparent pour la pile TCP des appareils Android. Mais il existe des situations où l'IP de votre appareil Android va changer. Il s'agit généralement de commutations GSM/UMTS <-> WiFi, qui rendront la connexion TCP inutilisable par le client XMPP.

Sur Android, la bibliothèque XMPP standard que la plupart des clients utilisent - en plus d'avoir leur propre bibliothèque propriétaire - est la suivante (a)Smack : Les clients qui utilisent (a)Smack avec la configuration par défaut vont no remarquer un changement de connexion en temps voulu. Mais il y a de l'espoir : Le support de XMPP Ping est dans le tronc de Smack et sera livré avec la version 3.3. La plupart des applications aSmack utilisent déjà une version d'aSmack qui le prend en charge, et doivent simplement mettre en œuvre les mesures correspondantes.

D'un autre côté, c'est le travail des serveurs XMPP de définir votre présence comme indisponible (hors ligne) après un délai (défini par le serveur) pour atteindre le dernier client du JID en question.

Il n'est donc pas nécessaire d'élaborer des solutions de contournement si vous utilisez un client XMPP correct, mais vous devrez peut-être vivre avec des situations d'état fantôme qui devraient se résoudre après quelques minutes.

Il existe une belle XEP (XMPP Extension) qui serait la solution miracle pour les connexions XMPP mobiles : XEP-0198 - Gestion des cours d'eau . Vous pouvez lire à ce sujet dans le blog de Ge0rg .

C'est en train d'être travaillé pour (a)Smack . Mais cela prendra un certain temps jusqu'à ce qu'il soit stable et vous avez également besoin du support du serveur pour XEP-0198.

1voto

Thej Points 655

Je ne suis pas un expert en matière de réseaux mobiles, mais je pense que la pile TCP devrait gérer le handover mobile de manière transparente. Les programmes d'application n'ont pas besoin de savoir que la couche réseau mobile passe d'une tour cellulaire à une autre. Du point de vue du programme d'application, il n'y a qu'une seule connexion continue.

La seule raison à laquelle je peux penser pour expliquer ce que vous voyez dans le client jabber de l'ordinateur portable est qu'il n'a pas utilisé keepalive lors de l'ouverture d'une longue connexion TCP. Lorsqu'il y a une longue période sans transmission, l'un des nœuds intermédiaires du réseau (généralement le pare-feu) peut décider de mettre fin à la connexion (généralement pour économiser des ressources afin de servir d'autres connexions actives) et le serveur n'a donc pas eu la possibilité de dire au client de se terminer proprement. Si l'on n'utilise pas la fonction keepalive pour une connexion de longue durée, il sera impossible pour le client de détecter que la connexion a été interrompue, car la seule façon pour un client de détecter une connexion interrompue est d'essayer d'envoyer un paquet et d'échouer définitivement.

La fonction Keepalive amène la pile TCP à envoyer périodiquement au serveur des paquets ACK de longueur nulle. Par conséquent, les nœuds intermédiaires considéreront que votre connexion en cours est toujours active et ne la termineront pas.

androidalle.com

AndroidAlle est une communauté de androiders où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X