الخلاصة
- قدّم TCP تدفق بايتات موثوقاً ومرتباً من دون الاحتفاظ بحدود CALL أو REPLY، فوضع ONC RPC كل رسالة داخل سجل يتكون من جزء واحد أو أكثر.
- بدأ كل جزء بمؤشر big-endian من أربعة بايتات؛ حملت الـ31 بت الدنيا طول ذلك الجزء، وحمل البت الأعلى قرار انتهاء السجل بعد بياناته.
- أثبت اكتمال السجل موضع الحد فقط، ولم يثبت صحة XDR أو مطابقة XID أو الهوية أو التفويض أو نتيجة الإجراء أو أثره الدائم.
لم يكن الصمت بعد نصف الترويسة خطأً
يطلب المستقبل أربعة بايتات فلا يحصل إلا على اثنين. لا يحق له أن يعلن فساد الرسالة؛ ربما وصلت بداية المؤشر فقط. يحتفظ بهما حتى تكتمل الكلمة. وقد تعيد القراءة التالية بقية المؤشر وكل الجسم وسجلين آخرين وبداية سجل رابع.
هذا هو السلوك الطبيعي لخدمة البايتات. وصف RFC 793 TCP كتدفق مرتب، وفصل وظيفة PUSH عن أي علامة لحدود السجل. ويحافظ RFC 9293 على تعريف النقل الموثوق المرتب. حدود segment أو استدعاء read لا تعني حدود الإجراء البعيد.
لكن RPC يحتاج إلى معرفة أين تنتهي بنية طلب أو رد قبل تفسير ما يليها. لم يكن من المناسب أن يخمن TCP هذا المعنى؛ كان على بروتوكول الرسائل أن يضع حدوده بنفسه.
قسمت أربعة بايتات السلطة بين طول ونهاية
نشر RFC 1050 في أبريل 1988 آلية record marking. تدخل رسالة RPC واحدة في سجل RM واحد، ويتكون السجل من جزء واحد أو عدة أجزاء. احتفظ RFC 1057 في يونيو بالشكل نفسه.
يبدأ الجزء بكلمة غير موقعة من أربعة بايتات مرتبة من الأعلى إلى الأدنى. تعلن الـ31 بت الدنيا عدد بايتات البيانات التالية، من الصفر إلى 2^31 - 1. أما البت الأعلى فقيمة منطقية: الواحد يعني أن هذا آخر جزء في السجل، والصفر يعني أن جزءاً آخر يتبعه في السجل نفسه.
لا ينتهي السجل لحظة رؤية الواحد. يجب أولاً استهلاك الجسم المعلن كله. وبالمقابل لا تتحول بيانات جزء اكتمل طوله إلى رسالة كاملة إذا كان البت صفراً؛ فالكلمة التالية تصف جزءاً جديداً من السجل الحالي.
أعاد المستقبل بناء الحد من حالة محلية
يجمع المحلل بايتات المؤشر الأربعة، ثم يفصل البت عن الطول ويحفظهما. بعد ذلك يستهلك بالضبط عدد البايتات المعلن، حتى إن توزعت على قراءات عديدة. يضيفها إلى السجل الجاري أو يمررها داخلياً ضمن ميزانية مضبوطة.
إذا كان البت صفراً عاد إلى جمع مؤشر آخر. وإذا كان واحداً سلّم الأجزاء المتراكمة كرسالة RPC مكتملة، وصارت البايتات الأربعة التالية بداية سجل جديد. لا يحتاج هذا المنطق إلى معرفة حدود الحزم؛ يكفيه الترتيب والعد والحالة.
يشمل المجال جزءاً بطول صفر. لا يحمل بيانات لكنه ما زال يقرر الاستمرار أو النهاية. أما انقطاع الاتصال وسط الجسم فلا يصنع سجلاً أقصر صحيحاً؛ بل يترك جزءاً مبتوراً. ويثبت ذلك ما لم يصل إلى المستقبل، لا ما إذا كان الخادم قد نفذ الإجراء.
الجزء في RM لم يكن جزءاً في IP
قد تتشابه الأسماء، لكن RM fragment ليس IP fragment ولا TCP segment ولا عملية كتابة ولا قيمة XDR. قد يمتد جزء RM عبر segments كثيرة، وقد يحتوي segment أو buffer واحد مؤشرات عديدة وسجلات كاملة. يمكن لإعادة الإرسال أن تغير شكل الالتقاط من دون تغيير التدفق المعاد تركيبه.
كذلك لا يعني البت الأخير FIN أو PSH أو نهاية ملف أو نجاحاً. CALL وREPLY رسالتان مستقلتان، ولكل منهما سجل فوق TCP. يمكن أن ينتهي السجل بدقة ثم يكتشف RPC أن البرنامج غير موجود أو أن الاعتماد مرفوض أو أن الوسائط تالفة.
ينتمي PUSH إلى التوقيت: يطلب تحريك البايتات المتاحة من دون انتظار غير ضروري. وينتمي record marking إلى القواعد: كم بايتاً في الجزء، وهل يكتمل بعده هذا السجل. السرعة لا تحدد النحو.
بقي الإطار خارج XDR عمداً
تُوصف الرسالة الداخلية بـExternal Data Representation. يحدد RFC 4506 الأعداد والأطوال والحشو والبنى كي تفهم آلات مختلفة القيمة نفسها.
ومع ذلك تنص مواصفات RPC على أن مؤشر السجل ليس في صيغة XDR القياسية. يشبه العدد غير الموقع في ترتيب البايتات، لكنه يعمل قبل فك الرسالة التي يحتويها. لو احتاج المحلل إلى تفسير القيمة كلها ليكتشف نهايتها، لاعتمد الإطار على جواب لم يعثر عليه بعد.
لذلك قد يفشل الإطار والمحتوى كل على حدة. يستطيع المستقبل رفض طول غير مقبول قبل لمس الإجراء. كما يستطيع استقبال سجل كامل الحدود ثم رفض XDR أو رسالة RPC. العثور على النهاية ليس تصديقاً لما بداخلها.
لم تكن 31 بتاً أمراً بحجز الذاكرة
يحد الطول جزءاً واحداً، لا السجل كله. ولأن السجل يقبل عدة أجزاء، لا تنشر القاعدة الأساسية سقفاً تراكمياً واحداً. كما أن الحد النظري ليس أمراً للمستقبل أن يخصصه دفعة واحدة؛ وإلا صار رقم من الشبكة سلطة على الذاكرة المحلية.
تحتاج التطبيقات إلى ميزانيات محلية لحجم السجل المتراكم وعدد الأجزاء والذاكرة والوقت. هذه نتيجة تشغيلية لتنفيذ الصيغة بأمان، لا قيمة معيارية جديدة. ويجب أن يسجل الرفض الطول المطلوب والحد الذي طُبق.
تقول الوثائق إن الحدود تساعد على كشف أخطاء البروتوكول وربما التعافي منها، لكنها لا تعرف مسح الجسم بحثاً عن كلمة تبدو كمؤشر. يمكن لأي نمط أن يظهر داخل البيانات. بعد ضياع المحاذاة قد يكون إغلاق الاتصال أكثر صدقاً من إسناد بايتات إلى CALL خاطئة.
ظل السلك كما هو حتى جاء نقل يستبدل الإطار
حافظ RFC 1831 على الشكل سنة 1995، ثم استبدله RFC 5531 سنة 2009 من دون تغيير على السلك. بقي لأنه ملأ فجوة واحدة في TCP ولم يدّع معنى أوسع.
يبين RFC 8166 أن السلطة مرتبطة بالنقل. يملك RPC-over-RDMA transport stream وpayload stream، ويستبدل كل framing آخر، بما فيه TCP record marking حتى حين يعمل RDMA فوق TCP. ويجب أن يقع التحول الديناميكي بين رسالتين RPC منفصلتين وبالتنسيق مع النقل.
لم تكن RM إذاً صفة دائمة للإجراء؛ كانت محولاً بين نموذج الرسائل وتدفق البايتات.
حدود الأدلة
تتكون الحزمة المغلقة من RFC 793 وRFC 1050 وRFC 1057 وRFC 1831 وRFC 4506 وRFC 5531 وRFC 8166 وRFC 9293. تثبت الصيغة والتاريخ وحدود الطبقات، ولا تقيس الانتشار الحالي ولا تصدق مكتبة ولا تثبت هوية أو تفويضاً أو محتوى أو نتيجة لاتصال واقعي.
نجح البت الأخير لأنه رفض أن يكون ختم إنجاز. وحّد طرفين على موضع انتهاء الرسالة، وترك نتيجة العمل للطبقة التي تستطيع رؤيتها.
إحاطة الأعضاء
سياق أعمق للملف الشخصي
سجّل الدخول بمستوى العضوية المناسب لفتح الإحاطة الكاملة وملاحظات المصادر.
للدائرة الاستراتيجية فقط
الدائرة الاستراتيجية
مفتوح لجميع القراء. افتح إحاطات الملف الشخصي بعد الانضمام وتسجيل الدخول.
انضم إلى الدائرة الاستراتيجيةلأعضاء تحالف القيادات فقط
تحالف القيادات
لأصحاب الأصول الفكرية المؤهلين وللإدارة؛ سجّل الدخول للوصول إلى إحاطات التحالف.
انضم إلى تحالف القيادات
