الخلاصة

  • المشكلة ملموسة: قد تختار الخدمة منفذاً متاحاً عند تشغيلها، لكن العميل لا يستطيع تخمينه؛ وفرض منفذ ثابت لكل برنامج ينقل عبء التنسيق إلى مجموعة المنافذ المشتركة.
  • قدّم Portmapper في RFC 1057 نقطة محلية ثابتة لمعرفة المنفذ المختار. كانت الإجابة سجلاً على جهاز بعينه، لا دليلاً على بقاء الخدمة متاحة أو على هوية من يستجيب.

المنفذ يتغيّر؛ ونقطة الاستعلام ثابتة

لنتصور حالة افتراضية: بعد إعادة تشغيل خدمة الملفات، يختار الخادم منفذاً متاحاً جديداً بينما يواصل عميل إرسال الطلب إلى المنفذ القديم. لم يتغير برنامج RPC المطلوب؛ بل تغير موضع الخدمة، فلا يصل الاستدعاء إلى الوجهة الجديدة. لا يستطيع العميل استنتاج هذا التغيير بالتخمين. أما تخصيص منفذ ثابت لكل برنامج فيعيد عبء التنسيق إلى مجال مشترك محدود.

وصف RFC 1057، الذي نشرته Sun Microsystems في يونيو 1988، ترتيباً آخر. يحدد رقم البرنامج وإصداره ما يطلبه العميل، فيما يحدد TCP أو UDP وسيلة النقل. ويربط Portmapper محلي، يمكن الوصول إليه عبر المنفذ المعروف 111، هذه المعرفات بمنفذ يختاره الخادم. يستعلم العميل من mapper أولاً، ثم يتصل بالخدمة. كان استدعاء RPC والبحث عن نقطة الاتصال خطوتين منفصلتين.

تسجّل العملية PMAPPROC_SET الخدمة. يرسل الخادم إلى mapper الموجود على الجهاز نفسه رقم البرنامج والإصدار وبروتوكول النقل ومنفذ الاستماع. ويرفض mapper تسجيل توليفة موجودة من البرنامج والإصدار والبروتوكول. وعند توقف الخدمة، تزيل PMAPPROC_UNSET التسجيل. ويستخدم العميل PMAPPROC_GETPORT؛ وتعني القيمة صفر عدم وجود تسجيل لتلك التوليفة.

كان توزيع المسؤوليات مباشراً: تختار الخدمة موضع الاستماع، وينشر mapper هذا الاختيار عبر نقطة يسهل توقعها، ثم يستخدم العميل المنفذ المعاد. يمكن أن تتغير نقطة الخدمة فيما تبقى طريقة الاستعلام معروفة.

ما الذي لم تثبته الإجابة؟

لم تعكس إجابة mapper سوى ما في جدول التسجيل المحلي. لم يجعل RFC 1057 العملية GETPORT اختباراً لسلامة الاتصال من طرف إلى طرف، ولا دليلاً على انفتاح المسار الشبكي، ولا إثباتاً تشفيرياً لهوية البرنامج الذي يستمع على المنفذ. ظل على العميل أن ينشئ الاتصال وينفذ استدعاء RPC ويفسر النتيجة. إذا توقفت الخدمة وبقي التسجيل، فقد ينجح الاستعلام ثم يفشل الاتصال. وإذا غاب التسجيل، يفشل العثور على ربط الخدمة.

تبدو كلمة «عُثر عليه» أوسع من «سُجّل». يدل رقم المنفذ على الموضع الذي سجلت الخدمة أنها تستمع عنده؛ ولا يضمن وصول الحزم أو قبول الخدمة لذلك العميل أو إكمال الإجراء المطلوب. ويتناول RFC المصادقة ودلالات النقل على نحو منفصل؛ فلا يحل Portmapper محلهما.

لم يكن هذا الجدول سجلاً عالمياً لكل برامج RPC. فقد وُجد على الجهاز الذي يستضيف الخدمة. وكان على العميل الحصول على عنوان ذلك الجهاز من مصدر آخر، ثم سؤال mapper المحلي عن منفذ النقل. توزّع الاكتشاف بذلك بين طبقات: يحدد الاسم أو الإعداد الجهاز، ويختار رقم البرنامج وإصداره الواجهة، ثم يعطي mapper نقطة النقل.

تضمن RFC أيضاً PMAPPROC_DUMP لسرد التسجيلات، وPMAPPROC_CALLIT لدعم استدعاءات البث. يرسل العميل الطلب إلى منفذ mapper الثابت على عنوان البث، ويستطيع كل mapper يتلقاه استدعاء الخدمة المسجلة محلياً. وتنص المواصفة على أن mapper يرد فقط إذا نجح التنفيذ؛ وإلا يظل صامتاً. أتاح ذلك محاولة الوصول إلى الخدمة نفسها رغم اختلاف منافذها بين الأجهزة، لكنه لم يضمن التسليم ولم يقدم قائمة كاملة بالمستجيبين.

كما وضعت أرقام البرامج حدوداً للتنسيق. قسم RFC 1057 المجال إلى نطاقات تعرفها Sun، وأخرى للمستخدمين، وأخرى مؤقتة، وأخرى محجوزة. لذلك لم يلزم أن يطابق المعرّف المنطقي للبرنامج منفذ النقل المتغير: رقم يسمّي برنامج RPC، وقيمة تحل محلياً تحدد موضع استماع نسخته العاملة.

من منافذ TCP وUDP إلى العناوين العامة

تعامل Portmapper الأول مباشرة مع منافذ TCP وUDP. وفي عام 1995 وصف RFC 1833 الإصدار الثاني من Port Mapper إلى جانب الإصدارين الثالث والرابع من RPCBIND. بقيت المشكلة كما هي: قد يختار الخادم عنوان النقل ديناميكياً، بينما يحتاج العميل إلى نقطة استعلام معروفة على عنوان الخادم. مثّل RPCBIND عناوين النقل بسلاسل عنوانية عامة، وأضاف معرّفاً للشبكة، فوسع الربط إلى ما يتجاوز منافذ TCP وUDP.

يساعد هذا النص اللاحق على تحديد نطاق تصميم 1988. لم يربط RFC 1057 برنامج RPC بمنفذ نقل واحد، بل وضع طريقة لقاء تربط البرنامج وإصداره بمستمع خاص بوسيلة النقل. ثم وصف RFC 5531 بروتوكول رسائل RPC وآليات الربط والالتقاء باعتبارها أجزاء مستقلة.

كانت الفائدة محددة: إذا اتبع العميل والخادم عرف الاستعلام نفسه، لم يحتج العميل إلى معرفة منفذ الخدمة مسبقاً. وفّر ذلك المنافذ الثابتة وسمح لكل نسخة باختيار موضعها محلياً. أما المقابل فكان تبادلاً إضافياً قبل الاستدعاء، وحالةً ينبغي أن تواكب بدء الخدمة وتسجيلها وإيقافها وإلغاء تسجيلها.

تصف وثائق RFC الآلية، ولا تقدم إحصاءً للتبني التاريخي أو قياساً للموثوقية. فهي لا تبين عدد التسجيلات القديمة التي حدثت أو سرعة إصلاحها في أنظمة بعينها. والاستنتاج الآمن معماري: جعل Portmapper نقطة RPC قابلة للاكتشاف عبر نقطة محلية مستقرة؛ أما الوصول والمصادقة ونجاح التنفيذ فظلت أموراً تحتاج إلى تحقق لاحق.

الوثائق الأولية: RFC 1057 — RPC الإصدار 2؛ RFC 1833 — بروتوكولات ربط ONC RPC؛ RFC 5531 — ONC RPC الإصدار 2.