"यदि कोई कर्मचारी अपना काम अच्छी तरह से करना चाहता है, तो उसे पहले अपने औजारों को तेज करना होगा।" - कन्फ्यूशियस, "द एनालेक्ट्स ऑफ कन्फ्यूशियस। लू लिंगगोंग"
मुखपृष्ठ > प्रोग्रामिंग > नोडजेएस + आरओएचसी

नोडजेएस + आरओएचसी

2024-07-31 को प्रकाशित
ब्राउज़ करें:503

विचार से कार्यान्वयन तक

मैं आपको अपने विचार से परिचित कराना चाहता हूं और कैसे "आरओएचसी" को नोडजेएस में बाइंडिंग देना संभव हुआ।

मैं एक वीपीएन लागू करना चाहता था जो वेब-सॉकेट पर चलता हो। इसका फायदा यह होगा कि सेवा HTTPS पर छुपी रहेगी। HTTP3 के साथ यह और भी अधिक अनुकूलित होगा। इसलिए मैंने NodeJS के लिए TunTap2 मॉड्यूल के साथ खेलना शुरू किया, जिसे मुझे पहले पैच करना था।

हमेशा वायरलेस तकनीक से आकर्षित रहने के कारण, किसी समय मुझे "लोरा" और इसके साथ एक प्रोजेक्ट "आईपी2लोरा" मिला।

Image description

छवि स्रोत

इस प्रोजेक्ट "आईपी2लोरा" में, 40 बाइट्स बचाने के लिए आईपी पैकेट को छोटा किया गया था, जो स्थानांतरण के लिए बहुत महत्वपूर्ण है; 434 मेगाहर्ट्ज या 868 मेगाहर्ट्ज के रेडियो बैंड के साथ, इतना अधिक स्थानांतरित नहीं किया जा सकता है।

NodeJS   ROHC

छवि स्रोत

ग्राफ़िक में आप स्पष्ट रूप से देख सकते हैं कि आईपी पैकेट का आकार कैसे घटता है।

दुर्भाग्य से पायथन के लिए केवल एक लिब बाइंडिंग थी।

तो आप स्वयं को बाइंडिंग करते हुए एक नोड लिब क्यों नहीं लिखते!?

परिणाम अब देखा जा सकता है।
https://www.npmjs.com/package/node-rohc

आप परियोजना के लिंक में आरओएचसी कैसे काम करता है इसके बारे में अधिक जानकारी प्राप्त कर सकते हैं या बस इसे खोज सकते हैं। मैं इसे यहां नहीं समझाऊंगा ताकि पोस्ट बहुत लंबी न हो जाए।

इंस्टालेशन लिब

मैंने लिनक्स डेबियन/मिंट के अंतर्गत स्थापित किया है। मुझे लगता है कि यह अन्य 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

स्थापना एनपीएम

अब हम अपने प्रोजेक्ट में जा सकते हैं और मॉड्यूल इंस्टॉल कर सकते हैं।

cd yourProject
npm i node-rohc

अब हमें NodeJS बाइंडिंग बनानी होगी (इसे प्रत्येक CPU आर्किटेक्चर के लिए स्वयं संकलित करना होगा)।

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

इंस्टॉलेशन अब पूरा हो गया है।

कोडिंग/एपीआई उपयोग

अब मान लें कि हमें एक आईपी पैकेट मिलता है जिसे हम बाइट्स को बचाने के लिए निम्नलिखित पैकेट में संपीड़ित करना चाहते हैं।

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
]

मॉड्यूल अब आयात किया गया है और यूनिट8एरे जिसमें आईपी पैकेट संपीड़न के लिए 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
]

रोहक ऑब्जेक्ट के कंस्ट्रक्टर में हम उन प्रोफाइल को निर्दिष्ट करते हैं जिनका उपयोग किसी ऐरे में संपीड़न के लिए किया जाना चाहिए।

फिर संपीड़न आता है। आउटपुट में हम नया पैकेज देखते हैं। लेकिन यह छोटा क्यों नहीं है?

पहले पैकेट में अभी भी पोर्ट/आईपी-एड्रेस आदि के बारे में जानकारी है। केवल निम्नलिखित पैकेट काफी छोटे हो गए हैं।

रोहक पैकेट को वापस सामान्य आईपी पैकेट में बदलने के लिए हम डीकंप्रेस का उपयोग करते हैं।

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