La portée des messages
Jusqu'où un message est relayé. Le réglage le moins documenté de MeshCore, celui que presque tout le monde comprend de travers.
Un canal dit à qui un message s’adresse. Une région dit jusqu’où il est relayé. Les deux mécanismes sont indépendants.
Attention au mot : une région MeshCore est une étiquette de portée géographique, sans rapport avec les régions administratives françaises.
Vous découvrez les régions ? Suivez les encadrés « En clair » : lus à la suite, ils racontent tout le mécanisme, sans une seule commande. Vous configurez un répéteur ? Les sections techniques se lisent seules, et les réglages à poser sont dans les conventions.
Imaginez des villages reliés par des crieurs publics. Un message passe de village en village, chacun le répétant plus fort pour que le suivant l’entende.
Chaque répéteur est le crieur d’un village. Chaque compagnon est un habitant équipé d’une radio. Une région, c’est un canton : un groupe de villages qui acceptent de se relayer entre eux. Une annonce criée peut porter le tampon d’un canton.
| Sur le réseau | Au village |
|---|---|
| Région | Un canton |
| Étiquette de région | Le tampon du canton, apposé sur l’annonce |
| Inondation | Une annonce criée de village en village |
| Route directe | Une lettre portée par des messagers, les villages de passage écrits sur l’enveloppe |
| Zéro saut | Parler par-dessus la clôture |
| Répéteur | Le crieur public |
| Liste des régions du répéteur | Les cantons que ce crieur accepte de servir |
Le crieur applique une règle simple : il ne répète une annonce que si elle porte le tampon d’un canton qu’il sert. Une annonce sans tampon, il la répète aussi, par défaut. Une lettre, il la transmet toujours, sans même regarder le tampon.
Et cette règle ne concerne qu’un seul des deux rôles. Le crieur, c’est le répéteur : lui seul répète ce que disent les autres, donc lui seul a une liste de cantons à servir. L’habitant, c’est le compagnon : il parle et il écoute, il ne répète rien, et ce qu’il choisit, c’est le tampon qu’il appose sur ce qu’il envoie. Un salon se comporte ici comme un habitant : il garde des messages, il n’en répète aucun.
C’est pour cela que les réglages diffèrent selon l’appareil, et qu’un appareil ne porte qu’un rôle à la fois.
| Au village | Sur le réseau | Ce qu’il décide |
|---|---|---|
| Le crieur | le répéteur | les cantons qu’il sert, et le tampon de ses propres annonces |
| L’habitant | le compagnon | le tampon qu’il met sur ce qu’il envoie |
| Le dépôt de lettres | le salon | rien : il garde et rend les messages, sans jamais répéter |
| Acteur | Ce qu’il fait |
|---|---|
| Le répéteur | déclare la liste des régions où il se trouve |
| L’émetteur | étiquette son message avec la portée jusqu’où il doit aller |
Un répéteur relaie un message si et seulement si l’étiquette du message figure dans sa liste.
Et ce sont les compagnons qui portent les canaux, pas les répéteurs : un répéteur n’a aucun canal, il transporte des paquets sans les lire.
C’est la confusion la plus fréquente, et elle coûte cher : on croit avoir limité son trafic alors qu’on a seulement changé ce que le répéteur accepte de relayer.
| Réglage | Sur quel appareil | Ce qu’il gouverne |
|---|---|---|
region put | le répéteur | ce qu’il accepte de relayer pour les autres. Ne change rien à ce qu’il émet |
region default | le répéteur | la portée de ses propres paquets : ses annonces, ses réponses quand la portée du demandeur est inconnue |
| Portée du canal | le compagnon, dans l’application | la portée de vos messages sur ce canal |
Trois conséquences à retenir.
Restreindre region put sur votre répéteur ne réduit pas votre propre trafic. Ça réduit le service que vous rendez aux autres. Si vous voulez moins peser sur le réseau, c’est region default et la portée de vos canaux qu’il faut regarder.
Élargir region default sur un répéteur n’améliore pas la couverture. Ça ne fait qu’envoyer ses annonces plus loin, au prix du temps d’antenne de tous les répéteurs traversés.
Un répéteur n’a pas de canal, donc pas de portée de canal. Il transporte des paquets sans les lire. La portée d’un message de canal est décidée par le compagnon qui l’émet, jamais par les répéteurs du trajet.
*, et le contresens qu’elle créeCréée par défaut sur tout répéteur, * signifie : relaie tous les messages qui n’ont aucune région associée.
C’est elle qui fait tenir le réseau pendant la transition. Sans elle, quiconque n’a pas encore configuré ses canaux serait coupé sans comprendre pourquoi.
Elle produit une conséquence que personne n’attend :
Le trafic non étiqueté va plus loin que le trafic étiqueté. Il n’est arrêté par aucune frontière de région.
C’est vérifiable dans les mesures du réseau : une annonce étiquetée est recopiée 2,5 fois en moyenne, une annonce sans étiquette 5,7 fois.
Un répéteur ne regarde la région que d’un seul genre de paquet : ceux qu’il reçoit en inondation et qu’il devrait relayer.
| Mode du paquet | Le répéteur vérifie-t-il la région ? |
|---|---|
| Inondation étiquetée | oui : si aucune région de sa liste ne correspond, il ne relaie pas |
| Inondation sans étiquette | traitée comme *, relayée dans la limite de flood.max.unscoped |
| Route directe, étiquetée ou non | jamais |
| Zéro saut | sans objet, rien n’est relayé |
Deux conséquences surprennent souvent.
Restreindre les régions d’un répéteur ne coupe pas les échanges établis. Une conversation dont le chemin est connu passe en route directe, que la région ne contrôle pas. Ce qui est coupé, c’est la découverte.
Une région ne filtre jamais la réception. Un compagnon entend tout ce qui lui parvient. Sur un banc d’essai où tous les appareils s’entendent directement, les régions ne sont donc jamais sollicitées.
La convention française suit le principe de la peau d’oignon : un répéteur déclare toutes les échelles géographiques où il se trouve, de la plus large à la plus fine.
| Niveau | Code | Source |
|---|---|---|
| Europe | eu | usage international établi |
| Pays | fr | ISO 3166-1 alpha-2 |
| Région | fr-ara | ISO 3166-2 |
| Département | fr-38 | ISO 3166-2 |
| Commune | fr-38-185-grenoble | code INSEE, voir plus bas |
La commune est le niveau le plus récent, et le seul qui ne vienne pas d’une norme internationale : il est construit à partir du code INSEE. C’est lui qui permet à un répéteur de quartier de s’annoncer chez lui sans faire le tour du pays.
L’imbrication existe dans le firmware mais elle est purement cosmétique : déclarer fr-38 comme enfant de fr-ara ne produit aucun héritage. Chaque étiquette doit être portée explicitement.
Un répéteur ne filtre pas pour protéger le réseau. Il accepte les différents degrés de précision que les émetteurs emploieront.
Un répéteur qui ne porterait que son département couperait tout message étiqueté fr, fr-ara, eu ou celui d’une commune voisine traversant son secteur, y compris ceux d’un voisin ayant étiqueté correctement. Il deviendrait un trou dans le réseau, sans que personne ne comprenne d’où vient le blocage.
Le filtrage utile se fait côté émetteur, en étiquetant chaque canal à la portée juste. C’est là que se joue la préservation du temps d’antenne, pas dans la liste du répéteur.
euPorter eu expose au trafic européen étiqueté. C’est un coût réel. Mais l’alternative est pire : quelqu’un qui veut porter loin sans disposer de eu n’étiquette rien du tout, son message part sous *, et il va au-delà de l’Europe.
eu sert donc à séparer deux populations pour les traiter différemment.
| Trafic | Traitement possible |
|---|---|
| Non étiqueté | limité par flood.max.unscoped |
Étiqueté eu | toléré tant qu’il reste raisonnable, blocable d’une commande |
C’est ce qui rend une crise gérable. Si tout le monde étiquette proprement, bloquer eu dégage la bande sans toucher au trafic local. Sans cette séparation, il n’y a rien à bloquer : tout est mélangé sous *.
| Type de nœud | region put | region default |
|---|---|---|
| Répéteur de quartier, classe 3 | eu, fr, sa région, son département, sa commune | sa commune |
| Répéteur de bassin, classe 2 | les mêmes | son département |
| Dorsale, classe 1 | les mêmes | sa région |
| Compagnon sédentaire | sans objet | son département |
| Compagnon en déplacement | sans objet | fr |
La région par défaut s’applique aux paquets que le nœud émet lui-même : adverts, tentatives de contact par inondation, reprise de chemin. Elle réduit la portée, elle ne l’augmente pas. Sans elle, ces paquets partent sous * et ne s’arrêtent nulle part.
Elle ne suffit pourtant pas, car un advert coûte autant qu’un message et se répète indéfiniment. Le réglage qui compte autant est l’intervalle entre deux annonces inondées, fixé par la convention à 32 heures, et leur plafond de sauts, fixé à 5.
fr-38-185-grenobleUn nom de région communale se compose de quatre morceaux, dans cet ordre :
| Morceau | Exemple | D’où il vient |
|---|---|---|
| Pays | fr | ISO 3166-1 |
| Département | 29 | les deux premiers chiffres du code INSEE |
| Commune | 019 | les trois derniers chiffres du code INSEE |
| Nom | brest | le nom de la commune, en minuscules, sans accent |
Le code INSEE de Brest étant 29019, sa région communale est donc fr-29-019-brest. Celui de Nancy, 54395, donne fr-54-395-nancy, et celui de Grenoble, 38185, donne fr-38-185-grenoble.
region put et region default correspondantes. Ce qui suit décrit ce qu’il fait, pour ceux qui veulent le faire à la main ou vérifier.Un répéteur de bassin installé à Grenoble, classe 2 : il porte les cinq échelles et s’annonce à celle de son département.
--- l'arbre, du plus large au plus fin --- region put eu # l'Europe, sous la racine region put fr eu # la France, sous l'Europe region put fr-ara fr # la région administrative region put fr-38 fr-ara # le département region put fr-38-185-grenoble fr-38 # la commune, code INSEE 38185 --- les régions réservées et la région hors arbre --- region put fr-reserved-1 fr region put fr-reserved-2 fr region put fr-reserved-3 fr region put emergency # au niveau de eu, sans parent --- ce que ce nœud est, et ce qu'il dessert --- region home fr-38-185-grenoble # où il se trouve region default fr-38 # la portée de SES annonces --- le trafic non étiqueté, et les annonces --- set flood.max.unscoped 2 # le bruit lointain s'arrête set flood.advert.interval 32 # annonce inondée, toutes les 32 h set flood.max.advert 5 # elle s'arrête après 5 sauts region save # sans ça, tout est perdu au redémarrage reboot
Pour un répéteur de quartier, en classe 3, une seule ligne change : region default fr-38-185-grenoble, la commune au lieu du département. Pour une dorsale, en classe 1, ce serait region default fr-ara.
Vérifiez ensuite avec region, qui exporte la table, et region default, qui rend la portée en vigueur.
set flood.max.unscoped 2
Disponible depuis le firmware 1.16, cette commande rejette les messages sans région ayant déjà effectué plus que ce nombre de sauts. Sa valeur d’usine est 64 : sans réglage, le trafic non étiqueté n’est pratiquement pas limité.
C’est le levier le plus efficace contre le bruit : il coupe le trafic lointain non configuré tout en laissant passer celui des nouveaux arrivants du voisinage, qui n’ont pas encore paramétré leurs régions.
| Valeur | Usage |
|---|---|
| 5 | zone peu dense, peu de trafic étranger |
| 2 | valeur de la convention : répéteur ordinaire ou très entendu |
| 1 | à éviter, coupe les voisins immédiats |
À ne pas confondre avec le blocage de *, qui coupe intégralement le trafic non étiqueté. Celui-là ne se justifie que sur un répéteur frontalier face à un volume étranger massif.
Un compagnon étiquette tout ce qu’il émet avec sa propre région par défaut, y compris ses réponses. Sans région par défaut, il émet tout sans étiquette. Un répéteur ou un salon, eux, répondent avec la région de la demande reçue.
Conséquence : si deux compagnons ont des régions par défaut différentes, et qu’un répéteur du trajet ne sert que l’une des deux, l’aller passe mais le retour, chemin et accusé de réception, peut être arrêté. L’émetteur ne reçoit pas d’accusé et renvoie son message pour rien. Le message est arrivé, mais personne ne le sait.
Tant que ce comportement n’évolue pas dans le firmware, la parade est de donner la même région par défaut aux compagnons qui échangent souvent, ou de choisir une échelle que tous les répéteurs du trajet portent.
L’advert d’un compagnon porte toujours sa région par défaut. La portée qu’on choisit sur le moment dans l’application s’applique aux messages, pas aux adverts. Un compagnon réglé sur sa commune est donc introuvable dès qu’il la quitte, sauf pour ceux qui l’entendent directement.
Un exemple : un compagnon réglé sur fr-29-019-brest reste introuvable dès qu’il passe à Quimper, sauf pour ceux qui l’entendent directement.
En déplacement, passez votre compagnon en fr : c’est la seule échelle que portent tous les répéteurs, vous serez découvert partout en France.
Ce choix a un coût. Le firmware d’un compagnon n’a pas de minuterie d’advert, mais l’application qui le pilote en envoie d’elle-même : un compagnon actif s’annonce environ toutes les 83 minutes, mesuré sur le réseau français. En fr, chacune de ces annonces traverse le pays. La région par défaut étiquette aussi vos messages de canal et vos premiers messages à un contact dont le chemin est inconnu, qui traversent le pays à leur tour.
D’où deux conseils. Revenu chez vous, reprenez une échelle plus fine. Et si votre application permet de choisir une portée au moment d’envoyer, servez-vous-en pour vos messages : ce choix-là ne touche pas aux adverts.
| Région par défaut du compagnon | Découvrable | Coût |
|---|---|---|
| Sa commune | seulement dans sa commune | le plus faible, mais introuvable dès qu’on en sort |
| L’échelle où l’on circule | partout où l’on circule | modéré |
fr | partout en France | chaque advert inonde tout le pays |
Les limites lues dans le code du firmware, RegionMap.h :
| Limite | Valeur |
|---|---|
| Régions par répéteur | 32, plus le joker * |
| Longueur d’un nom | 30 caractères |
| Taille d’une entrée | 36 octets : identifiant, parent, drapeaux, nom |
| Table complète en mémoire | environ 1,2 Ko |
| Clés par région privée | 4 |
La vraie limite n’est pas celle-là. Pour décider s’il relaie un paquet inondé, le répéteur recalcule un HMAC-SHA256 par région de sa liste, jusqu’à trouver une correspondance. Vingt régions, c’est jusqu’à vingt calculs par paquet.
Et le cache des clés ne tient que seize entrées. Quand il est plein, le firmware ne remplace rien : les clés des régions surnuméraires sont recalculées à chaque paquet, un SHA-256 de plus à chaque fois.
| Nombre de régions | Ce que ça donne |
|---|---|
| 5 ou 6 | la convention : eu, fr, la région, le département, la commune, plus * |
| jusqu’à 12 | confortable, par exemple pour un répéteur à cheval sur deux départements |
| au-delà de 16 | le cache déborde, le coût par paquet augmente franchement |
| 32 | refus d’en ajouter une de plus |
Autrement dit, seize est le plafond pratique, pas trente-deux.
Les régions se définissent par la géographie, jamais par l’usage. Une région adrasec ou les-relais-des-copains n’a pas lieu d’être. Un canal, oui. De même, fr-54 désigne la Meurthe-et-Moselle, pas « le groupe de Nancy ».
Codes ISO, jamais les codes IATA. Ces derniers ont été employés historiquement et cet usage est abandonné. Ils subsistent dans les analyseurs de paquets, ce qui ne concerne pas la configuration des répéteurs.
Trente caractères au plus, minuscules, chiffres et tirets.
La longueur du nom ne pèse pas sur les messages. Le nom ne voyage jamais : ce qui part sur la radio est le code de transport, calculé à partir de la clé de la région. Dans le paquet, le champ fait uint16_t transport_codes[2], soit quatre octets en tout, quel que soit le nom — et ces quatre octets ne sont présents que si la route en porte, c’est-à-dire pour une inondation ou une route directe étiquetées. Un nom de trente caractères ne coûte donc rien de plus sur l’air qu’un nom de deux.
Deux précisions tout de même. La limite de trente est en octets, pas en caractères affichés : un accent en UTF-8 en compte deux, raison de plus pour s’en tenir aux noms sans accent. Et ce qui coûte du calcul, c’est le nombre de régions déclarées, pas la longueur de leurs noms : voir la section précédente.
| Version | Ce qu’il faut faire |
|---|---|
| avant 1.15.0 | un region allowf <nom> après chaque region put |
| 1.15.0 | put active l’inondation automatiquement |
| 1.16.0 | region def en une ligne, et flood.max.unscoped |
Vérifiez votre version avec ver avant de recopier une procédure trouvée ailleurs.
region def. Cette commande construit l’arbre d’un trait, mais chaque nom devient l’enfant du précédent. region def eu europe fr ne crée donc pas trois régions côte à côte : il place fr sous europe, lui-même sous eu. Pour sauter ailleurs, il faut l’écrire : fr-38-185-grenoble|fr. En cas de doute, region put, une ligne par région, est sans ambiguïté.Quatre régions sont réservées : fr-reserved-1, -2, -3, sous fr, et emergency, au niveau de eu.
Pourquoi maintenant, alors qu’elles ne servent pas encore. Une région se répand sur tous les répéteurs du pays, et se reprendre coûte cher : il faudrait que chaque opérateur reconfigure son nœud. Les réserver d’avance évite qu’un nom choisi dans son coin devienne impossible à changer, et garantit que la place existera le jour où l’usage sera décidé.
À quoi elles serviront. MeshCore France travaille sur des versions de micrologiciel offrant des réglages plus fins de régulation du trafic : priorités par région, budgets de temps d’antenne, filtrage plus sélectif que le simple plafond de sauts. Ces quatre régions servent aux essais de ces mécanismes, puis aux opérations à l’échelle du territoire que la communauté décidera de mettre en œuvre.
Rien n’est arrêté aujourd’hui : ni ce que chacune portera, ni qui pourra y émettre. Ce qui est arrêté, c’est qu’elles sont prises, et qu’on ne les utilise pas pour autre chose en attendant.
emergency n’est pas sous fr. Elle est au niveau de eu, donc un message qui la porte ne s’arrête pas aux frontières de l’arbre français, et un répéteur ne la transporte que s’il la déclare explicitement.
Son nom ne promet rien : une région n’authentifie personne, sa clé étant dérivée d’un nom public, et n’importe qui peut l’étiqueter. Elle ne créera d’obligation ni de priorité que le jour où le micrologiciel saura distinguer qui a le droit d’y émettre. D’ici là, c’est un nom mis de côté, pas un canal de secours.
Cette annexe met bout à bout tout le vocabulaire. Elle sert de traduction : à gauche ce que disent le micrologiciel et les analyseurs, au milieu l’image du village, à droite ce que ça veut dire.
Chaque répéteur est le crieur public d’un village. Il entend ce qui se dit autour de lui et le répète plus fort pour que les villages suivants l’entendent. Chaque compagnon est un habitant qui a une radio pour envoyer et recevoir.
| MeshCore | Dans le village | Ce que ça veut dire |
|---|---|---|
| Région | Le canton | Un groupe de villages qui décident de se relayer entre eux |
Étiquette de région (transport_codes[0]) | Le tampon du canton sur l’annonce | Le crieur ne répète que les annonces qui portent le tampon d’un canton qu’il sert |
Région par défaut d’un compagnon (default_scope) | La commune inscrite sur sa carte d’identité | Elle tamponne ses présentations où qu’il aille, même loin de chez lui |
Région par défaut d’un répéteur (default_scope) | L’adresse de la mairie | Elle ne change pas : un crieur ne déménage pas |
Inondation (TRANSPORT_FLOOD route 0 si étiquetée, FLOOD route 1 sinon) | Annonce criée de village en village | Tout le monde l’entend, chaque crieur la répète une fois |
Route directe (DIRECT route 2, TRANSPORT_DIRECT route 3) | Lettre portée par des messagers, avec la liste des villages de passage écrite sur l’enveloppe | Seuls les crieurs cités la transmettent, pas besoin de tampon |
Zéro saut (DIRECT route 2, chemin vide) | Parler par-dessus la clôture | Seuls les voisins immédiats entendent, personne ne répète |
| Répéteur | Le crieur public | Il vérifie le tampon avant de répéter une annonce, jamais une lettre |
| Salon persistant | Le panneau d’affichage de la mairie | On s’y inscrit avec un mot de passe, il garde les messages. Ce qu’il permet |
Annonce sans étiquette (FLOOD route 1, sans code de transport) | Annonce « libre » | Répétée par défaut, sauf si le crieur a décidé de ne répéter que les annonces tamponnées |
| Région inconnue du répéteur | Tampon d’un canton que le crieur ne sert pas | Il ne répète pas |
Chemin de retour (PATH, type 8) | « Pour me répondre, passe par tel et tel village » | Ensuite on envoie des lettres au lieu de crier |
Accusé de réception (ACK, type 3) | L’accusé de réception | Seulement pour les messages privés |
Canal (GRP_TXT type 5, GRP_DATA type 6) | Un message en langage codé crié pour une association | Tout le monde l’entend, seuls les membres le comprennent, personne ne répond « reçu » |
Code de transport (transport_codes[0], 2 octets) | Un tampon fabriqué à partir du texte de l’annonce | On ne peut pas le découper pour le coller sur une autre annonce |
| Action du compagnon | Dans le village | Tampon ? | Retour ? |
|---|---|---|---|
Advert en inondation (ADVERT, type 4) | Crier « Je m’appelle X, j’habite ici » dans tout le canton | Oui, toujours celui de sa carte d’identité, où qu’il soit * | Non |
Advert à zéro saut (ADVERT, type 4) | Se présenter par-dessus la clôture | Non | Non |
Message à un autre compagnon, chemin inconnu (TXT_MSG, type 2) | Crier un message pour une personne précise | Oui | Oui : l’accusé de réception et le chemin, criés avec le tampon du canton du destinataire |
Message à un autre compagnon, chemin connu (TXT_MSG, type 2) | Envoyer une lettre par messagers | Non | Oui : accusé de réception par lettre |
Commande CLI vers un répéteur (TXT_MSG, type 2) | Donner un ordre au crieur | Oui si on crie | Oui : il répond, sans accusé de réception |
Message sur un canal (GRP_TXT, type 5) | Crier un message codé pour l’association | Oui | Non |
Données sur un canal (GRP_DATA, type 6) | Pareil, ou par lettre si on connaît le chemin | Oui si on crie | Non |
Login sur un répéteur ou un salon persistant (ANON_REQ, type 7) | Donner le mot de passe à la mairie | Oui si on crie | Oui : « C’est bon » ou « refusé », avec le tampon de la demande |
Requête anonyme, nœud hors contacts (ANON_REQ, type 7) | Demander par-dessus la clôture | Non | Oui |
Statut, télémétrie (REQ, type 0) | Demander au crieur « Comment ça va, il te reste de la voix ? » | Oui si on crie | Oui |
Découverte de chemin (REQ, type 0) | Crier « Par où je passe pour te rejoindre ? » | Oui, on crie toujours | Oui : le chemin, puis on échange les chemins par lettre |
Keep-alive (REQ, type 0) | Petit mot régulier à la mairie : « Je suis toujours là » | Non, c’est une lettre | Oui : « Bien noté » |
Traceroute (TRACE, type 9) | Lettre qui fait noter à chaque crieur la qualité de ce qu’il a entendu | Non | Oui : la lettre revient avec les notes |
Découverte des voisins (CONTROL, type 11) | Demander par-dessus la clôture « Qui est crieur par ici ? » | Non | Oui : les crieurs proches répondent |
Partage de contact (ADVERT, type 4) | Montrer la carte de visite de quelqu’un à ses voisins | Tampon « à ne pas répéter » | Non |
Données brutes (RAW_CUSTOM, type 15) | Colis spécial par messagers | Non | Non |
| Paquet brut, forgé par l’application (tout type) | On écrit et tamponne soi-même | C’est l’application qui choisit | Selon le cas |
* En déplacement, passez votre compagnon en fr : c’est la seule échelle que portent tous les répéteurs, il sera découvert partout en France. Voir « Un compagnon qui se déplace », plus haut.
Comprendre le réseau, la suite