Summary

  • يوضح RFC 9931 أن إكمال إرسال طلب Upgrade أو CONNECT شرط لازم، لكنه لا يكفي لتغيير حالة اتصال HTTP/1.1. يفيد النجاح السابق في التنبؤ، أما 101 Switching Protocols أو 2xx الخاص بالمحاولة الجارية فهو الذي يثبت الانتقال الحالي.
  • إذا أطلق عميل HTTP موثوق بايتات اختارها طرف ثالث غير موثوق قبل التأكيد، فقد يقرأها الخادم بعد الرفض كطلب HTTP جديد صادر باسم العميل. المطلوب سجل صغير يثبت الانتظار والرد وقاعدة إطلاق البيانات والمحلل النهائي، من دون الاحتفاظ بالحمولة الحساسة.

اختصار زمن الانتظار لا يلغي لحظة القرار

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

يتناول RFC 9931 نتيجة الخطأ في هذا التوقع على HTTP/1.1. نُشر في مارس 2026 ضمن مسار معايير IETF، ويحدّث RFC 9112 وRFC 9298. لا يقول إن خفض الكمون خطأ في ذاته؛ بل يفصل واقعتين متجاورتين: انتهاء العميل من طلب الانتقال، وقبول الخادم لذلك الانتقال.

في Upgrade يقترح العميل تغيير بروتوكول التطبيق على الاتصال القائم. يعبّر رد 101 Switching Protocols عن فهم الخادم وقبوله، ويحدد البروتوكول الذي يسري بعد الرد. وفي CONNECT يعني رد 2xx الناجح أن الاتصال يصبح نفقاً بعد انتهاء ترويسة الرد. أما أي رد آخر فيعني أن النفق لم يتكون.

كانت دلالات HTTP تشترط أصلاً ألا يبدأ العميل البروتوكول الجديد في منتصف رسالة الطلب. يضيف RFC 9931 الحد الآخر: إتمام الطلب ضروري لكنه غير كافٍ. قد لا يدعم الخادم الرمز، أو يطلب مصادقة، أو يرفض المنفذ أو الوجهة، أو يعجز عن حل الاسم والوصول إلى الخدمة. وحتى يأتي الرد، توجد فرضية عن الحالة ولا توجد حالة مؤكدة.

سجل النجاح أداة توقع لا بديل عن الرد

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

المشكلة في تغيير السؤال الذي يجيب عنه التاريخ. ربما تغير المسار أو الخادم الخلفي أو بيانات الاعتماد أو سياسة الوجهة أو سلسلة الوسطاء منذ المحاولة السابقة. وربما لم يتغير شيء ومع ذلك فشل اتصال الوجهة هذه المرة. في كل الأحوال، يعطي البروتوكول للخادم الحالي حق حسم الطلب الحالي. لا تستطيع النسبة الإحصائية إصدار رد لم يصل بعد.

تخفي لغة التشغيل هذا الاستبدال بسهولة. عبارة «الوكيل يدعم CONNECT» تتحول إلى «هذا الطلب مقبول». ووجود رمز في سجل IANA يتحول إلى «الاتصال انتقل». أما «نجح دائماً» فتصبح إذناً دائماً بإطلاق البيانات مبكراً. في كل اختصار يختفي قيد: هوية الاتصال أو الطلب أو الرد أو الزمن.

ينبغي الاحتفاظ بسطحين منفصلين. يسجل الأول أدلة التوقع: النسخة والاختبار والتوثيق والتاريخ. ويسجل الثاني واقعة الحالة: إصدار HTTP ودورة الاتصال والرد الجاري والبروتوكول المختار. قد يتطابق السطحان في معظم الأحيان، لكنهما لا يثبتان الشيء نفسه.

قد تتغير هوية المتكلم من دون أن تتغير البايتات

لا يعتبر RFC 9931 كل انتقال بين طرفين خطراً من هذا النوع. فإذا كان كل طرف مستعداً أصلاً لاستقبال بيانات عشوائية من الآخر، قد يبقى فشل التوقع خطأ بروتوكولياً محدوداً. يظهر الخطر الأشد عندما يثق الخادم بعميل HTTP، بينما يختار تطبيق ثالث غير موثوق البيانات التي يمررها ذلك العميل.

لنفترض أن تطبيقاً محلياً يطلب من عميل وكيل مصادق عليه إنشاء نفق TCP. يسلّم التطبيق أول بياناته الموجهة إلى الخدمة البعيدة، فيمررها العميل قبل رد 2xx. إذا تعذر الوصول إلى الوجهة، يرفض الوكيل CONNECT ويظل ينتظر طلب HTTP/1.1 تالياً على الاتصال نفسه.

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

توجد ثلاثة إخفاقات لا إخفاق واحد. لم يحدث الانتقال المتوقع. واختار المرسل والمستقبل نحوين مختلفين للبايتات. ثم نُسب الفعل إلى عميل لم يختر محتواه. عداد الانتقالات المرفوضة يرى الإخفاق الأول ولا يكشف أثر السلطة.

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

لا تشتري كل البروتوكولات السرعة بالطريقة نفسها

يفرض WebSocket الانتظار. بعد إرسال مصافحة الافتتاح، يجب على العميل انتظار رد الخادم والتحقق منه قبل إرسال بيانات أخرى. كما تُقنّع الإطارات من العميل إلى الخادم بعشوائية عالية. يعالج القراران توقيت الإرسال وشكل البيانات كل على حدة.

