تم إنشاء هذه الترجمة باستخدام التعلم الآلي وقد لا تكون دقيقة بنسبة 100%. عرض النسخة الإنجليزية

مواصفات SAM V1

بروتوكول الرسائل المجهولة البسيطة القديم الإصدار 1 (مُهمل)

تحذير - مهجور - غير مدعوم - استخدم SAMv3

المحدد أدناه هو الإصدار 1 من بروتوكول عميل بسيط للتفاعل مع I2P. البدائل الأحدث: SAM V2 ، SAM V3 ، BOB .

مكتبات اللغة لواجهة برمجة التطبيقات SAMv1

  • C
  • C#
  • Perl
  • Python

المكتبات موجودة في مستودع الكود المصدري لـ I2P.

تغييرات I2P 0.9.14

الإصدار المُبلغ عنه يبقى “1.0”.

  • DEST GENERATE يدعم الآن معامل SIGNATURE_TYPE.
  • معامل MIN في HELLO VERSION أصبح اختيارياً الآن.
  • معاملا MIN و MAX في HELLO VERSION يدعمان الآن الإصدارات أحادية الرقم مثل “3”.

بروتوكول الإصدار 1

تطبيق العميل يتواصل مع جسر SAM، والذي يتعامل مع جميع وظائف I2P (باستخدام مكتبة التدفق للتدفقات الافتراضية، أو I2CP مباشرة للرسائل غير المتزامنة).

جميع اتصالات العميل<–>جسر SAM غير مشفرة وغير مصادق عليها عبر مقبس TCP واحد. يجب حماية الوصول إلى جسر SAM من خلال جدران الحماية أو وسائل أخرى (ربما يحتوي الجسر على قوائم التحكم في الوصول ACLs لتحديد عناوين IP التي يقبل الاتصالات منها).

جميع رسائل SAM هذه يتم إرسالها على سطر واحد بتنسيق ASCII عادي، وتنتهي بحرف السطر الجديد (\n). التنسيق المعروض أدناه هو فقط لسهولة القراءة، وبينما يجب أن تبقى الكلمتان الأوليان في كل رسالة بترتيبهما المحدد، يمكن تغيير ترتيب أزواج key=value (مثلاً “ONE TWO A=B C=D” أو “ONE TWO C=D A=B” كلاهما تركيب صحيح تماماً). بالإضافة إلى ذلك، البروتوكول حساس لحالة الأحرف.

يتم تفسير رسائل SAM بترميز UTF-8. يجب فصل أزواج Key=value بمسافة واحدة فقط. يمكن وضع القيم بين علامتي اقتباس مزدوجتين إذا كانت تحتوي على مسافات، مثل key=“long value text”. لا توجد آلية للهروب من الأحرف الخاصة.

يمكن أن يتخذ التواصل ثلاثة أشكال مميزة:

مصافحة اتصال SAM

لا يمكن أن يحدث أي تواصل SAM حتى يتفق العميل والجسر على إصدار البروتوكول، وهذا يتم عن طريق إرسال العميل لـ HELLO وإرسال الجسر لـ HELLO REPLY:

HELLO VERSION MIN=$min MAX=$max

و

HELLO REPLY RESULT=$result VERSION=1.0

اعتباراً من I2P 0.9.14، معامل MIN اختياري. يجب توفير معامل MAX ويجب أن يكون أكبر من أو يساوي “1” وأقل من “2” لاستخدام الإصدار 1.

قد تكون قيمة RESULT واحدة من:

  • OK
  • NOVERSION

جلسات SAM

يتم إنشاء جلسة SAM عندما يفتح العميل مقبس اتصال إلى جسر SAM، ويقوم بتشغيل مصافحة، وإرسال رسالة SESSION CREATE، وتنتهي الجلسة عند قطع اتصال المقبس.

كل I2P Destination يمكن استخدامه لجلسة SAM واحدة فقط في كل مرة، ويمكنه استخدام شكل واحد فقط من تلك الأشكال (الرسائل المستلمة عبر الأشكال الأخرى يتم إسقاطها).

رسالة SESSION CREATE التي يرسلها العميل إلى الجسر كما يلي:

SESSION CREATE
        STYLE={STREAM,DATAGRAM,RAW}
        DESTINATION={$name,TRANSIENT}
        [DIRECTION={BOTH,RECEIVE,CREATE}]
        [option=value]*

DESTINATION يحدد أي وجهة يجب استخدامها لإرسال واستقبال الرسائل/التدفقات. إذا تم إعطاء $name، فإن جسر SAM يبحث في تخزينه المحلي الخاص (ملف sam.keys) عن وجهة مرتبطة (ومفتاح خاص). إذا لم توجد رابطة تطابق ذلك الاسم، فإنه ينشئ واحدة جديدة. إذا تم تحديد الوجهة كـ TRANSIENT، فإنه ينشئ واحدة جديدة دائماً.

لاحظ أن DESTINATION هو معرف، وليس بيانات مُرمزة بـ Base 64. لتحديد الوجهة، يجب عليك استخدام SAM V3 .

يمكن تحديد DIRECTION لجلسات STREAM فقط، مما يوجه الجسر أن العميل سيقوم إما بإنشاء أو استقبال التدفقات، أو كليهما. إذا لم يتم تحديد هذا، فسيتم افتراض BOTH. محاولة إنشاء تدفق صادر عندما DIRECTION=RECEIVE يجب أن ينتج عنه خطأ، والتدفقات الواردة عندما DIRECTION=CREATE سيتم تجاهلها.

يجب إدخال الخيارات الإضافية المُعطاة في تكوين جلسة I2P إذا لم يتم تفسيرها بواسطة جسر SAM (مثل “tunnels.depthInbound=0”). هذه الخيارات موثقة أدناه.

جسر SAM نفسه يجب أن يكون مكوناً مسبقاً لتحديد أي router يجب أن يتواصل معه عبر I2P (رغم أنه إذا لزم الأمر قد تكون هناك طريقة لتوفير تخطي للإعدادات، مثل i2cp.tcp.host=localhost و i2cp.tcp.port=7654).

بعد استلام رسالة إنشاء الجلسة، سيرد جسر SAM برسالة حالة الجلسة، كما يلي:

SESSION STATUS
        RESULT=$result
        DESTINATION={$name,TRANSIENT}
        [MESSAGE=...]

قد تكون قيمة RESULT واحدة من:

  • OK
  • DUPLICATED_DEST
  • I2P_ERROR
  • INVALID_KEY

إذا لم تكن الحالة موافقة، يجب أن تحتوي MESSAGE على معلومات قابلة للقراءة البشرية توضح سبب عدم إمكانية إنشاء الجلسة.

لاحظ أنه لا يتم إعطاء أي تحذير إذا لم يتم العثور على $name ويتم إنشاء وجهة مؤقتة بدلاً من ذلك. لاحظ أن الوجهة المؤقتة الفعلية بتشفير base 64 لا يتم إخراجها في الرد؛ بل هي $name أو TRANSIENT كما تم توفيرها في SESSION CREATE. إذا كنت بحاجة إلى هذه الميزات، يجب عليك استخدام SAM V3 .

تدفقات SAM الافتراضية

يُضمن إرسال التدفقات الافتراضية بشكل موثوق وبالترتيب الصحيح، مع إشعارات الفشل والنجاح بمجرد توفرها.

بعد إنشاء الجلسة مع STYLE=STREAM، يمكن لكل من العميل وجسر SAM إرسال رسائل مختلفة بشكل غير متزامن ذهاباً وإياباً لإدارة التدفقات، كما هو مذكور أدناه:

STREAM CONNECT
       ID=$id
       DESTINATION=$destination

هذا ينشئ اتصال افتراضي جديد من الوجهة المحلية إلى النظير المحدد، ويضع عليه علامة بمعرف فريد محدود النطاق للجلسة. المعرف الفريد هو عدد صحيح ASCII بالنظام العشري من 1 حتى (2^31-1).

الـ $destination هو الـ base 64 للـ Destination ، والذي يتكون من 516 حرف base 64 أو أكثر (387 بايت أو أكثر في النظام الثنائي)، حسب نوع التوقيع.

يجب على جسر SAM الرد على هذا برسالة حالة التدفق:

STREAM STATUS
       RESULT=$result
       ID=$id
       [MESSAGE=...]

قد تكون قيمة RESULT واحدة من:

  • OK
  • CANT_REACH_PEER
  • I2P_ERROR
  • INVALID_KEY
  • TIMEOUT

إذا كان RESULT هو OK، فإن الوجهة المحددة متاحة وقد صرحت بالاتصال؛ وإذا لم يكن الاتصال ممكناً (انتهاء مهلة الوقت، إلخ)، فسيحتوي RESULT على قيمة الخطأ المناسبة (مصحوبة برسالة MESSAGE اختيارية قابلة للقراءة البشرية).

في الطرف المستقبِل، يقوم جسر SAM بإشعار العميل ببساطة كما يلي:

STREAM CONNECTED
       DESTINATION=$destination
       ID=$id

هذا يخبر العميل أن الوجهة المحددة قد أنشأت اتصالاً افتراضياً معه. سيتم وضع علامة على تدفق البيانات التالي بالمعرف الفريد المحدد، وهو عدد صحيح ASCII أساس 10 من -1 إلى -(2^31-1).

