الخلاصة

  • خصّص Telnet المبكر النصف الأعلى من فضاء البايت لإشارات التحكم. ثم جمع البروتوكول اللاحق سلطة الأوامر في IAC، ذي القيمة 255، فأصبح في وسع القيم الـ255 الأخرى المرور من دون أن تصطدم برموز أوامر منفردة.
  • تُمثَّل قيمة البيانات الحرفية 255 بالصيغة IAC IAC. يفتح تفاوض Binary Transmission المجال الكامل للبيانات ذات الثمانية بتات، لكنه لا يعطّل تحكم Telnet؛ إذ يواصل المستقبل البحث عن IAC وتنفيذ الأوامر المتداخلة.

قطعة حمراء واحدة قد تكون أمرًا، أما قطعتان فتصيران قيمة بيانات واحدة

لنتخيل ملفًا ثنائيًا يمر عبر بروتوكول طرفية، وكانت قيمة البايت التالي فيه 255 بالنظام العشري. إذا قرأ المستقبل هذه القيمة بمعنى «فسّر البايت التالي كأمر»، فسوف يبتلع جزءًا من الملف بوصفه صياغة بروتوكولية. وإذا عاملها دائمًا كبيانات، فسيفوّت تعليمة حقيقية لتغيير خيار. الرقم نفسه على السلك يصلح للدورين، ولا يستطيع TCP أن يحسم المقصود وحده.

حل Telnet الالتباس بقواعد صغيرة. يبدأ IAC منفرد — اختصار Interpret As Command — حالة التحكم. وإذا أعقبته قيمة أمر معرّفة، تكوّن الأمر، وقد تلزم بايتات أخرى لإكماله. وحدها سلسلة IAC ثم IAC تعني بايت بيانات عاديًا قيمته 255. يكرّر المرسل القيمة، ويتعرف المستقبل إلى الزوج ويحذف النسخة التي أدت وظيفة التأطير.

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

واستعادت القاعدة أكثر من قيمة واحدة مزعجة. فقد أبقت البيانات والتحكم مرتبين داخل اتصال واحد من دون التخلي الدائم عن مساحة كبيرة من أبجدية الثمانية بتات.

أعطى Telnet الأول نصف الفضاء للتحكم

في أبريل 1972 وصف RFC 318 بروتوكول Telnet الرسمي لشبكة ARPANET حول مفهوم الطرفية الافتراضية الشبكية. حملت القيم من 0 إلى 127 ترميز USASCII، وخُصصت القيم من 128 إلى 255 لإشارات تحكم خاصة.

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

ذكر RFC 318 وسائل للانتقال إلى مجموعات ترميز أخرى، ومنها نمط Transparent، لكنه أقر بأن معنى إشارات Telnet، بل وطريق العودة إلى ASCII، قد يصبحان غير محددين بعد ذلك الانتقال. كلما اتسعت لغة البيانات، تعرضت قدرة البروتوكول على التعرف إلى إشاراته للخطر.

لم تكن المشكلة عيبًا في طراز طرفية بعينه، بل مسألة توزيع للسلطة. حين تحمل قيم كثيرة مكشوفة حق التحكم، يؤدي توسيع مفردات البيانات إلى اصطدامها بذلك الحق.

كشف اقتراح QUOTE هيئة الحل قبل اكتماله

ناقش RFC 435، المنشور في يناير 1973، قضايا في Telnet وفكرة جعل النقل الثنائي المباشر هو الوضع الافتراضي. واقترح مؤلفوه إضافة محرف QUOTE بحيث يُفسَّر البايت الذي يليه دائمًا كبيانات. عندها يمكن إبقاء القيم المرتفعة فضاءً للأوامر، فيما تعبر الحالات المسبوقة بالاقتباس حرفيًا.

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

كان هناك مساران واسعان. إما حجز قيم كثيرة للتحكم واقتباس عدد كبير من حالات التصادم، وإما حجز قيمة مميزة واحدة بوابةً للتحكم، فلا تُدفع كلفة إضافية إلا عندما تظهر هي نفسها كبيانات. اختارت مواصفة Internet Telnet اللاحقة المسار الثاني.

ضغط IAC سلطة الأوامر في بادئة واحدة

وصف RFC 764، المنشور في يونيو 1980، Telnet بأنه مرفق موجّه إلى بايتات من ثمانية بتات، يعمل عبر اتصال TCP واحد وتتداخل فيه معلومات التحكم مع البيانات. وأبقى المعيار الأساسي RFC 854 الصادر في مايو 1983 هذه البنية.

يبدأ كل أمر Telnet بالقيمة 255، أي IAC، ثم يأتي رمز الأمر. وتحمل أوامر التفاوض WILL وWON'T وDO وDON'T بايتًا ثالثًا يسمّي الخيار. وتدل رموز أخرى على نهاية تفاوض فرعي، أو عدم إجراء، أو Data Mark، أو المقاطعة، أو إيقاف الخرج، أو محو محرف، وغيرها من الوظائف الأساسية.

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

ولكلمة «شفافية» هنا معنى ضيق. فلا يزال نمط NVT يفرض قواعد للمحارف ونهايات الأسطر، ولا يعني ذلك بقاء كل قيمة بلا تغيير دلالي. المقصود أن القيم الأخرى لا تُخطأ على أنها أوامر Telnet مستقلة بسبب رقمها وحده. انتقلت سلطة التحكم من منطقة كاملة من البايتات المكشوفة إلى سلاسل تفتحها بوابة واحدة.

جلس الأمر بالضبط عند الحد الذي يتغير فيه التفسير

جعل اشتراك البيانات والتحكم في التدفق نفسه للترتيب فائدة عملية. ينص RFC 854 على أن أمر التفاوض، حين يغير الخيار طريقة معالجة البيانات القادمة من مرسل الأمر، يجب أن يُدرج في الموضع الذي يريد المرسل أن يبدأ عنده التفسير الجديد.

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

لكن هذا الحد يفرض واجبات على المحلل. قد يسلّم TCP قيمة IAC في قراءة، والبايت اللاحق في قراءة أخرى؛ فحدود المقاطع ليست سجلات Telnet. على التنفيذ حفظ حالة «شوهدت البادئة ولم يصل ما بعدها» وفك التكرار مرة واحدة فقط. إبقاء النسختين يفسد البيانات، وطي زوج أمر IAC كأنه بيانات يمحو التحكم.

يحفظ النقل الترتيب، ويقدم Telnet القواعد. ولا يحول أي منهما التدفق تلقائيًا إلى رسائل.

ورث التفاوض الفرعي قاعدة الهروب نفسها

تحتاج بعض الخيارات إلى معاملات تتجاوز نعم أو لا. يعرّف RFC 855 التفاوض الفرعي بسلسلة IAC SB، ثم رمز الخيار ومعاملاته، وينهيه بـIAC SE. وحتى إن جهل المستقبل صيغة المعاملات، يستطيع العثور على النهاية بالبحث عن إطارها.

ماذا لو احتوى أحد المعاملات القيمة 255؟ تطبق القاعدة العامة نفسها: تُكرر القيمة. من دون ذلك قد يصنع المعامل ما يبدو بداية لصياغة Telnet، أو يتحد مع القيمة التالية ليصنع علامة نهاية زائفة.

هذا مثال مكثف على انضباط التأطير بين الطبقات. يتحكم الخيار في معنى معاملاته، لكن طبقة Telnet الأساسية تحتفظ بولاية IAC. لا يمنح إنشاء امتداد حق إعادة تعريف البايت الذي يحمي التدفق المشترك.

وجعل هذا الحد الجهل قابلًا للتحمل. فحتى مع حمولة خيار مبهمة، يستطيع المحلل الأساسي تجاوزها إلى IAC SE حقيقية، بشرط أن يكون المرسل قد هرّب كل 255 حرفية على نحو صحيح.

فتح النمط الثنائي ثمانية بتات من دون إغلاق التحكم

كانت البيانات الثنائية الاعتباطية الاختبار الحاسم. يعرّف RFC 856 الخيار 0، Binary Transmission. ويجري التفاوض عليه في كل اتجاه على حدة: قد يوافق طرف على استقبال بيانات ثنائية من ثمانية بتات، فيما يبقى الاتجاه المعاكس على تفسيره السابق.

بعد تفعيله تُفسّر البايتات التي لا يسبقها IAC كبيانات ثنائية من ثمانية بتات. ومع ذلك تظل IAC IAC دالة على قيمة البيانات 255، ويظل IAC المتبوع بأمر Telnet نافذ أمرًا. يغيّر Binary معاملة البيانات، ولا يجعل تدفق TCP كله معتمًا على Telnet.

هنا تظهر فائدة البادئة. لو بقيت كل القيم من 128 إلى 255 إشارات تحكم، لاحتاج النمط الثنائي إلى اقتباس نصف الأبجدية أو التخلي عن الأوامر. أما تركيز التحكم في قيمة واحدة فيسمح لمعظم القيم الثنائية بالعبور مباشرة ويحافظ على تغييرات الخيارات داخل الاتصال نفسه.

لذلك لا يعني Binary «TCP خامًا بعد التفاوض». إنه اصطلاح بيانات يعمل تحت ثابت تأطير Telnet.

حولت متطلبات المضيف الاستثناء إلى واجب لا يُنسى

بحلول أكتوبر 1989 حوّل RFC 1123 هذا السلوك إلى متطلب واضح للمضيف. لما كانت خيارات Telnet قد تظهر في أي موضع من تدفق البيانات، وجب تكرار IAC حين يُرسل كبيانات. وحتى بعد نجاح تفاوض Binary، يجب على المستقبل مسح IAC، وتنفيذ الأوامر المضمنة، وطلب تكرار قيمة البيانات 255.

في المقابل تتوقف تحويلات أخرى. لا يطبق النمط Binary بدائل العودة بالعربة المعتادة أو اصطلاح نهاية السطر. يمنع هذا الفرق اختصارًا شائعًا: يجوز لـ«الثنائي» أن يوقف تسوية النص، لكنه لا يوقف محلل Telnet.

يحافظ سجل خيارات Telnet لدى IANA حاليًا على فضاء الخيارات ومراجعه، ومنه Binary Transmission كخيار 0. السجل ليس تعدادًا للانتشار الحالي. كما يوضح فرق نطاق: الخيار ذو الرقم 255 ليس الكائن نفسه الذي يمثله بايت IAC ذي القيمة 255 داخل التدفق. تساوي الأرقام لا يدمج أدوار البروتوكول.

حفظ بايت مكرر محادثة واحدة مرتبة

يبدو تكرار IAC تفصيلًا على السلك، لكنه فصل بين ثلاث سلطات. يختار التطبيق البيانات، ومنها 255. ويرمز مرسل Telnet القيمة بحيث لا تكتسب معنى الأمر مصادفة. ويملك مستقبل Telnet المحلل الذي يميز تمثيلها المكرر من التعليمة الحقيقية.

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

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

لم يكرر البايت نفسه كي يصبح أقوى؛ بل حملت النسخة الأولى حد الأمر لكي تتمكن الثانية من البقاء بيانات.

المصادر والحدود

يأتي تصميم نصف الفضاء المبكر من RFC 318، ونقاش QUOTE من RFC 435. يقدّم RFC 764 وRFC 854 التدفق المتداخل وقواعد IAC. ويغطي RFC 855 الهروب في التفاوض الفرعي، وRFC 856 سلوك Binary، وRFC 1123 متطلبات المضيف، وسجل IANA فضاء الخيارات. لا تثبت هذه المصادر حصة الانتشار الحالية، أو امتثال منتج بعينه، أو أمان المحلل، أو التشفير والمصادقة، أو تاريخ اعتماد واحدًا لكل المضيفين.