"Si un ouvrier veut bien faire son travail, il doit d'abord affûter ses outils." - Confucius, "Les Entretiens de Confucius. Lu Linggong"
Page de garde > La programmation > NodeJS + ROHC

NodeJS + ROHC

Publié le 2024-07-31
Parcourir:527

De l'idée à la mise en œuvre

Je voudrais vous présenter mon idée et comment elle est née pour donner à « ROHC » une liaison dans NodeJS.

Je voulais implémenter un VPN qui fonctionne sur Web-Socket. Les avantages seraient que le service serait masqué via HTTPS. Avec HTTP3, ce serait encore plus optimisé. J'ai donc commencé à jouer avec le module TunTap2 pour NodeJS, que j'ai dû d'abord patcher.

Toujours fasciné par la technologie sans fil, je suis tombé à un moment donné sur « LoRa » et avec lui un projet « IP2Lora ».

Image description

Source de l'image

Dans ce projet « IP2Lora », les paquets IP ont été raccourcis pour économiser 40 octets, ce qui est très important pour le transfert ; avec une bande radio de 434 MHz ou 868 MHz, peu de choses peuvent être transférées.

NodeJS   ROHC

Source de l'image

Dans le graphique, vous pouvez clairement voir comment la taille du paquet IP diminue.

Malheureusement, il n'y avait qu'une seule liaison de bibliothèque pour Python.

Alors pourquoi ne pas écrire vous-même une liaison de bibliothèque de nœuds !?

Le résultat est maintenant visible.
https://www.npmjs.com/package/node-rohc

Vous pouvez en savoir plus sur le fonctionnement de ROHC dans les liens vers le projet ou simplement le rechercher. Je ne l'expliquerai pas ici pour ne pas rendre le message trop long.

Libération d'installation

J'ai installé sous Linux Debian/Mint. Je pense que cela devrait être similaire aux autres versions de Linux.

