Introduction

Récemment, nous avons rencontré un problème avec l'une de nos applications sur iPad, qui ne chargeait pas correctement. Après une enquête approfondie, nous avons découvert que le problème était dû à une combinaison de deux facteurs : un bug dans la bibliothèque WebRTC en Rust et une limitation dans la configuration de Tailscale.

Contexte Technique

L'application utilisait WebRTC pour établir une connexion entre l'iPad et un serveur. Cependant, lorsque nous avons essayé de charger l'application sur l'iPad, nous avons obtenu une page blanche. Les mêmes URL fonctionnaient correctement sur d'autres appareils, tels que les Mac et les téléphones. Nous avons commencé à soupçonner que le problème venait de l'iPad, puis de WebKit, et enfin de Tailscale.

Après avoir analysé les journaux de connexion, nous avons constaté que les données n'arrivaient pas à l'iPad, bien que le serveur les ait envoyées. Nous avons également découvert que le problème était lié à la taille des paquets de données et à la façon dont Tailscale les traitait.

Analyse et Implications

Notre analyse a révélé que le problème était dû à une combinaison de deux facteurs. Premièrement, la bibliothèque WebRTC en Rust utilisait une taille de paquet par défaut de 1228 octets, qui était trop grande pour passer à travers le tunnel Tailscale. Deuxièmement, Tailscale avait une limite de taille de paquet de 1280 octets, qui était inférieure à la taille des paquets envoyés par la bibliothèque WebRTC.

Cela a entraîné une situation dans laquelle les paquets de données étaient fragmentés en plusieurs morceaux, mais ne pouvaient pas être réassemblés correctement sur l'iPad. Nous avons confirmé ce comportement en utilisant l'outil tcpdump pour analyser les paquets de données.

Perspective

Cette expérience nous a appris l'importance de prendre en compte les limitations de taille de paquet lors de la conception de systèmes qui utilisent WebRTC et des réseaux VPN comme Tailscale. Nous devons être conscients des risques potentiels de fragmentation des paquets de données et prendre des mesures pour les éviter.

Enfin, nous avons constaté que la résolution de ce problème a nécessité une approche méthodique et une analyse approfondie des journaux de connexion et des paquets de données. Cela nous a rappelé l'importance de la persévérance et de la curiosité dans la résolution de problèmes complexes.