مشكلة HTTP/1.1
HTTP/1.1 (الذي رأيته في درس HTTP و HTTPS) نصّي وتسلسلي: كل طلب ينتظر رد الطلب الذي قبله على نفس الاتصال، فيلجأ المتصفّح لفتح عدّة اتصالات TCP موازية لتحميل صفحة فيها عشرات الملفّات — بطيء ومكلف.
HTTP/2 — تعدّد الإرسال
- ثنائي (Binary Framing): يقسّم البيانات لإطارات ثنائية بدل نص خام، أسهل معالجة وأخفّ.
- تعدّد الإرسال (Multiplexing): عدّة طلبات واستجابات في آن واحد على اتصال TCP واحد، فلا حاجة لاتصالات موازية.
- ضغط الرؤوس (HPACK): يضغط رؤوس HTTP المتكرّرة بين الطلبات فيقلّل حجم البيانات المنقولة.
- أولويّة الطلبات: يمكن للعميل تحديد أي الموارد أهمّ فيصل أولًا.
- Server Push: ميزة قديمة كانت تتيح للخادم إرسال موارد قبل أن يطلبها العميل — ثبت أنها صعبة الاستفادة منها عمليًّا، والمتصفّحات الحديثة تعتمد بدلها على
rel="preload"وحالة103 Early Hints.
💡 عمليًّا، كل المتصفحات الكبرى تفعّل HTTP/2 فقط فوق TLS (يُسمّى h2) — لا يوجد دعم فعلي لنسخته غير المشفّرة (h2c) في المتصفّح، فتفعيل HTTPS شرط ضمني لتستفيد منه.
HTTP/3 — فوق QUIC بدل TCP
المشكلة المتبقّية في HTTP/2: TCP نفسه بروتوكول تسلسلي — لو ضاعت حزمة واحدة، كل التدفّقات (streams) تنتظر حتى تصل الحزمة المفقودة من جديد (Head-of-Line Blocking على مستوى النقل).
HTTP/3 يحلّ هذا باستبدال TCP بـ QUIC، بروتوكول نقل جديد مبني فوق UDP:
- بلا حجب على مستوى النقل: كل تدفّق في QUIC مستقلّ، فحزمة مفقودة تُبطئ تدفّقها فقط، لا باقي الطلبات.
- اتصال أسرع: يدمج مصافحة النقل والتشفير في خطوة واحدة تقريبًا (0-RTT أو 1-RTT) بدل مصافحة TCP ثم مصافحة TLS منفصلتين.
- هجرة الاتصال (Connection Migration): يُعرَّف الاتصال بمعرّف (Connection ID) لا بعنوان IP والمنفذ، فينتقل جهازك من Wi-Fi لبيانات الجوّال دون قطع الاتصال.
- QPACK بدل HPACK: ضغط رؤوس مصمّم خصّيصًا ليتوافق مع طبيعة QUIC ولا يعيد نفس مشكلة الانتظار التي في HPACK.
مقارنة سريعة
| HTTP/1.1 | HTTP/2 | HTTP/3 | |
|---|---|---|---|
| بروتوكول النقل | TCP | TCP | QUIC (فوق UDP) |
| تعدّد الإرسال | لا (يحتاج اتصالات موازية) | نعم | نعم |
| ضغط الرؤوس | لا | HPACK | QPACK |
| حجب فقدان حزمة | يوقف الاتصال كلّه | يوقف كل التدفّقات | يوقف تدفّقًا واحدًا فقط |
| هجرة الشبكة | تنقطع | تنقطع | تستمرّ |
هل يهمّك كمطوّر؟
في الغالب لا تكتب كودًا مختلفًا لكل إصدار — المتصفّح والخادم يتّفقان تلقائيًّا على أحدث إصدار مدعوم (عبر ALPN أثناء مصافحة TLS). دورك عادة إعداد الخادم أو استخدام CDN يدعم HTTP/2 و HTTP/3 (معظم مزوّدي الاستضافة الحديثين يفعّلونها افتراضيًّا فوق TLS).
💡 لن ترى فرقًا واضحًا لموقع بسيط بملف واحد، لكن الفرق كبير لمواقع فيها عشرات الملفّات (JS/CSS/صور) تُحمَّل معًا.
🎯 التالي: WebSocket والتواصل اللحظي.