أود أن أقدم لكم فكرتي وكيف توصلت إلى إعطاء "ROHC" رابطًا في NodeJS.
أردت تنفيذ VPN يعمل عبر Web-Socket. تتمثل المزايا في إخفاء الخدمة عبر HTTPS. مع HTTP3 سيكون هذا أكثر تحسينًا. لذلك بدأت في تجربة وحدة TunTap2 لـ NodeJS، والتي كان عليّ تصحيحها أولاً.
كنت مفتونًا دائمًا بالتكنولوجيا اللاسلكية، وفي مرحلة ما صادفت "LoRa" ومعها مشروع "IP2Lora".
مصدر الصورة
في هذا المشروع "IP2Lora"، تم اختصار حزم IP لتوفير 40 بايت، وهو أمر مهم جدًا للنقل؛ مع نطاق راديو يبلغ 434 ميجا هرتز أو 868 ميجا هرتز، لا يمكن نقل الكثير.
مصدر الصورة
في الرسم يمكنك أن ترى بوضوح كيف يتناقص حجم حزمة 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
الآن يمكننا الدخول في مشروعنا وتثبيت الوحدة.
cd yourProject npm i node-rohc
علينا الآن إنشاء رابط NodeJS (يجب تجميع هذا لكل بنية وحدة المعالجة المركزية نفسها).
cd yourProject/node_modules/node-rohc npm run build --loglevel verbose
التنصيب قد اكتمل الان.
لنفترض الآن أننا حصلنا على حزمة 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 }
معلومات عامة عن الضغط وفك الضغط.
أتمنى أن تكون قد استمتعت بمقالتي الصغيرة. أنا منفتح دائمًا على التحسينات.
تنصل: جميع الموارد المقدمة هي جزئيًا من الإنترنت. إذا كان هناك أي انتهاك لحقوق الطبع والنشر الخاصة بك أو الحقوق والمصالح الأخرى، فيرجى توضيح الأسباب التفصيلية وتقديم دليل على حقوق الطبع والنشر أو الحقوق والمصالح ثم إرسالها إلى البريد الإلكتروني: [email protected]. سوف نتعامل مع الأمر لك في أقرب وقت ممكن.
Copyright© 2022 湘ICP备2022001581号-3