تحذير - مهجور - غير مدعوم - استخدم 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”. لا توجد آلية للهروب.
يمكن أن يتخذ التواصل ثلاثة أشكال متميزة:
- التدفقات الافتراضية
- الرسائل البيانية القابلة للرد (الرسائل التي تحتوي على حقل FROM)
- الرسائل البيانية المجهولة (الرسائل المجهولة الخام)
مصافحة اتصال 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 واحدة من:
OKNOVERSION
جلسات 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 واحدة من:
OKDUPLICATED_DESTI2P_ERRORINVALID_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 قد تكون واحدة من:
OKCANT_REACH_PEERI2P_ERRORINVALID_KEYTIMEOUT
إذا كانت النتيجة 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 واحدة من:
OKCANT_REACH_PEERI2P_ERRORPEER_NOT_FOUNDTIMEOUT
إذا تم إغلاق الاتصال بشكل نظيف من قبل النظير الآخر، يتم تعيين $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 قد تكون واحدة من:
OKINVALID_KEYKEY_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.