المستوى المطلوب: محترف — يفترض إنك تعرف TCP handshake، TLS 1.3، و HTTP/2 multiplexing.
لو P95 TTFB بتاع موقعك من زائر مصري على 4G أعلى من 600ms، الكود مش هو المشكلة غالبًا. المشكلة في إن TCP بياخد 3 رحلات للسيرفر قبل ما يبدأ يبعت أول بايت أصلاً. HTTP/3 على QUIC بيلغي رحلتين منهم.
HTTP/3 و QUIC: لمّا TCP بقى عبء بدل ما يبقى أساس
المشكلة باختصار
زائر بيفتح موقعك من القاهرة. السيرفر في فرانكفورت. الـ RTT بين الموبايل والسيرفر حوالي 90-180ms على 4G، أعلى على شبكات أبطأ. على HTTPS فوق TCP، المتصفح بيعمل: TCP handshake (1 RTT) ثم TLS 1.3 handshake (1 RTT) ثم أول HTTP request (نص RTT لحد ما الرد يبدأ). يعني 2.5 رحلات قبل أول بايت من المحتوى.
على RTT 180ms، ده 450ms ضايعة في handshakes فقط. أضف TLS 1.2 (لو لسه شغّال) وبتبقى 630ms. بعدها بس بيبدأ الـ TTFB الحقيقي يتحسب.
QUIC بيدمج transport و TLS في handshake واحد فوق UDP. الزيارة الأولى = 1 RTT. الزيارة الثانية = 0 RTT (المتصفح بيبعت الطلب مع أول حزمة).
طابور الجمارك — مثال للمبتدئ
تخيّل إنك في مطار، وعشان تخرج لازم تعدّي 3 شبابيك بالترتيب: شبّاك الجوازات، شبّاك الجمارك، شبّاك التفتيش. كل شبّاك بياخد دقيقتين. مفيش طريقة تعدّي شبّاكين في نفس الوقت. ده TCP + TLS التقليدي.
QUIC إيه؟ مكتب واحد بيختم على كل الورق دفعة واحدة. ودخلت قبل كده؟ بيعرفك ويسمحلك تعدّي بدون ختم تاني (ده الـ 0-RTT).
التعريف العلمي الدقيق
QUIC (تعريف من RFC 9000) هو UDP-based, multiplexed transport protocol with built-in TLS 1.3 encryption. HTTP/3 (تعريف من RFC 9114) هو طبقة HTTP فوق QUIC، نشرتهم IETF رسميًا في يونيو 2022.
أهم 3 خصائص بتحلّ مشاكل HTTP/2:
- إلغاء head-of-line blocking على مستوى الـ transport. في HTTP/2 فوق TCP، لو حزمة واحدة ضاعت، كل الـ streams بتقف لحد ما تتعاد. في QUIC كل stream مستقل تمامًا.
- Connection migration. الزائر اتنقل من Wi-Fi لـ 4G؟ الـ connection مش بيتقطع، QUIC بيتعرف عليه بـ Connection ID مش بـ IP+port.
- 0-RTT resumption. الزيارة الثانية للموقع نفسه = طلب HTTP بيتبعت في أول حزمة UDP، بدون انتظار handshake.
إعداد HTTP/3 على NGINX 1.25
NGINX 1.25.0 (مايو 2023) أول إصدار stable بيدعم HTTP/3 رسميًا بدون patches. الإعداد كالتالي: