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

مواصفات بروتوكول التدفق

مواصفة بروتوكول I2P streaming الذي يوفر نقل موثوق شبيه بـ TCP

نظرة عامة

انظر مكتبة البث للحصول على نظرة عامة حول بروتوكول البث.

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

بروتوكول التدفق لا يتضمن حقل إصدار. الإصدارات المدرجة أدناه مخصصة لـ Java I2P. قد تختلف التطبيقات ودعم التشفير الفعلي. لا توجد طريقة لتحديد ما إذا كان الطرف البعيد يدعم أي إصدار أو ميزة معينة. الجدول أدناه مخصص للإرشاد العام حول تواريخ إصدار الميزات المختلفة.

الميزات المدرجة أدناه خاصة بالبروتوكول نفسه. يتم توثيق الخيارات المختلفة للتكوين في مكتبة Streaming إلى جانب إصدار Java I2P الذي تم تنفيذها فيه.

Router VersionStreaming Features
0.9.58Bob's hash in NACKs field of SYN packet
0.9.39OFFLINE_SIGNATURE option
0.9.36I2CP protocol number enforced
0.9.20FROM_INCLUDED no longer required in RESET
0.9.18PINGs and PONGs may include a payload
0.9.15EdDSA Ed25519 sig type
0.9.12ECDSA P-256, P-384, and P-521 sig types
0.9.11Variable-length signatures
0.7.1Protocol numbers defined in I2CP
## مواصفات البروتوكول

تنسيق الحزمة

تنسيق حزمة واحدة في بروتوكول التدفق موضح أدناه. الحد الأدنى لحجم الرأس، بدون NACKs أو بيانات الخيارات، هو 22 بايت.

لا يوجد حقل طول في بروتوكول التدفق. يتم توفير التأطير بواسطة الطبقات السفلى - I2CP و I2NP.

+----+----+----+----+----+----+----+----+
| send Stream ID    | rcv Stream ID     |
+----+----+----+----+----+----+----+----+
| sequence  Num     | ack Through       |
+----+----+----+----+----+----+----+----+
| nc |  nc*4 bytes of NACKs (optional)
+----+----+----+----+----+----+----+----+
     | rd |  flags  | opt size| opt data
+----+----+----+----+----+----+----+----+
   ...  (optional, see below)           |
+----+----+----+----+----+----+----+----+
|   payload ...
+----+----+----+-//

sendStreamId :: 4 بايت Integer : رقم عشوائي يختاره مستقبل الحزمة قبل إرسال أول حزمة رد SYN وثابت طوال عمر الاتصال، أكبر من الصفر. 0 في رسالة SYN المرسلة من قبل منشئ الاتصال، وفي الرسائل اللاحقة، حتى يتم استلام رد SYN، الذي يحتوي على معرف التدفق الخاص بالند.

receiveStreamId :: 4 بايت Integer : رقم عشوائي يختاره منشئ الحزمة قبل إرسال أول حزمة SYN ويبقى ثابتاً طوال مدة الاتصال، أكبر من الصفر. قد يكون 0 إذا كان غير معروف، على سبيل المثال في حزمة RESET.

sequenceNum :: 4 بايت Integer : التسلسل لهذه الرسالة، يبدأ من 0 في رسالة SYN، ويزداد بـ 1 في كل رسالة باستثناء رسائل ACK العادية وإعادة الإرسال. إذا كان sequenceNum هو 0 وعلامة SYN غير مضبوطة، فهذه حزمة ACK عادية يجب ألا يتم إرسال ACK لها.

ackThrough :: 4 byte Integer : أعلى رقم تسلسل حزمة تم استلامها على receiveStreamId. يتم تجاهل هذا الحقل في حزمة الاتصال الأولي (حيث receiveStreamId هو المعرف المجهول) أو إذا تم تعيين علامة NO_ACK. جميع الحزم حتى هذا الرقم التسلسلي وتشمله يتم إقرار استلامها (ACK)، باستثناء تلك المدرجة في NACKs أدناه.

