Saya ingin memperkenalkan anda kepada idea saya dan bagaimana ia terhasil untuk memberikan “ROHC” ikatan dalam NodeJS.
Saya mahu melaksanakan VPN yang dijalankan melalui Web-Socket. Kelebihannya ialah perkhidmatan itu akan disembunyikan melalui HTTPS. Dengan HTTP3 ini akan menjadi lebih dioptimumkan. Jadi saya mula bermain-main dengan Modul TunTap2 untuk NodeJS, yang perlu saya tampal dahulu.
Sentiasa terpesona dengan teknologi wayarles, pada satu ketika saya terjumpa "LoRa" dan dengannya projek "IP2Lora".
Sumber imej
Dalam projek "IP2Lora" ini, paket IP dipendekkan untuk menjimatkan 40 bait, yang sangat penting untuk pemindahan; dengan jalur radio 434 MHz atau 868 MHz, tidak banyak yang boleh dipindahkan.
Sumber imej
Dalam grafik anda boleh melihat dengan jelas bagaimana saiz paket IP berkurangan.
Malangnya terdapat hanya satu lib yang mengikat untuk Python.
Jadi mengapa tidak menulis lib nod yang mengikat diri anda!?
Hasilnya kini boleh dilihat.
https://www.npmjs.com/package/node-rohc
Anda boleh mengetahui lebih lanjut tentang cara ROHC berfungsi dalam pautan ke projek atau hanya mencarinya. Saya tidak akan menerangkannya di sini supaya tidak membuat siaran terlalu panjang.
Saya memasang di bawah Linux Debian/Mint. Saya rasa ini sepatutnya serupa dengan versi Linux yang lain.
(Dengan cara ini, saya juga terpaksa menampal ROHC-lib ke kernel baharu.)
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
Sekarang kita boleh pergi ke projek kita dan memasang modul.
cd yourProject npm i node-rohc
Sekarang kita perlu mencipta pengikatan NodeJS (ini perlu disusun untuk setiap seni bina CPU itu sendiri).
cd yourProject/node_modules/node-rohc npm run build --loglevel verbose
Pemasangan kini selesai.
Sekarang mari kita anggap kita mendapat paket IP yang ingin kita mampatkan ke dalam paket berikut untuk menjimatkan bait.
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 ]
Modul kini diimport dan Unit8Array di mana paket IP diberikan kepada objek Rhoc untuk dimampatkan.
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 ]
Dalam pembina objek Rohc kami menentukan profil yang harus digunakan untuk pemampatan dalam tatasusunan.
Kemudian datang pemampatan. Dalam output kita melihat pakej baru. Tetapi mengapa ia tidak lebih kecil?
Paket pertama masih mengandungi maklumat tentang port/Alamat IP dll. Hanya paket berikut menjadi lebih kecil dengan ketara.
Untuk menukar paket Rohc kembali kepada paket IP biasa kami menggunakan nyahmampat.
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 ]
Apa yang penting adalah permulaan, paket pertama dimampatkan dan dihantar ke destinasi dan destinasi telah menyahmampat paket, contoh mesti dikekalkan. Supaya ID sambungan kekal diketahui. Ini bermakna program perlu memastikan contoh objek berjalan. Jika salah satu daripada dua halaman (sumber dengan pemampatan atau destinasi dengan penyahmampatan) dihentikan, kedua-dua halaman mesti dimulakan semula.
Fungsi tambahan dengan maklumat berguna:
import {Rohc, RohcStatus} from 'node-rohc'; if (r.getLastStatus() === RohcStatus.ROHC_OK) { console.log('All OK'); }
Semasa pemampatan atau penyahmampatan, status diingati; ini boleh ditanya semula serta-merta selepas itu untuk mendapatkan maklumat yang lebih terperinci tentang perkara yang berlaku.
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 }
Maklumat tentang pemampatan atau penyahmampatan terakhir.
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 }
Maklumat am tentang pemampatan dan penyahmampatan.
Saya harap anda menikmati siaran kecil saya. Saya sentiasa terbuka kepada penambahbaikan.
Atas ialah kandungan terperinci NodeJS + ROHC. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!