الـ $destination هو base 64 للـ Destination ، والذي يتكون من 516 حرف base 64 أو أكثر (387 بايت أو أكثر في النظام الثنائي)، حسب نوع التوقيع.

عندما يريد العميل إرسال البيانات عبر الاتصال الافتراضي، فإنه يفعل ذلك كما يلي:

STREAM SEND
       ID=$id
       SIZE=$numBytes\n[$numBytes of data]

هذا يضيف البيانات المحددة إلى المخزن المؤقت الذي يتم إرساله إلى النظير عبر الاتصال الافتراضي. حجم الإرسال $numBytes هو عدد البايتات 8bit المتضمنة بعد السطر الجديد، والتي قد تكون من 1 إلى 32768 (32KB).

سيقوم جسر SAM بعدها ببذل قصارى جهده لتسليم الرسالة بأسرع وأكفأ طريقة ممكنة، ربما يقوم بتخزين عدة رسائل SEND معاً في المخزن المؤقت. إذا كان هناك خطأ في تسليم البيانات، أو إذا أغلق الطرف البعيد الاتصال، فسيخبر جسر SAM العميل:

STREAM CLOSED
       RESULT=$result
       ID=$id
       [MESSAGE=...]

قد تكون قيمة RESULT إحدى القيم التالية:

  • OK
  • CANT_REACH_PEER
  • I2P_ERROR
  • PEER_NOT_FOUND
  • TIMEOUT

إذا تم إغلاق الاتصال بشكل صحيح من قبل العقدة الأخرى، يتم تعيين $result إلى OK. إذا لم يكن $result هو OK، فقد يحمل MESSAGE رسالة وصفية، مثل “peer unreachable”، إلخ. عندما يريد العميل إغلاق الاتصال، يرسل إلى جسر SAM رسالة الإغلاق:

STREAM CLOSE
       ID=$id

يقوم الجسر بعد ذلك بتنظيف ما يحتاج إليه ويتخلص من هذا المعرف - لا يمكن إرسال أو استقبال أي رسائل أخرى عليه.

بالنسبة للطرف الآخر من الاتصال، عندما يرسل النظير بعض البيانات وتصبح متاحة للعميل، فإن جسر SAM سيقوم بتسليمها فوراً:

STREAM RECEIVED
       ID=$id
       SIZE=$numBytes\n[$numBytes of data]

يتم إغلاق جميع التدفقات ضمنياً عند قطع الاتصال بين جسر SAM والعميل.

SAM Repliable Datagrams

بينما لا يحتوي I2P بطبيعته على عنوان FROM، يتم توفير طبقة إضافية لسهولة الاستخدام كـ repliable datagrams - رسائل غير مرتبة وغير موثوقة تصل إلى 31744 بايت تتضمن عنوان FROM (مما يترك حتى 1 كيلوبايت لمواد الرأس). يتم التحقق من صحة عنوان FROM هذا داخلياً بواسطة SAM (باستخدام مفتاح التوقيع الخاص بالوجهة للتحقق من المصدر) ويتضمن منع إعادة التشغيل.

الحد الأدنى للحجم هو 1. للحصول على أفضل موثوقية في التسليم، الحد الأقصى الموصى به للحجم هو حوالي 11 كيلو بايت.

بعد إنشاء جلسة SAM مع STYLE=DATAGRAM، يمكن للعميل إرسال جسر SAM:

DATAGRAM SEND
         DESTINATION=$destination
         SIZE=$numBytes\n[$numBytes of data]

عندما يصل datagram، يقوم الجسر بتسليمه إلى العميل عبر:

DATAGRAM RECEIVED
         DESTINATION=$destination
         SIZE=$numBytes\n[$numBytes of data]

الـ $destination هو الترميز base 64 لـ Destination ، والذي يتكون من 516 حرف base 64 أو أكثر (387 بايت أو أكثر في النظام الثنائي)، اعتماداً على نوع التوقيع.

جسر SAM لا يكشف أبداً للعميل رؤوس المصادقة أو الحقول الأخرى، بل فقط البيانات التي قدمها المرسل. يستمر هذا حتى إغلاق الجلسة (عندما يقطع العميل الاتصال).

SAM Anonymous Datagrams

من خلال الاستفادة القصوى من عرض النطاق الترددي في I2P، يتيح SAM للعملاء إرسال واستقبال البيانات المجهولة، تاركاً معلومات المصادقة والرد للعميل نفسه. هذه البيانات غير موثوقة وغير مرتبة، وقد تصل إلى 32768 بايت.

الحد الأدنى للحجم هو 1. للحصول على أفضل موثوقية في التسليم، الحد الأقصى الموصى به للحجم هو حوالي 11 كيلوبايت.

بعد إنشاء جلسة SAM مع STYLE=RAW، يمكن للعميل إرسال جسر SAM:

RAW SEND
    DESTINATION=$destination
    SIZE=$numBytes\n[$numBytes of data]

الـ $destination هو الترميز base 64 لـ Destination ، والذي يتكون من 516 حرف base 64 أو أكثر (387 بايت أو أكثر في الشكل الثنائي)، حسب نوع التوقيع.

عندما يصل datagram خام، يقوم الجسر بتسليمه إلى العميل عبر:

RAW RECEIVED
    SIZE=$numBytes\n[$numBytes of data]

وظائف أداة SAM

يمكن للعميل استخدام الرسالة التالية لاستعلام جسر SAM حول تحليل الأسماء:

NAMING LOOKUP
       NAME=$name

والذي يتم الرد عليه بواسطة

NAMING REPLY
       RESULT=$result
       NAME=$name
       [VALUE=$destination]
       [MESSAGE=$message]

قد تكون قيمة RESULT إحدى القيم التالية:

  • OK
  • INVALID_KEY
  • KEY_NOT_FOUND

إذا كان NAME=ME، فإن الرد سيحتوي على الوجهة المستخدمة من قبل الجلسة الحالية (مفيد إذا كنت تستخدم جلسة TRANSIENT). إذا لم يكن $result هو OK، فقد تحمل MESSAGE رسالة وصفية، مثل “تنسيق خاطئ”، إلخ.

الـ $destination هو الترميز base 64 لـ Destination ، والذي يتكون من 516 حرف base 64 أو أكثر (387 بايت أو أكثر في النظام الثنائي)، اعتماداً على نوع التوقيع.

يمكن إنتاج مفاتيح base64 العامة والخاصة باستخدام الرسالة التالية:

DEST GENERATE

والتي تتم الإجابة عليها بواسطة

DEST REPLY
     PUB=$destination
     PRIV=$privkey

اعتباراً من I2P 0.9.14، يتم دعم معامل اختياري SIGNATURE_TYPE. قيمة SIGNATURE_TYPE قد تكون أي اسم (مثل ECDSA_SHA256_P256، غير حساس لحالة الأحرف) أو رقم (مثل 1) مدعوم بواسطة Key Certificates . القيمة الافتراضية هي DSA_SHA1.

الـ $destination هو الترميز base 64 لـ Destination ، والذي يتكون من 516 حرف base 64 أو أكثر (387 بايت أو أكثر في الشكل الثنائي)، حسب نوع التوقيع.

إن $privkey هو الترميز الأساسي 64 لتسلسل Destination متبوعًا بـ Private Key متبوعًا بـ Signing Private Key ، والذي يتكون من 884 حرف أو أكثر في الترميز الأساسي 64 (663 بايت أو أكثر في النظام الثنائي)، اعتمادًا على نوع التوقيع.

قيم RESULT

هذه هي القيم التي يمكن أن يحملها حقل RESULT، مع معانيها:

القيمةالمعنى
OKتمت العملية بنجاح
CANT_REACH_PEERالنظير موجود، لكن لا يمكن الوصول إليه
DUPLICATED_DESTالوجهة المحددة قيد الاستخدام بالفعل
I2P_ERRORخطأ I2P عام (مثل انقطاع I2CP، إلخ.)
INVALID_KEYالمفتاح المحدد غير صالح (تنسيق خاطئ، إلخ.)
KEY_NOT_FOUNDنظام التسمية لا يستطيع حل الاسم المعطى
PEER_NOT_FOUNDلا يمكن العثور على النظير في الشبكة
TIMEOUTانتهت المهلة الزمنية أثناء انتظار حدث (مثل رد النظير)

خيارات Tunnel وI2CP والـ Streaming

يمكن تمرير هذه الخيارات كأزواج name=value في نهاية سطر SAM SESSION CREATE.

جميع الجلسات قد تتضمن خيارات I2CP مثل أطوال tunnel . جلسات STREAM قد تتضمن خيارات مكتبة Streaming . راجع تلك المراجع للحصول على أسماء الخيارات والقيم الافتراضية.

ملاحظات Base 64

يجب أن يستخدم ترميز Base 64 الأبجدية القياسية لـ I2P وهي “A-Z, a-z, 0-9, -, ~”.

تطبيقات مكتبة العميل

مكتبات العميل متوفرة لـ C، C++، C#، Perl، و Python. هذه موجودة في مجلد apps/sam/ في حزمة مصدر I2P.

إعداد SAM الافتراضي

منفذ SAM الافتراضي هو 7656. SAM غير مُفعّل افتراضياً في I2P Router؛ يجب تشغيله يدوياً، أو تكوينه للبدء تلقائياً، في صفحة تكوين العملاء في وحدة تحكم الموجه، أو في ملف clients.config.

Was this page helpful?