
يوفر مشروع الإنترنت غير المرئي (المشار إليه فيما يلي باسم I2P) للمطورين نظامًا أساسيًا لتطوير التطبيقات مع متطلبات خصوصية المستخدم المحسنة. هذه شبكة افتراضية فوق الإنترنت العادي حيث يمكن للعقد تبادل البيانات دون الكشف عن عنوان IP الحقيقي الخاص بها. بدلاً من عناوين IP داخل الإنترنت غير المرئي ، تحدث اتصالات بين عناوين افتراضية تسمى I2P Destination. يمكنك الحصول على أي عدد من هذه العناوين وتغييرها حتى لكل اتصال ، فهي لا تزود الجانب الآخر بأي معلومات حول عنوان IP الحقيقي للعميل.
توضح هذه المقالة الأشياء الأساسية التي تحتاج إلى معرفتها لكتابة تطبيقات I2P. يتم توفير أمثلة التعليمات البرمجية في Python باستخدام إطار غير متزامن مضمّن غير متزامن.
تمكين SAM API وتثبيت i2plib
تقدم I2P العديد من واجهات برمجة التطبيقات للتفاعل مع تطبيقات العميل. بالنسبة لتطبيقات Java ، يتم استخدام I2CP ؛ أما بالنسبة لتطبيقات خادم العميل العادية ، فيمكن استخدام بروكسيات I2PTunnel و HTTP و Socks. سنقوم بتقديم طلب في Python ، لذلك اختر SAM . افتراضيًا ، في عميل Java الأصلي ، يتم إيقاف تشغيل SAM API ، لذا تحتاج إلى تمكينها. انتقل إلى وحدة تحكم الويب لجهاز التوجيه I2P ، الصفحة "I2P internals" -> "Clients". حدد المربع "تشغيل عند بدء التشغيل" وانقر على "ابدأ" ، ثم "حفظ تكوين العميل".

في C ++ ، يتم تمكين عميل i2pd SAM بالفعل افتراضيًا.
لسهولة استخدام SAM API ، كتبت مكتبة i2plib Python. يمكنك تثبيته عبر النقطة أو تنزيل شفرة المصدر من GitHub.
pip install i2plib
نظرًا لأن هذه المكتبة تعمل مع إطار غير متزامن مدمج ، ضع في اعتبارك أن أمثلة التعليمات البرمجية مأخوذة أيضًا من الوظائف غير المتزامنة (coroutines) التي تعمل في حلقة الحدث. توجد أمثلة استخدام إضافية في المستودع .
الوجهة وإنشاء الجلسة
في جوهرها ، I2P Destination عبارة عن مجموعة من مفاتيح التشفير وتوقيع البيانات. يتم نشر المفاتيح العامة من هذه الحزمة على شبكة I2P ويتم استخدامها بدلاً من عنوان IP لإنشاء اتصالات.
سننشئ وجهة i2plib.Destination ، والتي سنستخدمها في المستقبل:
dest = await i2plib.new_destination() print(dest.base32 + ".b32.i2p")
عنوان base32 هو التجزئة التي يستطيع الزملاء الآخرون من خلالها العثور على وجهتك على الشبكة. إذا كنت تخطط لاستخدام هذه الوجهة في برنامجك بشكل مستمر ، فاحفظ محتويات dest.private_key.data في ملف محلي.
يمكنك الآن إنشاء جلسة SAM ، مما يعني حرفيًا جعل هذه الوجهة عبر الإنترنت:
session_nickname = "test-i2p"
من المهم ملاحظة أن الوجهة ستكون متاحة عبر الإنترنت طالما أن مقبس session_writer مفتوحًا. إذا كنت تريد "إيقاف" هذه الوجهة من الشبكة ، فاتصل على session_writer.close ().
عمل اتصالات صادرة
الآن بعد أن أصبحت الوجهة على الإنترنت ، يمكننا استخدامها للتواصل مع العقد الأخرى. على سبيل المثال ، اتصل بالعقدة "udhdrtrcetjm5sxzskjyr5ztpeszydbh4dpl3pl4utgqqw2v4jna.b32.i2p" ، أرسل طلب HTTP GET واقرأ الاستجابة (هناك خادم ويب "i2p-projekt.i2p"):
remote_host = "udhdrtrcetjm5sxzskjyr5ztpeszydbh4dpl3pl4utgqqw2v4jna.b32.i2p" reader, writer = await i2plib.stream_connect(session_nickname, remote_host) writer.write("GET /en/ HTTP/1.0\nHost: {}\r\n\r\n".format(remote_host).encode()) buflen, resp = 4096, b"" while 1: data = await reader.read(buflen) if len(data) > 0: resp += data else: break writer.close() print(resp.decode())
اقبل الاتصالات الواردة
عند الاتصال بمضيف آخر ، كما ترى ، كل شيء بسيط ، ولكن مع قبول الوارد ، هناك فارق بسيط واحد. عندما يتصل بك عميل جديد ، يرسل SAM إلى مأخذ ASCII سلسلة مع الوجهة لهذا العميل. نظرًا لأن الوجهة والبيانات يمكن أن تأتي في قطعة واحدة ، فأنت بحاجة إلى التفكير في ذلك.
هذا هو شكل خادم PING-PONG البسيط ، الذي يقبل الاتصال الوارد ويحفظ وجهة العميل إلى متغير الوجهة البعيدة ويرسل PONG مرة أخرى:
async def handle_client(incoming, reader, writer): """ """ dest, data = incoming.split(b"\n", 1) remote_destination = i2plib.Destination(dest.decode()) if not data: data = await reader.read(BUFFER_SIZE) if data == b"PING": writer.write(b"PONG") writer.close()
يصف استخدام بروتوكول التدفق ، الذي يؤدي وظائف TCP / IP على شبكة I2P. توفر واجهة برمجة تطبيقات SAM أيضًا القدرة على إرسال واستقبال مخططات البيانات المجهولة ، المشابهة لبروتوكول UDP. هذه الوظيفة غير متاحة بعد في i2plib وستتم إضافتها لاحقًا.
هذه هي المعلومات الأساسية فقط ، ولكنها كافية بالفعل لبدء مشروعك في I2P. تعد شبكة الإنترنت غير المرئية مناسبة لكتابة العديد من التطبيقات التي يكون من المهم فيها أولاً الحفاظ على خصوصية المستخدمين. لا تفرض الشبكة أي قيود على المطورين ، يمكن أن تكون إما خادم عميل أو تطبيق P2P.