كان RFC 9298 يسمح ببدء إرسال رزم UDP بتفاؤل قبل رد الوكيل. يقصر RFC 9931 هذه الإمكانية على HTTP/2 أو أحدث، ويحظرها على HTTP/1.x. ويتبع RFC 9484 الحد نفسه لرزم IP. فإذا حوّل وسيط الطلب من HTTP/2 أو HTTP/3 إلى HTTP/1.1، وجب عليه حجز الكبسولات حتى يقرأ رداً ناجحاً.

الفرق بنيوي. طلبات HTTP/1.1 متتابعة، ويُفهم حد الطلب التالي ضمناً من نهاية السابق. أما HTTP/2 وHTTP/3 فيفصلان الطلبات في تدفقات صريحة. يمنع ذلك الغموض المحدد الذي يجعل بيانات انتقال مرفوض تحتل مكان الطلب التالي في HTTP/1.1. لكنه لا يثبت أمن كل تطبيق أحدث، ولا صلاحية الوجهة، ولا تفويض ما يحدث داخل النفق.

يقترح RFC 9931 لرموز Upgrade المستقبلية خيارات أخرى: منع الإرسال المبكر، أو افتتاح البروتوكول الجديد بمقدمة ثابتة تُفشل محلل HTTP/1.1 بوضوح، أو استخدام تقنيع عالي العشوائية. وإذا لم تعد لطريقة HTTP دلالة بعد الانتقال، فإن قصر الطلب على GET بلا محتوى يقلل المادة القابلة للتفسير المزدوج.

أما سجل رموز HTTP Upgrade لدى IANA فيدير الاسم والمرجع. إنه لا يراقب اتصالاً حياً. تسجيل الرمز يثبت مصدر مواصفته، ولا يثبت أن خادماً بعينه قبله الآن.

رفض CONNECT له واجبان متقابلان

عندما يعمل عميل وكيل HTTP/1.1 لمصلحة عميل TCP غير موثوق، يلزمه RFC 9931 بأحد سلوكين على الأقل. إما انتظار 2xx قبل تمرير حمولة TCP، وإما إضافة Connection: close إلى الطلب. في الخيار الثاني ينتهي الاتصال عند الرفض، فلا تبقى مساحة يفسر فيها الخادم البيانات المبكرة كطلب جديد. ويمكن الجمع بين السلوكين.

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

لذلك يسمح RFC للخادم بتعطيل الإغلاق إذا كان يعلم أن العميل ينتظر 2xx، ويذكر User-Agent ووثائق المورد وسيلة للتعرف إلى العملاء المتوافقين. لكن RFC 9110 يصف User-Agent بأنه معلومات عن البرنامج المنشئ للطلب، وينصح بعدم انتحال منتجات أخرى؛ ولا يحوله إلى هوية مشفرة موثقة.

يجب أن يكون استثناء الأداء مؤقتاً. يسجل المنتج والإصدار، ووثيقة المورد التي روجعت، ونتيجة الاختبار المحلي، وسلسلة الوسطاء المشمولة، والمالك، وموعد المراجعة، وشرط الرجوع. قد يغير تحديث واحد ترتيب الإرسال، فلا تبقى صفة «عميل معروف» صحيحة إلى الأبد.

إيصال لتأكيد الانتقال لا نسخة من الحركة

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

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

يصف الجزء الثاني البوابة. أي إصدار من العميل وأي سياسة قررا وقت الإطلاق؟ هل انتظر المسار 101 أو 2xx، أم طلب الإغلاق، أم استخدم مقدمة ثابتة أو تقنيعاً أو تدفقاً منفصلاً؟ هل عبرت بيانات قبل الرد؟ وإذا عبرت، فما البناء المسموح الذي أجاز ذلك، لا مجرد معدل النجاح السابق؟

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

لا يحتفظ الإيصال بالحمولة أو كلمات السر أو الشهادات السرية أو رؤوس التفويض. ولا يضخم دلالة 2xx: فهو يؤكد تكوين النفق، لا الإذن بكل فعل يجري داخله. تبقى للتطبيق والخدمة قراراتهما الخاصة.

هذا الإيصال اقتراح تحريري من Daniel Kade، وليس حقلاً جديداً في HTTP ولا شرطاً يفرضه RFC 9931. وظيفته إثبات حقيقة محدودة: أي رد حالي سمح لأي فئة من البيانات بعبور أي حد تحليلي.

حدود الاستنتاج

لا تسمي المصادر منتجاً ضعيفاً ولا حادثة أو نسبة انتشار أو معدل خطأ. ولا تعيّن حلاً واحداً لكل بنية. للانتظار والإغلاق والتخزين المؤقت والمقدمة الثابتة والتقنيع والانتقال إلى إصدار HTTP أحدث تكاليف مختلفة.

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

تبقى الخلاصة في حدود الدليل: النجاح السابق يحسن التوقع. الرد الحالي وحده يؤكد الانتقال الحالي.

Sources

  1. RFC 9931: اعتبارات أمنية للانتقالات التفاؤلية في HTTP/1.1
  2. صفحة معلومات RFC 9931 لدى RFC Editor
  3. RFC 9110: دلالات HTTP
  4. RFC 9112: بروتوكول HTTP/1.1
  5. RFC 9298: تمرير UDP عبر HTTP
  6. RFC 6455: بروتوكول WebSocket
  7. RFC 9484: تمرير IP عبر HTTP
  8. RFC 9113: بروتوكول HTTP/2
  9. RFC 9114: بروتوكول HTTP/3
  10. سجل IANA لرموز HTTP Upgrade
  11. Heng Lu، «The Policy Mirror»
  12. Heng Lu، «Minimum Initial Specification, Localized Future Decision, Voluntary Adoption»
  13. Heng Lu، «On Why BTW Media Exists, and Why Reality, Not Advocacy, Is the Product»