(Au fait, j'ai également dû patcher la bibliothèque ROHC sur le nouveau noyau.)

sudo apt-get install autotools-dev
sudo apt-get install automake
sudo apt-get install libtool
sudo apt-get install libpcap-dev
sudo apt-get install -y libcmocka-dev

git clone https://github.com/stefanwerfling/rohc.git
cd rohc

./autogen.sh --prefix=/usr

make all
sudo make install

Installation NPM

Nous pouvons maintenant accéder à notre projet et installer le module.

cd yourProject
npm i node-rohc

Nous devons maintenant créer la liaison NodeJS (celle-ci doit être compilée pour chaque architecture CPU elle-même).

cd yourProject/node_modules/node-rohc
npm run build --loglevel verbose

L'installation est maintenant terminée.

Utilisation du codage/de l'API

Supposons maintenant que nous obtenions un paquet IP que nous souhaitons compresser dans les paquets suivants pour économiser des octets.

const ipU8Packet = new Uint8Array(ipPacketBufferWithContent);
console.log(ipU8Packet);
Uint8Array(52) [
   69,   0,   0,  52,   0,   0,   0,   0,  64,  6, 249,
  112, 192, 168,   0,   1, 192, 168,   0,   2, 72, 101,
  108, 108, 111,  44,  32, 116, 104, 105, 115, 32, 105,
  115,  32, 116, 104, 101,  32, 100,  97, 116, 97,  32,
  112,  97, 121, 108, 111,  97, 100,  33
]

Le module est maintenant importé ainsi que le Unit8Array dans lequel le paquet IP est donné à l'objet Rhoc pour compression.

import {Rohc} from 'node-rohc';

const r = new Rohc([
  RohcProfiles.ROHC_PROFILE_UNCOMPRESSED,
  RohcProfiles.ROHC_PROFILE_IP,
  RohcProfiles.ROHC_PROFILE_TCP,
  RohcProfiles.ROHC_PROFILE_UDP,
  RohcProfiles.ROHC_PROFILE_ESP,
  RohcProfiles.ROHC_PROFILE_RTP
]);

try {
    const compress = r.compress(ipU8Packet);
    console.log(compress);
} catch (e) {
    console.error(e);
}
Uint8Array(53) [
  253,   4,  69,  64,   6, 192, 168,   0,   1, 192, 168,
    0,   2,   0,  64,   0,   0,  32,   0, 251, 103,  72,
  101, 108, 108, 111,  44,  32, 116, 104, 105, 115,  32,
  105, 115,  32, 116, 104, 101,  32, 100,  97, 116,  97,
   32, 112,  97, 121, 108, 111,  97, 100,  33
]

Dans le constructeur de l'objet Rohc, nous spécifions les profils qui doivent être utilisés pour la compression dans un tableau.

Vient ensuite la compression. Dans la sortie, nous voyons le nouveau package. Mais pourquoi n'est-il pas plus petit ?

Le premier paquet contient toujours les informations sur le port/l'adresse IP, etc. Seuls les paquets suivants deviennent nettement plus petits.

Pour reconvertir le paquet Rohc en un paquet IP normal, nous utilisons la décompression.

try {
    const decompress = r.decompress(compress);
    console.log(decompress);
} catch (e) {
    console.error(e);
}
Uint8Array(52) [
   69,   0,   0,  52,   0,   0,   0,   0,  64,  6, 249,
  112, 192, 168,   0,   1, 192, 168,   0,   2, 72, 101,
  108, 108, 111,  44,  32, 116, 104, 105, 115, 32, 105,
  115,  32, 116, 104, 101,  32, 100,  97, 116, 97,  32,
  112,  97, 121, 108, 111,  97, 100,  33
]

Ce qui est important c'est le début, le premier paquet est compressé et transmis à la destination et la destination a décompressé le paquet, l'instance doit être maintenue. Pour que l'ID de connexion reste connu. Cela signifie que le programme doit maintenir l'instance d'objet en cours d'exécution. Si l'une des deux pages (source avec compression ou destination avec décompression) est arrêtée, les deux pages doivent être redémarrées.

Fonction supplémentaire avec des informations utiles :

État de la dernière compression/décompression

import {Rohc, RohcStatus} from 'node-rohc';

    if (r.getLastStatus() === RohcStatus.ROHC_OK) {
      console.log('All OK');
    }

Pendant la compression ou la décompression, l'état est mémorisé ; cela peut être interrogé à nouveau immédiatement après pour obtenir des informations plus détaillées sur ce qui s'est passé.

Informations sur le dernier paquet compressé/décompressé

console.log(r.compressLastPacketInfo());
console.log(r.decompressLastPacketInfo());
{
  version_major: 0,
  version_minor: 0,
  context_id: 0,
  is_context_init: true,
  context_mode: 1,
  context_state: 1,
  context_used: true,
  profile_id: 4,
  packet_type: 0,
  total_last_uncomp_size: 52,
  header_last_uncomp_size: 20,
  total_last_comp_size: 53,
  header_last_comp_size: 21
}
{
  version_major: 0,
  version_minor: 0,
  context_mode: 2,
  context_state: 3,
  profile_id: 4,
  nr_lost_packets: 0,
  nr_misordered_packets: 0,
  is_duplicated: false,
  corrected_crc_failures: 11745388377929038000,
  corrected_sn_wraparounds: 14987979559889062000,
  corrected_wrong_sn_updates: 12105675798372346000,
  packet_type: 449595,
  total_last_comp_size: 18407961667527770000,
  header_last_comp_size: 1940628627783807,
  total_last_uncomp_size: 18407961667125117000,
  header_last_uncomp_size: 217316637802623
}

Informations sur la dernière compression ou décompression.

Informations générales sur la compression/décompression

console.log(r.compressGeneralInfo());
console.log(r.decompressGeneralInfo());
{
  version_major: 0,
  version_minor: 0,
  contexts_nr: 1,
  packets_nr: 1,
  uncomp_bytes_nr: 52,
  comp_bytes_nr: 53
}
{
  version_major: 0,
  version_minor: 0,
  contexts_nr: 1,
  packets_nr: 1,
  comp_bytes_nr: 53,
  uncomp_bytes_nr: 52,
  corrected_crc_failures: 0,
  corrected_sn_wraparounds: 8518447232180027000,
  corrected_wrong_sn_updates: 4295000063
}

Informations générales sur la compression et la décompression.

Dernier mot

J'espère que vous avez apprécié mon petit post. Je suis toujours ouvert aux améliorations.

Déclaration de sortie Cet article est reproduit sur : https://dev.to/stefanwerfling/nodejs-rohc-11k3?1 En cas de violation, veuillez contacter [email protected] pour le supprimer.
Dernier tutoriel Plus>

Clause de non-responsabilité: Toutes les ressources fournies proviennent en partie d'Internet. En cas de violation de vos droits d'auteur ou d'autres droits et intérêts, veuillez expliquer les raisons détaillées et fournir une preuve du droit d'auteur ou des droits et intérêts, puis l'envoyer à l'adresse e-mail : [email protected]. Nous nous en occuperons pour vous dans les plus brefs délais.

Copyright© 2022 湘ICP备2022001581号-3