HTTP/2 Server Push
Temel konsept

Üç kaynağı olan bir web sitesi düşünün: index.html, style.css ve script.js. Bir kullanıcı, tarayıcısı aracılığıyla bu web sitesinin ana sayfasına bağlandığında, otomatik olarak index.html'yi alır. Tarayıcı, index.html'deki HTML metnini ayrıştırırken, style.css ve script.js gerektiren düzenleme ve işlem talimatlarını bulur. Bu noktada, tarayıcı bu diğer iki dosyayı almak için isteklerde bulunacaktır. Web sayfasının tamamını bir araya getirmek için tarayıcı, sitenin yapısını yavaş yavaş keşfederken bu tür istekleri istifler ve kullanıcıya sonuç döndürür.
HTTP/2 Push ile sunucu, içeriğin daha talep edilmeden gönderilmesini tetikleyen kurallara sahip olarak inisiyatif alabilir. Bu örnek senaryoda, sunucu, index.html isteyen herkesin style.css ve script.js'ye ihtiyacı olacağını bilir, böylece istemcinin istemesini beklemeden bunları hemen istemciye iletebilir. Doğru yapılırsa, tarayıcı index.html'yi ayrıştırmayı bitirdiğinde, style.css ve script.js aktarımı çoktan başlamış, hatta tamamlanmış, bunları talep etme ve gelmelerini bekleme gecikmesini ortadan kaldırmış olacaktı.
Push, özünde bir çerçeve protokolü olan HTTP/2 üzerinden çalışır; bu, bilgilerin çerçeve adı verilen bayt gruplarında değiş tokuş edildiği anlamına gelir. Ek olarak, çerçeveler akışların bir parçasıdır ve akışlar bir sayı ile tanımlanır. Akış numarası, her çerçevede bir ikili alan olarak bulunur. Akışlar, istekleri yanıtlarla eşleştirmeye izin verir, örneğin, akış 3'teki GET /index.html isteğine verilen yanıt da akış 3'te olmalıdır.
Farklı çerçeve türleri vardır ve her birinin farklı bir işlevi vardır. HTTP/2, bu türlerden yalnızca birkaçına sahiptir ve temelleri açıklamak için hepsine ihtiyacımız yok. İşte bu açıklama için ilginç olanlar:
HEADERS çerçevesi. Adından da anlaşılacağı gibi, bu çerçeve türü HTTP başlıklarını taşır. Tarayıcı tarafından sunucuya gönderildiğinde, bir istekte bulunulduğunu gösterir. Sunucu tarafından tarayıcıya gönderildiğinde, önceki bir isteğe veya push sözüne yanıt gönderildiğini belirtir.
PUSH_PROMISE çerçevesi. Bu çerçeve, sunucu tarafından bir kaynağı göndermeye başlamak için tarayıcıya gönderilir. Ayrıca HTTP başlıklarını da içerir. Ancak, bir PUSH_PROMISE çerçevesinde bulunan başlık türleri, normalde bir istekte bulunacak olan başlıklardır. Bu, bir sunucunun normalde göndereceği yanıt başlıklarından farklıdır. Örneğin, istek URL'si PUSH_PROMISE çerçevesinde HTTP/2'ye özgü :path sözde başlığı olarak bulunur, tıpkı bir ana bilgisayarı belirtmek için :authority sözde başlığında olduğu gibi. Bir PUSH_PROMISE içinde bulunabilecek ve bazı tarayıcıların kullandığı diğer başlıklar, örneğin if-none-match gibi önbellek başlıklarıdır.
VERİ çerçeveleri. Bu çerçeveler, bir kaynağın gerçek içeriğini veya tarayıcının POST'ları veya PUT'ları sunucuya gönderdiği içerikleri taşımak için her iki yönde gönderilir.
RST_STREAM çerçeveleri. Bu çerçeveler birçok amaca hizmet eder. Bunlardan biri, sunucuya gönderilen bir akışın gerekli olmadığı yönünde tarayıcı sinyali veriyor.
Sunucu bir kaynağı göndermek istediğinde, bir PUSH_PROMISE çerçevesi hazırlar ve tarayıcıyı itilen içeriği kullanmaya ikna etmek için onu mümkün olan en iyi şekilde tasarlar. Ardından sunucu, PUSH_PROMISE çerçevesini tarayıcı tarafından başlatılan normal bir akışın yanıt bölümüne ekler. Ancak, iletilen kaynağa ilişkin gerçek veriler, sunucu tarafından başlatılan yeni bir akışta gönderilir. – ve böylece bir çift sayı ile.
Tarayıcı, itilen verileri kullanmaya karar verene kadar geçici bir "karantina" bölgesinde tutar. Daha sonra, tarayıcı her gerçek istekte bulunacağı zaman, almak istediği istekle yeterince benzer olup olmadığını görmek için alınan herhangi bir push sözünün içeriğini inceler. Ancak, sunucunun söz verilen kaynak için veri göndermeye başlamak için o ana kadar beklemesine gerek yoktur. Tarayıcı tarafından başlatılan akışta PUSH_PROMISE çerçevesi gönderildikten sonra, sunucu, sunucu tarafından başlatılan yeni akışta bir HEADERS çerçevesi kullanarak yanıt başlıklarının ne olacağını gönderebilir ve daha sonra DATA çerçevelerini kullanarak kaynağın verilerini gönderebilir. Ve herhangi bir zamanda, tarayıcı RST_STREAM kullanarak herhangi bir aktarımı kesebilir.
Önceki örnekte bunun nasıl çalışacağı aşağıda açıklanmıştır. Sunucu HTTP/2 PUSH'a hazırsa, index.html'ye bir istek aldığında, style.css ve script.js'ye yapılan isteklerin yakından takip edildiğini tahmin edebilir. Bu nedenle, olayların biraz önüne geçmek için itici sözler verir. Olayların oluş sırasına ve akış numaralarını oluşturmasına göre işler şöyle görünebilir:
Sunucu, akış 3'te index.html isteyen HEADERS çerçevesini alır ve style.css ve script.js ihtiyacını tahmin edebilir.
Sunucu, yine akış 3'te style.css için bir PUSH_PROMISE ve script.js için bir PUSH_PROMISE gönderir. Bu çerçeveler kabaca bir tarayıcının isteğine eşdeğerdir.
Sunucu, index.html isteğine yanıt vermek için akış 3'te bir HEADERS çerçevesi gönderir.
Sunucu, hala akış 3'te olan index.html içeriğiyle DATA çerçeve(ler)i gönderir.
Sunucu, akış 4'te style.css'ye yanıt için HEADERS çerçevesi gönderir – çift akış numarasına dikkat edin – ve ardından akış 6'da script.js'ye verilen yanıt için.
Sunucu, kendi akış numaralarını kullanarak style.css ve script.js içerikleri için DATA çerçeveleri gönderir.
Anında iletme vaatleri, tarayıcının bunları herhangi bir keşiften çok önce elde etmesi için mümkün olduğunca erken gönderilir. HTTP üstbilgilerinin (özellikle 'önyükleme' anahtar kelimesi ) tarayıcının getirmesi gereken URL'leri ortaya çıkarabileceğine ve hevesli bir tarayıcının bu başlıkları gördükten sonra kaynakları istemeye başlayacağına dikkat edin. Bu nedenle, anında iletme vaatleri, eklendikleri akışın yanıt başlıklarından bile önce gönderilir.