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

NodeJS + ROHC

WBOY
WBOY原创
2024-07-31 07:05:33572浏览

从想法到实施

我想向您介绍我的想法以及它是如何在 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