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