Maison > interface Web > js tutoriel > NodeJS + ROHC

NodeJS + ROHC

WBOY
Libérer: 2024-07-31 07:05:33
original
595 Les gens l'ont consulté

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

Je voudrais vous présenter mon idée et comment elle est née pour donner une liaison à « ROHC » 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 post 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 ROHC-lib 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
Copier après la connexion

Installation NPM

Maintenant, nous pouvons entrer dans notre projet et installer le module.

cd yourProject
npm i node-rohc
Copier après la connexion

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
Copier après la connexion

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);
Copier après la connexion
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
]
Copier après la connexion
Copier après la connexion

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);
}
Copier après la connexion
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
]
Copier après la connexion

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);
}
Copier après la connexion
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
]
Copier après la connexion
Copier après la connexion

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');
    }
Copier après la connexion

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());
Copier après la connexion
{
  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
}
Copier après la connexion

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());
Copier après la connexion
{
  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
}
Copier après la connexion

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.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:dev.to
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal