HTTP 1.1 ve HTTP 2.0 arasındaki farkları aşağıda görün:
Geleneksel HTTP davranışında, aynı bağlantı üzerinden birden çok istek yaparken, istemci bir sonrakini göndermeden önce her isteğin yanıtını beklemek zorundadır. Bu sıralı yaklaşım, bir web sitesinin kaynaklarının yükleme süresini önemli ölçüde artırır. Bu sorunu gidermek için HTTP/1.1, pipelining adında bir özellik sundu ve bir istemcinin sunucunun yanıtlarını beklemeden birden çok istek göndermesine olanak tanıdı. Sunucu da, istemciye istekleri aldığı sırayla yanıt verir.
Pipelining bir çözüm gibi görünse de, zorluklarla karşılaştı:
HTTP/1.1 destekleyen sunuculardan sayfa yüklemesini optimize etme çabasıyla, web tarayıcıları bir geçici çözüm uyguladı. Sunucuya altı ila sekiz paralel bağlantı açarlar ve birden çok isteğin eşzamanlı iletimini sağlarlar. Bu paralellik, pipelining ile ilişkili sorunları hafifletmeyi ve genel sayfa yükleme sürelerini iyileştirmeyi amaçlar.
Web tarayıcılarının altı ile sekiz paralel bağlantı seçimi, optimizasyon değerlendirmelerine dayanır. Bu sayının seçilmesinin ardındaki belirli nedenler; kaynak kullanımı, ağ verimliliği ve olası darboğazlardan kaçınma arasında bir denge içerebilir.
Pipelining'de karşılaşılan kısıtlamalara yanıt olarak, HTTP/2 multiplexing adında bir özellik getirdi. Multiplexing, birden fazla isteğin ve yanıtın tek bir bağlantı üzerinden eşzamanlı iletimini sağlayarak istemci ve sunucu arasında daha verimli iletişime olanak tanır.
HTTP/2, ikili bir çerçeveleme mekanizması kullanır, bu da HTTP mesajlarının çerçeve (frame) adı verilen daha küçük, bağımsız birimlere ayrıldığı anlamına gelir. Bu çerçeveler iç içe geçirilebilir ve bağlantı üzerinden birbirinden bağımsız olarak gönderilebilir. Alıcı uçta, çerçeveler orijinal HTTP mesajını yeniden oluşturmak için yeniden birleştirilir.
Bu ikili çerçeveleme mekanizması, HTTP/2'de çoğullamayı sağlamak için temeldir. Tarayıcının, engelleme sorunlarıyla karşılaşmadan aynı bağlantı üzerinden birden fazla istek göndermesini sağlar. Sonuç olarak, Chrome gibi tarayıcılar HTTP/2 istekleri için aynı bağlantı kimliğini kullanır, bu da istemci ve sunucu arasında verimli ve kesintisiz iletişime olanak tanır.
Özünde, ikili çerçeveleme mekanizması tarafından etkinleştirilen HTTP/2'nin çoğullama özelliği, tek bir bağlantı üzerinden birden çok isteğin ve yanıtın eşzamanlı iletimini kolaylaştırarak istemciler ve sunucular arasındaki veri değişiminin verimliliğini ve hızını artırır.
HTTP/2 protokolünün performansını iyileştirmek için, istekler varsayılan olarak, sunucu tarafından her yeni HTTP/2 isteği alındığında bir iş parçacığı havuzunda (varsayılan olarak 32) gönderilir. Bu, tek bir bağlantının, bu iş parçacığı havuzu olmadan (bağlantı iş parçacığı bağlamında) sıralı işleme gerektirecek birçok eşzamanlı istek gönderdiğinde beklemeleri önler.
İş parçacığı havuzunun davranışı aşağıdaki özelliklerle yapılandırılabilir.
İstekleri ince ayarlamak için, hangi isteklerin iş parçacığı havuzunda işlenmesi gerektiğini (çünkü zaman alıcıdırlar), diğerlerinin bağlantı iş parçacığında işlenebileceğini seçerek, OnHttp2BeforeAsyncRequest olayını kullanabilirsiniz. Bu olay, isteği iş parçacığı havuzuna kuyruğa almadan önce tetiklenir. İsteğin iş parçacıklı olup olmadığını ayarlamak için Async parametresini kullanın.
procedure OnHTTP2BeforeAsyncRequest(Sender: TObject; Connection: TsgcWSConnection; const ARequestInfo: TIdHTTPRequestInfo; var Async: Boolean);
begin
if ARequestInfo.Document = '/fast-request' then
ASync := False;
end;