عدد NACK :: 1 بايت Integer : عدد NACKs بحجم 4 بايت في الحقل التالي، أو 8 عند الاستخدام مع SYNCHRONIZE لمنع إعادة التشغيل اعتباراً من الإصدار 0.9.58؛ انظر أدناه.

NACKs :: nc * 4 byte Integer s : أرقام التسلسل الأقل من ackThrough التي لم يتم استلامها بعد. إرسال NACK مرتين لحزمة واحدة يُعتبر طلباً لـ “إعادة إرسال سريعة” لتلك الحزمة. يُستخدم أيضاً مع SYNCHRONIZE لمنع إعادة التشغيل اعتباراً من الإصدار 0.9.58؛ انظر أدناه.

resendDelay :: 1 بايت Integer : كم من الوقت سينتظر منشئ هذه الحزمة قبل إعادة إرسالها (إذا لم يتم تأكيد استلامها بعد). القيمة بالثواني منذ إنشاء الحزمة. يتم تجاهلها حالياً عند الاستقبال.

flags :: قيمة 2 بايت : انظر أدناه.

حجم الخيار :: 2 بايت Integer : عدد البايتات في الحقل التالي

بيانات الخيار :: 0 أو أكثر من البايتات : كما هو محدد بواسطة العلامات. انظر أدناه.

payload :: حجم الحزمة المتبقي

حقول الأعلام وبيانات الخيارات

حقل الأعلام أعلاه يحدد بعض البيانات الوصفية حول الحزمة، وبدوره قد يتطلب تضمين بيانات إضافية معينة. الأعلام كما يلي. يجب إضافة أي هياكل بيانات محددة إلى منطقة الخيارات بالترتيب المعطى.

ترتيب البت: 15….0 (15 هو MSB)

BitFlagOption OrderOption DataFunction
0SYNCHRONIZE----Similar to TCP SYN. Set in the initial packet and in the first response. FROM_INCLUDED and SIGNATURE_INCLUDED must also be set.
1CLOSE----Similar to TCP FIN. If the response to a SYNCHRONIZE fits in a single message, the response will contain both SYNCHRONIZE and CLOSE. SIGNATURE_INCLUDED must also be set.
2RESET----Abnormal close. SIGNATURE_INCLUDED must also be set. Prior to release 0.9.20, due to a bug, FROM_INCLUDED must also be set.
3SIGNATURE_INCLUDED5variable length SignatureCurrently sent only with SYNCHRONIZE, CLOSE, and RESET, where it is required, and with ECHO, where it is required for a ping. The signature uses the Destination's SigningPrivateKey to sign the entire header and payload with the space in the option data field for the signature being set to all zeroes. Prior to release 0.9.11, the signature was always 40 bytes. As of release 0.9.11, the signature may be variable-length, see below for details.
4SIGNATURE_REQUESTED----Unused. Requests every packet in the other direction to have SIGNATURE_INCLUDED
5FROM_INCLUDED2387+ byte DestinationCurrently sent only with SYNCHRONIZE, where it is required, and with ECHO, where it is required for a ping. Prior to release 0.9.20, due to a bug, must also be sent with RESET.
6DELAY_REQUESTED12 byte IntegerOptional delay. How many milliseconds the sender of this packet wants the recipient to wait before sending any more data. A value greater than 60000 indicates choking. A value of 0 requests an immediate ack.
7MAX_PACKET_SIZE_INCLUDED32 byte IntegerThe maximum length of the payload. Send with SYNCHRONIZE.
8PROFILE_INTERACTIVE----Unused or ignored; the interactive profile is unimplemented.
9ECHO----Unused except by ping programs. If set, most other options are ignored. See the streaming docs.
10NO_ACK----This flag simply tells the recipient to ignore the ackThrough field in the header. Currently set in the initial SYN packet, otherwise the ackThrough field is always valid. Note that this does not save any space, the ackThrough field is before the flags and is always present.
11OFFLINE_SIGNATURE4variable length OfflineSigContains the offline signature section from LS2. See proposal 123 and the common structures specification. FROM_INCLUDED must also be set. Contains an OfflineSig: 1) Expires timestamp (4 bytes, seconds since epoch, rolls over in 2106) 2) Transient sig type (2 bytes) 3) Transient SigningPublicKey (length as implied by sig type) 4) Signature of expires timestamp, transient sig type, and public key, by the destination public key. Length of sig as implied by the destination public key sig type.
12-15unusedSet to zero for compatibility with future uses.
### ملاحظات التوقيع متغير الطول

