首頁  >  文章  >  web前端  >  NodeJS + ROHC

NodeJS + ROHC

WBOY
WBOY原創
2024-07-31 07:05:33537瀏覽

從想法到實施

我想向您介紹我的想法以及它是如何在 NodeJS 中為“ROHC”提供綁定的。

我想實作一個透過 Web-Socket 運行的 VPN。優點是服務將透過 HTTPS 隱藏。如果使用 HTTP3,這將會更加最佳化。所以我開始嘗試 NodeJS 的 TunTap2 模組,我必須先修補它。

一直對無線技術著迷,在某個時候,我遇到了「LoRa」以及與之相關的專案「IP2Lora」。

Image description

圖片來源

在「IP2Lora」這個專案中,IP資料包被縮短以節省40字節,這對於傳輸非常重要;無線電頻段為 434 MHz 或 868 MHz,無法傳輸那麼多。

NodeJS + ROHC

圖片來源

在圖中您可以清楚地看到 IP 封包大小如何減少。

不幸的是,Python 只有一個 lib 綁定。

那為什麼不自己寫一個節點庫綁定呢! ?

現在可以看到結果了。
https://www.npmjs.com/package/node-rohc

您可以在專案連結中找到有關 ROHC 如何運作的更多信息,或直接搜尋它。這裡就不解釋了,免得貼文太長。

安裝庫

我安裝在Linux Debian/Mint下。我想這應該和其他Linux版本類似。

(順便說一句,我還必須將 ROHC-lib 修補到新核心。)

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

安裝NPM

現在我們可以進入我們的專案並安裝模組。

cd yourProject
npm i node-rohc

現在我們必須建立 NodeJS 綁定(必須為每個 CPU 架構本身編譯)。

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

安裝現已完成。

編碼/API使用

現在假設我們得到一個 IP 封包,我們希望將其壓縮為以下封包以節省位元組。

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
]

模組現已匯入,其中 IP 封包被賦予 Rhoc 物件進行壓縮的 Unit8Array。

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
]

在 Rohc 物件的建構子中,我們指定應用於陣列中壓縮的設定檔。

然後是壓縮。在輸出中我們看到新的包。但為什麼不小一點呢?

第一個封包仍包含連接埠/IP位址等資訊。只有後面的資料包變得明顯更小。

為了將 Rohc 封包轉換回正常的 IP 封包,我們使用解壓縮。

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
]

重要的是開始,第一個資料包被壓縮並傳輸到目的地並且目的地已經解壓縮資料包,實例必須被維護。以便連線 ID 保持已知。這意味著程式必須保持物件實例運行。如果兩個頁面(壓縮的來源頁面或解壓縮的目標頁面)之一停止,則必須重新啟動兩個頁面。

包含有用資訊的附加功能:

上次壓縮/解壓縮狀態

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

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

在壓縮或解壓過程中,狀態被記住;之後可以立即再次查詢,以獲取有關發生的情況的更多詳細資訊。

最後壓縮/解壓縮資料包信息

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
}

有關上次壓縮或解壓的資訊。

一般壓縮/解壓縮訊息

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
}

有關壓縮和解壓縮的一般資訊。

最後一句話

我希望你喜歡我的小貼文。我始終樂於接受改進。

以上是NodeJS + ROHC的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn