HTTP / 2'de çoğullama ne anlama geliyor?


Yanıtlar:


230

Basitçe ifade etmek gerekirse, çoğullama, Tarayıcınızın aynı bağlantıda aynı anda birden fazla isteği başlatmasına ve istekleri herhangi bir sırayla geri almasına olanak tanır.

Ve şimdi çok daha karmaşık cevap için ...

Bir web sayfasını yüklediğinizde, HTML sayfasını indirir, biraz CSS'ye, biraz JavaScript'e, bir sürü görüntüye ... vb. İhtiyacı olduğunu görür.

HTTP / 1.1 altında, HTTP / 1.1 bağlantınıza bir seferde bunlardan yalnızca birini indirebilirsiniz. Böylece tarayıcınız HTML'yi indirir ve ardından CSS dosyasını ister. Döndüğünde JavaScript dosyasını sorar. Döndüğünde ilk görüntü dosyasını ister ... vb. HTTP / 1.1 temelde eşzamanlıdır - bir istek gönderdiğinizde yanıt alana kadar takılı kalırsınız. Bu, tarayıcının çoğu zaman çok fazla bir şey yapmadığı, çünkü bir isteği tetiklediği, bir yanıt beklediği, ardından başka bir isteği başlattığı, ardından bir yanıt beklediği anlamına gelir ... vb. Birçok JavaScript, Tarayıcının çok fazla işlem yapmasını gerektirir, ancak bu, indirilen JavaScript'e bağlıdır, bu nedenle en azından başlangıçta HTTP / 1.1'e devralınan gecikmeler sorunlara neden olur. Tipik olarak sunucu

Dolayısıyla günümüzde web'deki ana sorunlardan biri, istekleri tarayıcı ve sunucu arasında gönderirken yaşanan ağ gecikmesidir. Sadece onlarca veya belki yüzlerce milisaniye olabilir, bu çok fazla görünmeyebilir, ancak bunlar toplanır ve genellikle web taramasının en yavaş kısmıdır - özellikle web siteleri daha karmaşık hale geldikçe ve ekstra kaynaklar (elde ettikçe) ve İnternet erişimi gerektirdikçe giderek daha fazla mobil cihaz üzerinden (geniş banda göre daha yavaş gecikme ile).

Örnek olarak, HTML'nin kendisi yüklendikten sonra web sayfanızın yüklenmesi gereken 10 kaynak olduğunu varsayalım (100'den fazla kaynak yaygın olduğu için günümüz standartlarına göre çok küçük bir site, ancak bunu basit tutacağız ve bununla devam edeceğiz misal). Ve diyelim ki her isteğin İnternet üzerinden web sunucusuna gidip geri gelmesi 100 ms sürüyor ve her iki uçtaki işlem süresi ihmal edilebilir (basitlik uğruna bu örnek için 0 diyelim). Her kaynağı göndermeniz ve birer birer yanıt beklemeniz gerektiğinden, tüm siteyi indirmek 10 * 100ms = 1.000ms veya 1 saniye sürecektir.

Bunu aşmak için, tarayıcılar genellikle web sunucusuna birden çok bağlantı açar (tipik olarak 6). Bu, bir tarayıcının aynı anda birden fazla isteği tetikleyebileceği anlamına gelir; bu çok daha iyidir, ancak birden çok bağlantıyı kurmak ve yönetmek zorunda kalmanın karmaşıklığı pahasına (hem tarayıcıyı hem de sunucuyu etkiler). Bir önceki örneğe devam edelim ve ayrıca diyelim ki 4 bağlantı var ve basit olması için tüm istekler eşittir diyelim. Bu durumda istekleri dört bağlantının tamamına bölebilirsiniz, böylece ikisinin elde etmesi gereken 3 kaynak ve ikisinin toplam on kaynağı elde etmek için 2 kaynağı olur (3 + 3 + 2 + 2 = 10). Bu durumda en kötü durum 3 tur kez veya 300 ms = 0,3 saniyedir - iyi bir gelişme, ancak bu basit örnek bu çoklu bağlantıların kurulum maliyetini içermez,

HTTP / 2, aynı anda birden fazla istek göndermenize olanak tanırbağlantı - böylece yukarıdaki gibi birden fazla bağlantı açmanıza gerek kalmaz. Böylece tarayıcınız "Bu CSS dosyasını ver. Şu JavaScript dosyasını ver. Gimme image1.jpg. Gimme image2.jpg ... Etc." diyebilir. tek bir bağlantıyı tam olarak kullanmak için. Bu, ücretsiz bir bağlantı için bekleyen isteklerin gönderilmesini geciktirmeme gibi bariz performans avantajına sahiptir. Tüm bu istekler, İnternet üzerinden sunucuya (neredeyse) paralel olarak yollanır. Sunucu her birine yanıt verir ve sonra geri dönmeye başlarlar. Aslında, web sunucusu onlara istediği sırayla yanıt verebildiğinden ve dosyaları farklı sırayla geri gönderebildiğinden, hatta istenen her dosyayı parçalara ayırıp dosyaları birbirine karıştırabildiğinden, bundan daha güçlüdür.satır başı engelleme sorunu). Web tarayıcısı daha sonra tüm parçaları bir araya getirmekle görevlendirilir. En iyi durumda (bant genişliği sınırı olmadığı varsayılarak - aşağıya bakın), 10 isteğin tümü hemen hemen paralel olarak tetiklenir ve sunucu tarafından hemen yanıtlanırsa, bu, temelde bir gidiş dönüş veya 100 ms veya 0,1 saniyeniz olduğu anlamına gelir. 10 kaynağın tümünü indirin. Ve bu, birden çok bağlantının HTTP / 1.1 için sahip olduğu olumsuzlukların hiçbirine sahip değildir! Bu, her web sitesindeki kaynaklar büyüdükçe çok daha ölçeklenebilir (şu anda tarayıcılar HTTP / 1.1 altında 6 paralel bağlantıya kadar açıyor, ancak siteler daha karmaşık hale geldikçe bu da büyümeli mi?).

Bu şema farklılıkları gösterir ve animasyonlu bir versiyonu da vardır .

Not: HTTP / 1.1, aynı anda birden fazla isteğin gönderilmesine de izin veren ardışık düzen kavramına sahiptir . Ancak yine de talep edilme sırasına göre iade edilmeleri gerekiyordu, bu yüzden kavramsal olarak benzer olsa bile HTTP / 2 kadar iyi değil. Bunun hem tarayıcılar hem de sunucular tarafından çok az desteklendiği ve nadiren kullanıldığı gerçeğinden bahsetmiyorum bile.

Aşağıdaki yorumlarda vurgulanan bir şey, burada bant genişliğinin bizi nasıl etkilediğidir. Elbette İnternet bağlantınız ne kadar indirebileceğinizle sınırlıdır ve HTTP / 2 bunu ele almaz. Dolayısıyla, yukarıdaki örneklerde tartışılan bu 10 kaynağın tümü baskı kalitesinde devasa görüntülerse, indirmeleri yine de yavaş olacaktır. Bununla birlikte, çoğu web tarayıcısı için, bant genişliği gecikmeden daha az problemdir. Dolayısıyla, web sitelerinde çok yaygın olduğu gibi, bu on kaynak küçük öğelerse (özellikle küçük olması için gzip ile sıkıştırılabilen CSS ve JavaScript gibi metin kaynakları), o zaman bant genişliği gerçekten bir sorun değildir - bu, genellikle sorun ve HTTP / 2 bunu ele almak için arar. HTTP / 1.1'de başka bir geçici çözüm olarak birleştirmenin kullanılmasının nedeni de budur, bu nedenle, örneğin tüm CSS genellikle tek bir dosyada birleştirilir:HTTP / 2 altında anti-pattern - tamamen ortadan kaldırmaya karşı argümanlar olsa da).

Gerçek dünya örneği olarak söylemek gerekirse: eve teslim için bir dükkandan 10 ürün sipariş etmeniz gerektiğini varsayalım:

  • Tek bağlantı ile HTTP / 1.1, her seferinde bir tane sipariş etmeniz gerektiği ve son gelene kadar bir sonraki öğeyi sipariş edemeyeceğiniz anlamına gelir. Her şeyi atlatmanın haftalar alacağını anlayabilirsiniz.

  • Birden çok bağlantılı HTTP / 1.1, hareket halindeyken aynı anda (sınırlı) sayıda bağımsız siparişe sahip olabileceğiniz anlamına gelir.

  • Ardışık düzenli HTTP / 1.1, beklemeden 10 öğenin tümünü birbiri ardına isteyebileceğiniz anlamına gelir, ancak daha sonra hepsi sizin istediğiniz sırayla gelir. Ve bir ürün stokta kalmadıysa, daha sonra sipariş ettiğiniz ürünleri almadan önce bunu beklemeniz gerekir - daha sonraki ürünler gerçekten stokta olsa bile! Bu biraz daha iyi ama yine de gecikmelere maruz kalıyor ve diyelim ki çoğu mağaza bu şekilde sipariş vermeyi desteklemiyor.

  • HTTP / 2, öğelerinizi herhangi bir sırayla - herhangi bir gecikme olmaksızın (yukarıdakine benzer) sipariş edebileceğiniz anlamına gelir. Dükkan onları hazır olduklarında gönderecek, böylece sizin istemediğinizden farklı bir sırayla gelebilirler ve hatta öğeleri bölebilirler, böylece bu siparişin bazı kısımları önce gelir (yukarıdakinden daha iyi). Nihayetinde bu, 1) her şeyi genel olarak daha hızlı alacağınız ve 2) her öğe geldikçe üzerinde çalışmaya başlayabileceğiniz anlamına gelmelidir ("bu, olacağını düşündüğüm kadar iyi değil, bu yüzden başka bir şey de sipariş etmek isteyebilirim veya bunun yerine" ).

Elbette hala postacı aracınızın boyutu (bant genişliği) ile sınırlısınız, bu nedenle o gün doluysa, ertesi güne kadar bazı paketleri ayırma ofisine geri bırakmak zorunda kalabilirler, ancak bu nadiren bir sorundur. siparişin aslında karşılıklı ve geri gönderilmesindeki gecikmeye. Web taramalarının çoğu, büyük paketler yerine küçük harfleri ileri geri göndermeyi içerir.

Umarım yardımcı olur.


8
Harika açıklama. Örnek, bunu elde etmek için ihtiyacım olan şey. Dolayısıyla, HTTP / 1.1'de yanıtın gelmesini beklemekle bir sonraki isteği göndermek arasında zaman kaybı vardır. HTTP / 2 bunu düzeltir. Teşekkür ederim.
user3448600

1
Ama bence sert. Benden bant genişliği üzerine bir parça eklememi isteyebilirdim - bunu yapmaktan mutluluk duyuyorum ve bu tartışmayı bitirdikten sonra yapacağım. Bununla birlikte, IMHO Bant Genişliği web taraması için büyük bir sorun değildir (en azından batı dünyasında) - gecikme öyle. Ve HTTP / 2 gecikmeyi iyileştirir. Çoğu web sitesi birçok küçük kaynaktan oluşur ve bunları indirmek için bant genişliğine sahip olsanız bile (çoğu zaman insanların yaptığı gibi), ağ gecikmesi nedeniyle yavaş olacaktır. Bant genişliği, büyük kaynaklar için daha çok sorun haline gelir. Büyük görüntülere ve diğer kaynaklara sahip web sitelerinin yine de bant genişliği sınırına ulaşabileceğini kabul ediyorum.
Barry Pollard

1
HTTP, siparişi zorlamak için kullanılmamalıdır - çünkü böyle bir garanti sunmaz. HTTP / 2 ile teslimat için bir öncelik önerebilirsiniz, ancak bir sipariş veremezsiniz. Ayrıca, JavaScript varlıklarınızdan biri önbelleğe alınmış ancak diğeri önbelleğe alınmışsa, HTTP önceliği bile etkileyemez. Bunun yerine , asenkron veya ertelemenin uygun kullanımıyla birleştirilmiş HTML'de sıralamayı ( büyüyenwiththeweb.com/2014/02 /async- vs-defer-attributes.html ) veya need.js gibi bir kitaplık kullanmalısınız.
Barry Pollard

1
Harika açıklama. Teşekkürler!
hmacias

2
Bunun nedeni, HTTP / 1.1'in bir metin akışı olması ve HTTP / 2'nin paket tabanlı olmasıdır - bunlara paketler yerine HTTP / 2'de çerçeveler denir. Dolayısıyla, HTTP / 2'de her çerçeve, çerçevelerin serpiştirilmesine izin veren bir akışa etiketlenebilir. HTTP / 1.1'de böyle bir kavram yoktur, çünkü sadece başlık ve sonra gövde için bir dizi metin satırıdır. Daha fazla ayrıntı burada: stackoverflow.com/questions/58498116/…
Barry Pollard

5

Çoklama isteyin

HTTP / 2, tek bir TCP bağlantısı üzerinden paralel olarak birden çok veri isteği gönderebilir. Bu, HTTP / 2 protokolünün en gelişmiş özelliğidir çünkü web dosyalarını tek bir sunucudan eşzamansız olarak indirmenize izin verir. Çoğu modern tarayıcı, TCP bağlantılarını bir sunucuyla sınırlar. Bu, ek gidiş-dönüş süresini (RTT) azaltır, web sitenizin herhangi bir optimizasyon olmadan daha hızlı yüklenmesini sağlar ve alan adı parçalama gereksiz hale getirir.

görüntü açıklamasını buraya girin


4

Basit Ans ( Kaynak ):

Çoklama, tarayıcınızın birden çok istek gönderebileceği ve tek bir TCP bağlantısında "paketlenmiş" birden çok yanıtı alabileceği anlamına gelir. Dolayısıyla, DNS aramaları ve anlaşmalarıyla ilişkili iş yükü, aynı sunucudan gelen dosyalar için kaydedilir.

Karmaşık / Ayrıntılı Yanıt:

@BazzaDP tarafından sağlanan cevaba bakın.


1
bu, http 1.1'de de ardışık düzen kullanılarak elde edilebilir. HTTP2'de çoğullamanın temel amacı, yanıtları sıralı bir şekilde
beklememek

4

HTTP 2.0'da çoklama, birden çok isteği ve yanıtı paralel olarak sunmak için tek bir bağlantı kullanan ve bu süreçte birçok bağımsız çerçeve oluşturan, tarayıcı ile sunucu arasındaki ilişki türüdür.

Çoklama, katı istek-yanıt anlamından kopar ve bire çok veya çoktan çoğa ilişkilere olanak tanır.

HTTP1 VS HTTP2 değişim süreci


HTTP / 2 Çoğullama örneğiniz çoğullamayı gerçekten göstermiyor. Diyagramınızdaki senaryo, HTTP / 1.1'de sunulan HTTP ardışık düzenini gösterir.
ich5003

@ ich5003 Çoğullamadır çünkü tek bir bağlantı kullanır. Ancak, sadece bir talep başına birkaç yanıt gönderme durumlarının burada temsil edilmediği de doğrudur.
Juanma Menendez

1
Söylemeye çalıştığım şey, yukarıda gösterilen senaryonun sadece HTTP ardışık düzeni kullanılarak da gerçekleştirilebileceğini.
ich5003

Buradaki karışıklığın kaynağının sağdaki diyagramdaki istek / yanıt sırası olduğuna inanıyorum - HTTP / 2'de HTTP / 1.1'de boru hattı oluşturarak da elde edilebilecek özel bir çoklama durumu gösteriyorlar. Diyagramdaki yanıt sırasının istek sırasından farklı olması durumunda, hiçbir karışıklık olmaz.
raiks

2

@Juanma Menendez cevabı doğru olduğu için diyagramı kafa karıştırıcı olduğu için, onu geliştirmeye karar verdim, çoğullama ve boru hattı arasındaki farkı, genellikle birbirine karıştırılan kavramları netleştirdim.

Ardışık düzen (HTTP / 1.1)

Aynı HTTP bağlantısı üzerinden birden çok istek gönderilir . Yanıtlar aynı sırada alınır. İlk yanıt çok zaman alırsa, diğer yanıtların sırada beklemesi gerekir. Bir talimatın kodu çözülürken diğerinin getirildiği CPU borulamasına benzer. Aynı anda birden fazla talimat yayında, ancak sıraları korunuyor.

Çoğullama (HTTP / 2)

Aynı HTTP bağlantısı üzerinden birden çok istek gönderilir . Yanıtlar keyfi sırayla alınır. Başkalarını engelleyen yavaş bir yanıt beklemeye gerek yok. Modern CPU'larda sıra dışı talimat yürütmeye benzer.

Umarım iyileştirilmiş resim farkı netleştirir:

Standart HTTP / 1.1 akış / Ardışık Düzen / Çoklama

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.