Günümüzde internet kullanıcıları daha hızlı, daha güvenli ve daha verimli web deneyimleri beklemektedir. Bu ihtiyaca cevap vermek üzere geliştirilen HTTP/2, 2015 yılında IETF tarafından onaylanan ve HTTP/1.1’in yerini almak üzere tasarlanan modern bir internet protokolüdür. HTTP/2, Google’ın geliştirdiği SPDY protokolünden esinlenerek oluşturulmuş, web sayfalarının daha hızlı yüklenmesini sağlayan bir protokoldür. HTTP/1.1’in metin tabanlı ve bağlantı başına yalnızca tek bir isteği destekleyen yapısı, günümüzün yoğun içerikli web siteleri için yetersiz kalmaktadır. HTTP/2 ise bu sınırlamaları ortadan kaldırmak için ikili (binary) iletişim, çoklama (multiplexing), header sıkıştırması ve sunucu itelemesi (server push) gibi yenilikler sunar.

http2demo.io sitesi, HTTP/1.1 ile HTTP/2 arasındaki farkları interaktif olarak gösteren eğitici bir platformdur. Siteyi ziyaret eden kullanıcılar, aynı web içeriğini iki farklı protokol üzerinden yükleyerek performans farklarını doğrudan gözlemleyebilir. Örneğin, bir test sayfasında toplamda 180 küçük görsel yüklenmektedir. HTTP/1.1 modunda bu görseller sırayla, sınırlı sayıda bağlantı üzerinden yavaşça yüklenirken, HTTP/2 modunda aynı görseller tek bir bağlantı üzerinden paralel olarak ve gözle görülür şekilde daha hızlı yüklenmektedir. Bu deneyim, HTTP/2’nin özellikle çok sayıda bileşenden oluşan modern web siteleri için neden bu kadar önemli olduğunu açıkça ortaya koyar.
HTTP/2’nin sunduğu en büyük avantajlardan biri, aynı bağlantı üzerinden birden fazla isteğin eş zamanlı iletilebilmesidir. Bu özellik, HTTP/1.1’de yaygın olarak yaşanan “başlık satırı bloklaması” (head-of-line blocking) problemini ortadan kaldırır. Ayrıca HTTP/2, isteklerin başlıklarını sıkıştırarak daha az veri ile daha fazla bilgi taşıyabilir. Sunucu tarafında ise HTTP/2, istemci talep etmeden bazı kaynakları önceden gönderebilir; bu da web sayfasının daha hızlı render edilmesini sağlar.
HTTP/2 nasıl paralel yükleme yapabiliyor?
Tek bir TCP bağlantısı üzerinden birden fazla istek yapılır. HTTP/1.1’de tarayıcı, her kaynak (CSS, JS, resim vs.) için genellikle ayrı ayrı TCP bağlantıları açmak zorundadır ve çoğu tarayıcı aynı anda 6’dan fazla bağlantıya izin vermez. Bu da “head-of-line blocking” (ilk isteğin cevabı gelmeden diğerleri bekler) sorununa neden olur.
HTTP/2 ise tek bir TCP bağlantısı üzerinden çok sayıda isteği eşzamanlı (paralel) şekilde iletebilir. Böylece sayfa üzerindeki tüm kaynaklar sıraya girmeden anında gönderilmeye başlanabilir.

HTTP/2, metin tabanlı değil ikili (binary) bir protokoldür. Her istek ve yanıt, belirli bir formatta kodlanarak frame (çerçeve) adı verilen küçük parçalara bölünür. Her frame, belirli bir stream ID ile etiketlenir. Yani, tarayıcı resim, CSS, JS gibi kaynakları aynı anda gönderdiğinde her biri farklı bir stream ID taşır ve bu şekilde birbirlerinden ayrılır.
Multiplexing, HTTP/2’nin kalbindeki en önemli özelliktir. Bu sayede, tek TCP bağlantısında farklı veri akışları (streams) birbirine karışmadan aynı anda taşınabilir. Tarayıcı bu akışları oluşturur, sunucu da hangisini önce işleyebileceğine kendisi karar verir (öncelik sistemi vardır). Bu da şöyle çalışır. Tarayıcı aynı anda 10 görsel talep eder. Bu istekler, ayrı ayrı stream’lere bölünerek tek TCP bağlantısından gider. Sunucu bunları aynı anda işler, yanıtları küçük parçalara bölüp farklı sırada geri gönderebilir. Tarayıcı gelen frame’leri stream ID’sine göre birleştirir ve hangi içeriğin ne olduğunu bilir.
HTTP/2 ayrıca server push özelliği ile, istemcinin henüz talep etmediği ama muhtemelen ihtiyaç duyacağı kaynakları önceden gönderebilir. Örneğin bir HTML sayfasını isteyen tarayıcıya, sunucu hemen ardından CSS ve JS dosyalarını da yollar. Bu sayede tarayıcı tekrar istekte bulunmadan sayfayı hızlıca oluşturmaya başlar.

HTTP/2, TCP protokolü üzerinde çalışır. Bu yüzden, bağlantı gecikmesi (latency) hala TCP’nin sınırlarına tabidir. HTTP/3 ise bu sorunu aşmak için UDP tabanlı QUIC protokolünü kullanmaktadır, fakat bu başka bir konudur.
TCP ile UDP arasında ne fark var? Bu da başka bir makalenin konusu olsun.
Yorum bırakın