NodeJS + ROHC

WBOY
Lepaskan: 2024-07-31 07:05:33
asal
575 orang telah melayarinya

Daripada idea kepada pelaksanaan

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".

Image description

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.

NodeJS + ROHC

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.

Lib Pemasangan

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
Salin selepas log masuk

NPM pemasangan

Sekarang kita boleh pergi ke projek kita dan memasang modul.

cd yourProject
npm i node-rohc
Salin selepas log masuk

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
Salin selepas log masuk

Pemasangan kini selesai.

Pengekodan/penggunaan API

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);
Salin selepas log masuk
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
]
Salin selepas log masuk
Salin selepas log masuk

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);
}
Salin selepas log masuk
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
]
Salin selepas log masuk

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);
}
Salin selepas log masuk
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
]
Salin selepas log masuk
Salin selepas log masuk

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:

Status mampat/nyahmampat terakhir

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

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

Semasa pemampatan atau penyahmampatan, status diingati; ini boleh ditanya semula serta-merta selepas itu untuk mendapatkan maklumat yang lebih terperinci tentang perkara yang berlaku.

Mampat/nyahmampat maklumat paket terakhir

console.log(r.compressLastPacketInfo());
console.log(r.decompressLastPacketInfo());
Salin selepas log masuk
{
  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
}
Salin selepas log masuk

Maklumat tentang pemampatan atau penyahmampatan terakhir.

Maklumat mampat/nyahmampat am

console.log(r.compressGeneralInfo());
console.log(r.decompressGeneralInfo());
Salin selepas log masuk
{
  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
}
Salin selepas log masuk

Maklumat am tentang pemampatan dan penyahmampatan.

Kata akhir

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!

sumber:dev.to
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan