Libp2p, une bibliothèque de réseau pair-à-pair, emploie des techniques innovantes comme le hole punching décentralisé et l'utilisation de relais pour permettre la communication entre des nœuds situés derrière des NAT et des pare-feu, sans nécessiter l'ouverture manuelle de ports sur les routeurs.
La traversée de NAT et de pare-feu est réalisée grâce à un processus en deux phases : la préparation et le hole punching proprement dit. Lors de la phase de préparation, le protocole AutoNAT est utilisé pour déterminer si un nœud est directement accessible, tandis qu'une connexion relayée est établie entre les nœuds1. Ensuite, le protocole DCUtR (Direct Connection Upgrade through Relay) entre en jeu pour synchroniser et coordonner le hole punching, permettant l'échange d'informations sur les adresses externes via la connexion relayée2. Cette approche décentralisée élimine le besoin de serveurs de signalisation centralisés comme STUN ou TURN, offrant ainsi une solution plus flexible et évolutive pour la connectivité pair-à-pair3.
Le mécanisme de hole punching permet d'établir une connexion directe entre deux nœuds A et B situés derrière des NAT ou des pare-feu. Le processus se déroule comme suit :
Les nœuds envoient simultanément des paquets l'un vers l'autre, "perçant" ainsi des trous dans leurs pare-feu respectifs.
Les routeurs ajoutent des règles temporaires (5-tuples) dans leurs tables d'état, permettant le passage des paquets entrants correspondants1.
Une fois les "trous" créés, les paquets peuvent traverser les NAT dans les deux sens, établissant ainsi une communication directe entre les nœuds1.
Cette technique ingénieuse permet à libp2p de contourner les restrictions des NAT et des pare-feu sans nécessiter de configuration manuelle des routeurs, offrant ainsi une connectivité quasi-universelle entre les nœuds du réseau2.
En cas d'échec du hole punching, libp2p offre une solution de repli en utilisant des nœuds relais pour faciliter la communication entre les pairs. Ces relais agissent comme des intermédiaires, permettant aux nœuds de communiquer même lorsqu'ils ne peuvent pas établir de connexion directe1. Bien que cette méthode puisse entraîner une latence plus élevée et une bande passante réduite par rapport aux connexions directes, elle garantit une connectivité fiable dans des environnements réseau complexes, assurant ainsi la robustesse et l'universalité du système de communication de libp2p.
Pour les nœuds fonctionnant dans les navigateurs, libp2p exploite les protocoles WebSocket et WebTransport, qui ne nécessitent pas l'ouverture de ports spécifiques1. WebSocket permet de "détourner" une connexion TCP, tandis que WebTransport fait de même avec une connexion QUIC. Ce dernier, basé sur UDP, offre de meilleures performances pour traverser les NAT12. Bien que WebTransport soit encore en développement par les groupes de travail IETF et W3C, il présente un intérêt particulier pour libp2p en raison de sa capacité à contourner les exigences strictes en matière de certificats, le rendant ainsi adapté aux environnements pair-à-pair1.