"إذا أراد العامل أن يؤدي عمله بشكل جيد، فعليه أولاً أن يشحذ أدواته." - كونفوشيوس، "مختارات كونفوشيوس. لو لينجونج"
الصفحة الأمامية > برمجة > نود جي إس + روهك

نود جي إس + روهك

تم النشر بتاريخ 2024-07-31
تصفح:653

من الفكرة إلى التنفيذ

أود أن أقدم لكم فكرتي وكيف توصلت إلى إعطاء "ROHC" رابطًا في NodeJS.

أردت تنفيذ VPN يعمل عبر Web-Socket. تتمثل المزايا في إخفاء الخدمة عبر HTTPS. مع HTTP3 سيكون هذا أكثر تحسينًا. لذلك بدأت في تجربة وحدة TunTap2 لـ NodeJS، والتي كان عليّ تصحيحها أولاً.

كنت مفتونًا دائمًا بالتكنولوجيا اللاسلكية، وفي مرحلة ما صادفت "LoRa" ومعها مشروع "IP2Lora".

Image description

مصدر الصورة

في هذا المشروع "IP2Lora"، تم اختصار حزم IP لتوفير 40 بايت، وهو أمر مهم جدًا للنقل؛ مع نطاق راديو يبلغ 434 ميجا هرتز أو 868 ميجا هرتز، لا يمكن نقل الكثير.

NodeJS   ROHC

مصدر الصورة

في الرسم يمكنك أن ترى بوضوح كيف يتناقص حجم حزمة IP.

لسوء الحظ لم يكن هناك سوى رابط lib واحد لبيثون.

فلماذا لا تكتب العقدة 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 (يجب تجميع هذا لكل بنية وحدة المعالجة المركزية نفسها).

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
]

تم الآن استيراد الوحدة النمطية وUnit8Array حيث يتم إعطاء حزمة IP إلى كائن Rhoc للضغط.

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
]

المهم هو البداية، يتم ضغط الحزمة الأولى وإرسالها إلى الوجهة وقد قامت الوجهة بفك ضغط الحزمة، ويجب الحفاظ على المثيل. بحيث يبقى معرف الاتصال معروفا. هذا يعني أن البرنامج يجب أن يحافظ على تشغيل مثيل الكائن. إذا تم إيقاف إحدى الصفحتين (المصدر مع الضغط أو الوجهة مع إلغاء الضغط)، فيجب إعادة تشغيل كلتا الصفحتين.

وظيفة إضافية تحتوي على معلومات مفيدة:

آخر حالة ضغط/فك ضغط

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
}

معلومات عامة عن الضغط وفك الضغط.

كلمة أخيرة

أتمنى أن تكون قد استمتعت بمقالتي الصغيرة. أنا منفتح دائمًا على التحسينات.

بيان الافراج تم نشر هذه المقالة على: https://dev.to/stefanwerfling/nodejs-rohc-11k3?1 إذا كان هناك أي انتهاك، يرجى الاتصال بـ [email protected] لحذفه
أحدث البرنامج التعليمي أكثر>

تنصل: جميع الموارد المقدمة هي جزئيًا من الإنترنت. إذا كان هناك أي انتهاك لحقوق الطبع والنشر الخاصة بك أو الحقوق والمصالح الأخرى، فيرجى توضيح الأسباب التفصيلية وتقديم دليل على حقوق الطبع والنشر أو الحقوق والمصالح ثم إرسالها إلى البريد الإلكتروني: [email protected]. سوف نتعامل مع الأمر لك في أقرب وقت ممكن.

Copyright© 2022 湘ICP备2022001581号-3