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 ».
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.
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.
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
Maintenant, nous pouvons entrer dans 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.
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 :
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é.
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.
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.
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!