قبل الإصدار 0.9.11، كان التوقيع في حقل الخيار دائماً 40 بايت.

اعتباراً من الإصدار 0.9.11، يكون التوقيع متغير الطول. يتم استنتاج نوع التوقيع وطوله من نوع المفتاح المستخدم في خيار FROM_INCLUDED ومن توثيق Signature .

اعتبارًا من الإصدار 0.9.39، يتم دعم خيار OFFLINE_SIGNATURE. إذا كان هذا الخيار موجودًا، يتم استخدام SigningPublicKey المؤقت للتحقق من أي حزم موقعة، ويتم استنتاج طول التوقيع ونوعه من SigningPublicKey المؤقت في الخيار.

  • عندما تحتوي الحزمة على كل من FROM_INCLUDED و SIGNATURE_INCLUDED (كما في SYNCHRONIZE)، يمكن إجراء الاستنتاج مباشرة.

  • عندما لا تحتوي الحزمة على FROM_INCLUDED، يجب استنتاج ذلك من حزمة SYNCHRONIZE سابقة.

  • عندما لا تحتوي الحزمة على FROM_INCLUDED، ولم تكن هناك حزمة SYNCHRONIZE سابقة (على سبيل المثال حزمة CLOSE أو RESET شاردة)، يمكن الاستنتاج من طول الخيارات المتبقية (حيث أن SIGNATURE_INCLUDED هو الخيار الأخير)، لكن من المحتمل أن يتم تجاهل الحزمة على أي حال، حيث لا يوجد FROM متاح للتحقق من صحة التوقيع. إذا تم تعريف المزيد من حقول الخيارات في المستقبل، يجب أخذها في الاعتبار.

منع إعادة التشغيل

لمنع بوب من استخدام هجوم إعادة التشغيل عبر تخزين حزمة SYNCHRONIZE موقعة صالحة مُستقبلة من أليس وإرسالها لاحقاً إلى الضحية تشارلي، يجب على أليس تضمين hash الوجهة الخاص ببوب في حزمة SYNCHRONIZE كما يلي:

Set NACK count field to 8
Set the NACKs field to Bob's 32-byte destination hash

عند استلام SYNCHRONIZE، إذا كان حقل عدد NACK يساوي 8، يجب على Bob تفسير حقل NACKs كـ hash وجهة بحجم 32 بايت، ويجب عليه التحقق من أنه يطابق hash وجهته. كما يجب عليه التحقق من توقيع الحزمة كالمعتاد، حيث أن ذلك يغطي الحزمة بالكامل بما في ذلك حقل عدد NACK وحقل NACKs. إذا كان عدد NACK يساوي 8 وحقل NACKs لا يطابق، يجب على Bob إسقاط الحزمة.

هذا مطلوب للإصدارات 0.9.58 وما أعلى. هذا متوافق مع الإصدارات الأقدم، لأن NACKs غير متوقعة في حزمة SYNCHRONIZE. الوجهات لا تعرف ولا يمكنها معرفة أي إصدار يعمل على الطرف الآخر.

لا حاجة لأي تغيير في حزمة SYNCHRONIZE ACK المرسلة من Bob إلى Alice؛ لا تقم بتضمين NACKs في تلك الحزمة.

المراجع

Was this page helpful?