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

مواصفات SAM V2

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

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

المحدد أدناه هو الإصدار 2 من بروتوكول عميل بسيط للتفاعل مع I2P.

تم تقديم SAM V2 في إصدار I2P 0.6.1.31. الاختلافات المهمة عن SAM V1 مميزة بـ “***”. البدائل: SAM V1 ، SAM V3 ، BOB .

تغييرات الإصدار 2

تم تقديم SAM V2 في إصدار I2P 0.6.1.31. مقارنة بالإصدار 1، يوفر SAM v2 طريقة لإدارة عدة sockets على نفس وجهة I2P بشكل متوازي، أي أن العميل لا يحتاج إلى انتظار إرسال البيانات بنجاح على socket واحد قبل إرسال البيانات على socket آخر. تمر جميع البيانات عبر نفس socket العميل<–>SAM. للحصول على عدة sockets، راجع SAM V3 .

تغييرات I2P 0.9.14

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

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

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

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

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

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

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

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

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

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

HELLO VERSION MIN=$min MAX=$max

و

*** HELLO REPLY RESULT=$result VERSION=2.0

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

قد تكون قيمة 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. إذا كنت تحتاج إلى هذه الميزات، يجب عليك استخدام SAMv3 .

SAM Virtual Streams

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

بعد إنشاء الجلسة مع 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 base 10 من -1 إلى -(2^31-1).

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

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

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

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

*** جسر SAM يرد فوراً بـ:

*** STREAM SEND
***        ID=$id
***        RESULT=$result
***        STATE=$bufferState

*** حيث يمكن أن يكون $bufferState:

  • BUFFER_FULL - المخزن المؤقت لـ SAM يحتوي على 32 كيلوبايت أو أكثر من البيانات للإرسال، وطلبات SEND اللاحقة ستفشل
  • READY - المخزن المؤقت لـ SAM ليس ممتلئاً، وطلب SEND التالي مضمون النجاح

*** و $result هو واحد من:

  • OK - تم تخزين البيانات في المخزن المؤقت بنجاح
  • FAILED - المخزن المؤقت ممتلئ، لم يتم تخزين أي بيانات

*** إذا رد جسر SAM بـ BUFFER_FULL، فسوف يرسل رسالة أخرى بمجرد توفر المخزن المؤقت مرة أخرى:

*** STREAM READY_TO_SEND ID=$id

*** عندما تكون النتيجة OK، سيبذل جسر 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 الإصدار 2.0، يجب على العميل أولاً إخبار جسر SAM بكمية البيانات الواردة المسموحة للجلسة بأكملها، عن طريق إرسال رسالة:

*** STREAM RECEIVE
***        ID=$id
***        LIMIT=$limit\n

*** حيث يمكن أن يكون $limit:

  • NONE - سيستمر جسر SAM في الاستماع وتسليم البيانات الواردة (نفس السلوك كما في الإصدار 1.0)
  • عدد صحيح (أقل من 2^64) - عدد البايتات المستلمة التي بعدها سيتوقف جسر SAM عن الاستماع على التدفق الوارد. كلما كان العميل مستعداً لقبول المزيد من البايتات من التدفق، يجب عليه إرسال مثل هذه الرسالة مرة أخرى، مع $limit أكبر.

*** يجب على العميل إرسال رسائل STREAM RECEIVE هذه بعد إنشاء الاتصال مع النظير، أي بعد أن يكون العميل قد استقبل رسالة “STREAM CONNECTED” أو “STREAM STATUS RESULT=OK” من جسر SAMv3.

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

SAM Repliable Datagrams

بينما I2P لا يحتوي بطبيعته على عنوان FROM، يتم توفير طبقة إضافية لسهولة الاستخدام كـ repliable datagrams - رسائل غير مرتبة وغير موثوقة يصل حجمها إلى 31744 بايت تتضمن عنوان FROM (مما يترك ما يصل إلى 1KB لمواد الرأس). يتم توثيق عنوان 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

من خلال الاستفادة القصوى من عرض النطاق الترددي لـ I2P، يسمح SAM للعملاء بإرسال واستقبال البيانات المجهولة (datagrams)، تاركاً معلومات المصادقة والرد للعميل نفسه. هذه البيانات غير موثوقة وغير مرتبة، ويمكن أن تصل إلى 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) مدعوم بواسطة شهادات المفاتيح . القيمة الافتراضية هي DSA_SHA1.

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

المتغير $privkey هو ترميز base 64 لتسلسل الوجهة متبوعة بـ المفتاح الخاص متبوعاً بـ مفتاح التوقيع الخاص ، والذي يتكون من 884 حرف base 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. قد تكون بعضها قديمة ولم يتم تحديثها لدعم SAMv2.

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

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

Was this page helpful?