HTTP / 2 web soketlerini kullanılmıyor mu?


268

HTTP / 2 protokolünü öğreniyorum. Küçük mesaj çerçeveli ikili bir protokoldür. Tek bir TCP bağlantısı üzerinden akış çoğullamasına izin verir. Kavramsal olarak WebSockets'e çok benziyor.

Web yuvalarını eski haline getirme ve bunları bir tür başsız HTTP / 2 isteği ve sunucu tarafından başlatılan push mesajları ile değiştirme planları var mı? Yoksa WebSockets HTTP / 2'yi tamamlayacak mı?


Kabul edilen cevabın doğru olduğunu düşünüyorum, websockets, web uygulamalarının sunucu tarafından iletilen iletiler de dahil olmak üzere iki yönlü olarak iletişim kurması için hala tercih edilen bir çözümdür. HTTP yalnızca tarayıcılardan daha fazlası için kullanılır ve hem istemci hem de sunucu düşük düzeyli API kullanabiliyorsa, web soketlerine ihtiyaç duymazlar. Yine de çoğu kişi HTTP'yi web uygulamaları için kullanır ve çoğunlukla JavaScript'e maruz kalan API'larla ilgilenir. Moderatörler, kabul edilen cevabın farklı olması gerektiğini düşünüyorsa, bu soruya çok fazla fikir verdiği ve fikrim yanlış olabileceğinden buna karşı değilim.
vbezhenar

Yanıtlar:


161

Anladığım kadarıyla HTTP / 2 websocket için bir yedek değil, SPDY protokolünü standartlaştırmayı amaçlıyor.

HTTP / 2'de, istemcinin tarayıcıdan kaynak yüklemesini iyileştirmek için sahne arkasında sunucu itme kullanılır. Bir geliştirici olarak, geliştirme sırasında bunu gerçekten önemsemiyorsunuz. Bununla birlikte, Websocket ile, geliştiricinin benzersiz bir tam çift yönlü bağlantı ile mesaj tüketebilen ve iletebilen API kullanmasına izin verilir.

Bunlar aynı şeyler değildir ve birbirlerini tamamlamalıdırlar.


3
Cevabın için teşekkürler Guillaume. Ancak ben (veya birisinin) HTTP / 2 belirtiminden bazı referanslar ekleyip eklemeyeceğinizi merak ediyorum. Ne bloglar okudum ve böylece - HTTP / 2 ile gerçek bir çift yönlü iletişim var mı?
Martin Meeser

3
HTTP / 2 özelliklerinin, HTTP / 2'nin kökenleri ve websocket'tan nasıl farklı olduğu hakkında ayrıntılı bilgi vermek için doğru yer olduğundan emin değilim. Ancak, HTTP / 2 ile çift yönlü bir iletişim kullandığımızı kolayca görebilirsiniz: goo.gl/IJVxWS (sayfa 6 ve 13)
Guillaume D.

27
HTTP / 2 gerçekten çift yönlüdür, ancak simetrik değildir, yani yalnızca istemci uygun bir istek gönderebilir ve sunucu yanıt gönderebilir ve vaatler gönderebilir (push). Bu, web soketlerini, her iki tarafın göndermelerine / almalarına izin verildiği açısından daha "eşit" olmaları bakımından farklı kılar.
George Antoniadis

3
IEEE'nin Yazılım Mühendisliği Radyosunda HTTP2'nin kökenleri hakkında mükemmel bir podcast var. Bence bu: se-radio.net/2015/07/episode-232-mark-nottingham-on-http2
Max Murphy

2
tam mantık ile benzer cevap bu InfoQ makalesinde bulunabilir: infoq.com/articles/websocket-and-http2-coexist
mantrid

151

HTTP / 2 spesifikasyonunu okumayı bitirdikten sonra, HTTP / 2'nin çoğu kullanım durumu için eski websockets yaptığını düşünüyorum, ancak belki de hepsi değil.

PUSH_PROMISE(sözlü olarak sunucu push olarak bilinir) burada sorun değildir. Bu sadece bir performans optimizasyonu.

Bir tarayıcıdaki Websockets için ana kullanım durumu, verilerin çift yönlü akışını sağlamaktır. Bu yüzden, OP'nin sorusunun HTTP / 2'nin tarayıcıda çift yönlü akışı etkinleştirmek için daha iyi bir iş yapıp yapmadığını düşünüyorum ve evet, öyle olduğunu düşünüyorum.

Her şeyden önce, bu ise iki di. Yalnızca akışlar bölümüne giriş bölümünü okuyun :

"Akış", bir HTTP / 2 bağlantısı içinde istemci ve sunucu arasında değiş tokuş edilen bağımsız, çift yönlü bir kare dizisidir. Akışların birkaç önemli özelliği vardır:

Tek bir HTTP / 2 bağlantısı, aynı anda birden çok akıştan uç nokta serpiştirme çerçeveleri içeren, aynı anda birden çok akış içerebilir.

Akışlar tek taraflı olarak oluşturulabilir ve kullanılabilir veya istemci veya sunucu tarafından paylaşılabilir.

Akışlar her iki uç noktadan da kapatılabilir.

Gibi Makaleler bu (başka yanıtında bağlantılı) HTTP / 2 bu yönü hakkında yanlış. Onlar bidi değil derler. Bakın, HTTP / 2 ile gerçekleşemeyen bir şey var: Bağlantı açıldıktan sonra, sunucu normal bir akış başlatamaz, sadece bir push akışı başlatamaz. Ancak istemci bir istek göndererek bir akışı açtığında, her iki taraf da DATA çerçevelerini her zaman kalıcı bir sokete gönderebilir - tam bidi.

Bu, websockets'ten çok farklı değildir: istemcinin, sunucudan da veri gönderebilmesi için bir websocket yükseltme isteği başlatması gerekir.

En büyük fark, websockets'ten farklı olarak, HTTP / 2'nin kendi çoğullama semantiğini tanımlamasıdır: akışların tanımlayıcıları nasıl elde ettiği ve çerçevelerin üzerinde bulundukları akışın kimliğini nasıl taşıdığı. HTTP / 2 ayrıca akışlara öncelik vermek için akış kontrolü semantiğini de tanımlar. Bu, bidi'nin gerçek dünyadaki uygulamalarının çoğunda önemlidir.

(Bu yanlış makale aynı zamanda Websocket standardının çoğullama olduğunu söylüyor. Hayır, yok. Bunu bulmak gerçekten zor değil, sadece Websocket RFC 6455'i açın ve ⌘-F tuşlarına basın ve "multiplex" yazın.

Protokolün genişletilebilir olması amaçlanmıştır; gelecekteki sürümlerde muhtemelen çoğullama gibi ek kavramlar sunulacaktır.

Websocket multiplexing için 2013 taslak uzantısı olduğunu göreceksiniz. Ancak hangi tarayıcıların (varsa) bunu desteklediğini bilmiyorum. SPA web uygulamamı bu uzantının arkasına oluşturmaya çalışmam, özellikle HTTP / 2 ile destek asla gelmeyebilir).

Çoğullama, bidi için bir web soketini her açtığınızda normal olarak kendiniz yapmanız gereken bir şeydir, örneğin, reaktif olarak güncellenen tek bir sayfa uygulamasına güç vermek için. Bir kez ve herkes için özen HTTP / 2 spec, sevindim.

HTTP / 2'nin neler yapabileceğini bilmek istiyorsanız, gRPC'ye bakın. gRPC, HTTP / 2 genelinde uygulanır. Özellikle gRPC'nin sunduğu yarı ve tam çift yönlü akış seçeneklerine bakın. (GRPC'nin şu anda tarayıcılarda çalışmadığını, ancak bunun nedeni aslında tarayıcıların (1) HTTP / 2 çerçevesini istemci javascriptine göstermediği ve (2) genellikle gRPC spesifikasyonu.)

Web soketlerinin hala nerede bir yeri olabilir? Büyük olan sunucu-> tarayıcı ikili verileri itti. HTTP / 2, sunucu-> tarayıcı tarafından itilen ikili verilere izin verir, ancak tarayıcı JS'de gösterilmez. Ses ve video karelerini itmek gibi uygulamalar için bu, web soketlerini kullanmak için bir nedendir.

Düzenleme: 17 Ocak 2020

Zamanla bu cevap yavaş yavaş zirveye yükseldi (bu iyidir, çünkü bu cevap aşağı yukarı doğrudur). Bununla birlikte, çeşitli nedenlerle doğru olmadığını söyleyen ara sıra yorumlar vardır, genellikle PUSH_PROMISEtek bir sayfa uygulamasında mesaj odaklı sunucu -> istemci pushu hakkında bazı karışıklıklar veya gerçekte nasıl tüketileceği ile ilgili . Ve bir tarayıcıda sunucu tarafından itilen ikili veri olan web soketleri için bir kullanım durumu vardır. JSON dahil olmak üzere metin verileri için web soketleri kullanmayın, SSE kullanın.

Özetlemek gerekirse: HTTP / 2 Protokolü tam çift yönlüdür. Ancak, modern web tarayıcıları çerçeve yönelimli HTTP / 2 protokolünü JavaScript'e maruz bırakmaz . Bununla birlikte, bir HTTP / 2 bağlantısı üzerinden aynı kaynaktan birden fazla istekte bulunursanız, kaputun altında tüm bu trafik bir bağlantıda çoğullıyor (ve bu bizim umurumuz!).

Dolayısıyla, gerçek zamanlı bir sohbet uygulaması oluşturmanız gerekiyorsa, diyelim ki, sohbet odasındaki açık bağlantıları olan tüm istemcilere yeni sohbet mesajları yayınlamanız gerekiyorsa, bunu web soketleri olmadan yapabilirsiniz (ve muhtemelen yapmalısınız).

İletileri aşağı itmek için Sunucu Gönderilmiş Etkinlikler'i ve istekleri göndermek için Getir api'sini kullanırsınız. Sunucudan Gönderilen Olaylar (SSE), iletiye yönelik bir sunucudan istemciye akış sunan az bilinen ancak iyi desteklenen bir API'dir. İstemci JavaScript'e benzemese de, tarayıcınızın altında (HTTP / 2'yi destekliyorsa) tüm bu mesajları çoğaltmak için tek bir TCP bağlantısını yeniden kullanır. Hiçbir verimlilik kaybı yoktur ve aslında websockets üzerinden bir kazançtır. Birden fazla akışa mı ihtiyacınız var? Birden fazla EventSources açın! Sizin için otomatik olarak çoklanırlar.

Daha fazla kaynak verimli olmanın ve websocket el sıkışmasından daha az başlangıç ​​gecikmesine sahip olmanın yanı sıra, Sunucu Gönderilen Olaylar otomatik olarak geri düşüp HTTP / 1.1 üzerinde çalıştıkları güzel bir özelliğe sahiptir. Ancak bir HTTP / 2 bağlantınız olduğunda inanılmaz derecede iyi çalışırlar.

İşte reaktif olarak güncellenen SPA'yı gerçekleştirmenin gerçek dünya örneği ile iyi bir makale .


21
Bu cevap, kabul edilenler de dahil olmak üzere diğerleriyle kısmen aynı fikirde değildir ve aynı zamanda en iyi cevaptır, çünkü doğrudan kaynaklara dayanmaktadır.
sudo

7
Bu cevaba ve yoruma tamamen katılıyorum. HTTP / 2 iki yönlüdür.
Martin Meeser

3
Aslında doğru cevap, adam kaynakları ve gerçek dünya uygulamasını (grpc) kontrol etmek için rahatsız
Vladimir Akopyan

1
Web soketlerinde, istemci bir websocket yükseltme isteği başlatana kadar sunucu rasgele bayt göndermeye başlayamaz, ancak istediği zaman zorlayabilir. HTTP / 2'de, istemci bir veri bağlantısı başlatana kadar sunucu baytları itmeye başlayamaz, ancak istediği zaman baytları itebilir. İşlevsel fark nedir? Belirttiğim gibi, PUSH_PROMISE yeteneği kırmızı bir ringa balığıdır. HTTP / 2'nin web soketlerinin yerini almasının nedeni bu değildir. Bu sadece küçük bir performans optimizasyonu. Bidi akışı olan HTTP / 2'nin kalbi ile ilgisi yoktur.
masonk

1
Bu cevap basitçe yanlış. Kolayca kafa karıştırıcı o kadar çok yönü karıştırır. Bununla birlikte, işin özü, "bidi" HTTP / 2 akışlarının istek yanıtı güdümlü (ve sayı olarak sınırlı) olmasıdır, oysa WebSockets protokolü gerçek bir mesaj tabanlı bidi protokolüdür (istek yanıtı tabanlı değil, el sıkışma aşaması hariç). Bu, yalnızca spesifikasyonu yanlış yazarak köprülenemeyen büyük bir farktır (@masonk'un istemeden yaptığı gibi).
Myst

64

Nay diyorum ( Websockets modası geçmiş değil ).

İlk ve en sık göz ardı edilen sorun, HTTP / 2 push uygulamasının uygulanamayacağı ve proxy'ler, yönlendiriciler, diğer aracılar ve hatta tarayıcı tarafından göz ardı edilebileceğidir .

ie (HTTP2 taslağından):

Bir aracı sunucudan push alabilir ve bunları istemciye iletmemeyi seçebilir . Başka bir deyişle, aktarılan bilgilerin nasıl kullanılacağı bu aracıya bağlıdır. Aynı şekilde, aracı sunucu tarafından herhangi bir işlem yapılmadan istemciye ek baskılar yapmayı seçebilir.

Bu nedenle, HTTP / 2 Push WebSockets'in yerini alamaz.

Ayrıca, HTTP / 2 bağlantıları bir süre sonra kapanır.

Standardın şunları ifade ettiği doğrudur:

HTTP / 2 bağlantıları kalıcıdır. En iyi performans için, istemcilerin bir sunucuyla daha fazla iletişim kurmaya gerek olmadığı (örneğin, kullanıcı belirli bir web sayfasından uzaklaştığında) veya sunucu bağlantıyı kapatana kadar bağlantıları kapatmayacağı beklenir.

Fakat...

Sunucular mümkün olduğunca açık bağlantıları sürdürmeye teşvik edilir, ancak gerekirse boş bağlantıları sonlandırmasına izin verilir . Uç noktalardan biri taşıma katmanı TCP bağlantısını kapatmayı seçtiğinde, sonlandırma uç noktası ilk önce bir GOAWAY (Bölüm 6.8) çerçevesi göndermelidir;

Aynı bağlantı açıkken içerik aktarmaya izin verse ve HTTP / 2, HTTP / 1.1'in 'canlı tut' tarafından ortaya konan bazı performans sorunlarını çözse bile ... HTTP / 2 bağlantıları süresiz olarak açık tutulmaz .

Bir web sayfası da kapatıldıktan sonra bir HTTP / 2 bağlantısını yeniden başlatamaz (uzun süre geri çekilmedikçe, yani).

EDIT (2017, iki yıl sonra)

HTTP / 2 uygulamaları, birden çok tarayıcı sekmesinin / penceresinin tek bir HTTP / 2 bağlantısını paylaştığını, yani pushhangi sekme / pencereye ait olduğunu asla bilemeyeceğini ve pushWebsockets yerine kullanılmasını ortadan kaldıracağını gösterir.

DÜZENLE (2020)

Neden insanların cevabı düşürmeye başladığından emin değilim. Bir şey olursa, cevabın ilk olarak gönderilmesinden sonraki yıllar, HTTP / 2'nin WebSockets'in yerini alamayacağını ve bunu yapmak için tasarlanmadığını kanıtladı.

WebSocket bağlantılarını tünellemek için HTTP / 2 kullanılabilir , ancak bu tünellenmiş bağlantılar yine de WebSocket protokolünü gerektirir ve HTTP / 2 kapsayıcısının davranış biçimini etkiler.


4
WS soketleri de sonsuza kadar açık kalmayacak. Farklılıklar akışlardır; HTTP / 2 size çoklu akış akışları sağlar, bu da sunucudaki akış kontrolünün çok farklı ve genellikle kilitsiz olduğu anlamına gelir. WS (protokol olarak) düzenlemesiz gelen işleme sahip olmalıdır. Akış kontrolü yığının yukarısına uygulanır. Güvenlik ve sunucu bütünlüğü için HTTP / 2, WS'den çok daha iyidir.
tahvil

3
@bond, HTTP / 2'nin bir taşıma katmanı olarak birçok avantajı olduğunu kabul ediyorum (birçok tarayıcı sekmesinde tek bir bağlantıyı paylaşmak sadece bir örnektir). Ancak, bir iletişim katmanı olarak tasarlanmamıştır . Bu işlevsel bir sorudur. Her iki protokol de farklı ihtiyaçlara cevap vermektedir. sshWeb Soketlerini kullanırken tarayıcıda bir terminal uygulamak çok kolaydır. Özellikle birden fazla sekme açıksa HTTP / 2'de tam bir baş ağrısı olacaktır. Ayrıca, tarayıcı (veya HTTP / 2 proxy'lerinden biri) bağlantıyı kapatırsa ne olur? Müşteri yeni veri olmadığını varsayabilir mi? oylamaya geri döndük.
Myst

1
Tarayıcı, WS bağlantınızı kolayca kapatabilir. Her türlü ağ ile hayat budur. Dürüst olmak gerekirse, HTTP / 2'deki çoğullama aşırıdır. Protokolün gerçekten buna ihtiyacı yoktu. Birden fazla akışı açarak, verimi sınırlayan TCP arabellekleriyle sorun yaşamaya başlarsınız. WS'nin yaptığı işte HTTP / 2'den daha iyi olduğunu kabul ediyorum. Temel olarak WS, kullanıcıların kötü şeyler yapmasını önlemek için çok daha yüksek seviye kontrollere ihtiyaç duyan bir şeydir.
tahvil

2
Ben Amca'yı (Örümcek Adam) alıntılamak için: "Unutma, büyük güçle büyük sorumluluk gelir" Evet, @bond, çok haklısın. Websockets, çok "ham" bir protokol olan daha sorumlu bir sunucu tasarımı gerektirir. Ve evet, WS HTTP / 2 kadar kolay kapatılabilir, ancak WS onclosegeri aramayı destekler , bu nedenle yoklama gerekmez. Çoğullamaya gelince, bunun bir seçimden çok bir gereklilik olduğunu düşünüyorum. keep-alivebaşarısız oldu ve "ilk satırda" performans isabet önlemek için tek yolu çoklama riskini oldu. Zaman gösterecek :)
Myst

1
Sunucu tasarımı açısından, giden çoğullama karmaşık ve pahalı bir sorundur. IO mekaniğinin dahili olarak yoklanmasını gerektirir ve bu da cehennem kadar pahalıdır. Büyük belgeleri akışa almadığınız sürece, çoğaltma bile çalışmaz çünkü istek muhtemelen ikinci bile kullanılabilir olmadan ve çoğullama işlemi başarısız olmadan önce tamamen dahili olarak yanıtlanmış ve arabelleğe alınmış olacaktır. RTMP'nin giden çoğullaması vardır, ancak bunu yalnızca Adobe'nin sunucusu yapar. HTTP / 2'nin RTMP'ye ne kadar yakın olduğu şaşırtıcı.
tahvil

39

Cevap hayır. İkisi arasındaki hedef çok farklı. HTTP / 2 üzerinden WebSocket için tek bir HTTP / 2 TCP hattı üzerinden birden fazla WebSocket bağlantısı kurmanıza olanak sağlayan bir RFC bile vardır.

HTTP / 2 üzerinden WS, yeni bağlantılar açma süresini azaltarak ve daha fazla yuva, yumuşak IRQ ve arabellek eklenmeden daha fazla iletişim kanalına izin vererek bir kaynak koruma oyunu olacaktır.

https://tools.ietf.org/html/draft-hirano-httpbis-websocket-over-http2-01


Bu inanılmaz! Bunu uygulayan bir Javascript istemcisinin herkese açık bir örneği var mı? Örnek bulamıyorum. Ne yapmam gerekir? Bu iyi bir kaynak mı? undertow.io/blog/2015/04/27/An-in-depth-overview-of-HTTP2.html
RaisinBranCrunch

Yukarıdaki istemlerin 1) başlığının uzunluğunu bulmak, 2) alan adlarını düşürmek için bir kaynak bilen var mı?
Pim Heijden

@PimHeijden HTTP / 1.x'de başlık uzunluğunu algılamak için 4 bayt uç işaretini arayan tüm baytlar arasında döngü gerektirir. Bu çok pahalı. Alan adlarının büyük / küçük harfe duyarlı olmaması, karakterlerin hem büyük hem de küçük harfli sürümleri için herhangi bir alan eşleşmesinin yapılması gerektiği anlamına gelir. Bu, çekler için tüm karakter setinin büyük ve küçük harfe kadar bilgisini gerektirir. 2.x'te küçük harf olduğunu varsayabilirsiniz.
tahvil

@RaisinBranCrunch Bunların hiçbirini Javascript'ten kontrol edemezsiniz. Tarayıcı sizin için her şeyi yapar.
tahvil

@bond Şu anda bir soket sunucusuna websocket bağlantıları göndermek için Nginx ve proxy_pass ile HTTP / 2 kullanıyorum, ancak tek bir kullanıcı web sitesinde birden çok sekme açtığımda, soket sunucusu bunu birden çok bağlantı olarak ele alıyor. HTTP / 2 bağlantılarının bir TCP borusu üzerinden çoğullaması durumunda, sunucunun bir bağlantı olarak kabul edeceğini varsayıyorum. Bu yanlış mı? Sunucunun ekstra gereksiz bağlantılar yapmadığını doğrulamanın bir yolu var mı?
RaisinBranCrunch

23

Bu InfoQ makalesinden alıntı yapmak için :

Basit bir nedenden ötürü, cevap açıkça hayırdır: Yukarıda gördüğümüz gibi, HTTP / 2 sunucunun proaktif olarak kaynakları istemci önbelleğine göndermesini sağlayan Sunucu Push'u sunar. Bununla birlikte, verilerin istemci uygulamasının kendisine aktarılmasına izin vermez. Sunucu push'ları yalnızca tarayıcı tarafından işlenir ve uygulama koduna gelmez, yani uygulamanın bu olaylar için bildirim alması için API yoktur.

Websockets, gerçek zamanlı verileri aktarmak için hem istemci (tarayıcıda çalışıyorsa javascript) hem de uygulama kodu (sunucuda çalışıyor) tarafından kullanılabilen API'leri ortaya çıkarırken HTTP2 push gerçekten tarayıcınız ve sunucunuz arasında bir şeydir.


5

İleti değişimi ve basit akış (ses değil, video akışı) hem Http / 2 çoğullama hem de WebSockets aracılığıyla yapılabilir. Yani bazı çakışmalar var, ancak WebSockets iyi kurulmuş bir protokole, birçok çerçeveye / API'ye ve daha az üstbilgiye sahiptir. İşte konu hakkında güzel bir makale .


2

HTTP / 2'de WebSocket uygulaması olacaktır. https://tools.ietf.org/html/rfc8441


Hayır, olmayacak ... WebSocket bağlantısı HTTP / 2 üzerinden tünellenecek , ancak HTTP / 2 protokolün yerine geçmeyecek ve kullanılmayacaktır.
Myst

@ Bunu söyledim mi?
Dzintars

2
Hayır, bunu söylemedin, ben söyledim. HTTP / 2'de, IMHO'nun önemli ayrıntılar atlandığı için çok kısa ve biraz yanıltıcı göründüğü bir WebSocket uygulaması olacağını yazdınız.
Myst

2

Nisan 2020'de HTTP / 2, WebSockets'i geçersiz kılmıyor. WebSockets'in HTTP2'ye göre en büyük avantajı

HTTP/2 works only on Browser Level not Application Level

HTTP / 2'nin iletişime izin vermek ve bir çeşit JSON veya başka verileri doğrudan Uygulamadan (örn. Web Sitesi) sunucuya aktarmak için WebSockets gibi herhangi bir JS API'sı sunmadığı anlamına gelir. Dolayısıyla, inandığım kadarıyla HTTP / 2, WebSockets'i yalnızca sunucuyla konuşmak için WebSockets gibi API sunmaya başlarsa geçersiz kılacaktır. O zamana kadar sadece güncellenmiş ve daha hızlı HTTP 1.1 sürümü.


2

Bugün itibariyle hayır.

HTTP / 2, HTTP ile karşılaştırıldığında, bir sunucuyla bağlantı kurmanızı sağlar. Oradan, aynı anda birden fazla veri akışına sahip olabilirsiniz. Amaç, istemci istemeden bile aynı anda birden fazla şeyi itebilmenizdir. Örneğin, tarayıcı bir tarayıcı istediğinde index.html, sunucu index.cssve tuşlarına basmak da isteyebilir index.js. Tarayıcı bunu istemedi, ancak sunucu sorulmadan sağlayabilir, çünkü birkaç saniye içinde isteyeceğinizi varsayabilir.

Bu daha hızlı alma HTTP / 1 alternatifi daha index.htmlihtiyacı keşfederek, onu ayrıştırma, index.jsve index.cssve daha sonra bu dosyalar için 2 diğer istekleri bina. HTTP / 2, sunucunun istemcinin istemediği verileri aktarmasına izin verir.

Bu bağlamda, WebSocket'a benzer, ancak tasarım gereği değil. WebSocket'in TCP bağlantısına veya seri bağlantıya benzer iki yönlü iletişime izin vermesi gerekir. Her ikisinin de birbirleriyle iletişim kurduğu bir soket. Ayrıca, en büyük fark, HTTP protokolünde kapsüllenmemiş ham baytlarda rasgele veri paketleri gönderebilmenizdir. Üstbilgiler, yollar, sorgu dizeleri kavramları yalnızca el sıkışma sırasında gerçekleşir, ancak WebSocket bir veri akışı açar.

Diğer fark, Javascript'te WebSocket'e çok daha ince ayarlı erişim elde etmenizdir, HTTP ile ise tarayıcı tarafından yönetilir. HTTP ile elde edebileceğiniz her şey XHR/ içine sığabileceğiniz her şeydir fetch(). (: Örn Bu da tarayıcı Eğer kontrol etmeyi mümkün olmadan kesişme ve modify HTTP başlıkları kavuşacağı anlamına geliyor Origin, Cookiesvs). Ayrıca, HTTP / 2'nin gönderebildiği tarayıcıya gönderilir. Bu, JS'nin her zaman (eğer varsa) bir şeylerin itildiğini bilmediği anlamına gelir. Yine, bu mantıklıdır index.cssve index.jstarayıcı bunu önbelleğe alır, ancak veri paketleri için çok fazla değildir.

Gerçekten adında. HTTP, Köprü Metni Aktarım Protokolü anlamına gelir. Varlıkları aktarma konseptine odaklandık. WebSocket, ikili verilerin çift yönlü olarak iletildiği bir soket bağlantısı oluşturmakla ilgilidir.


Gerçekten tartışmadığımız şey SSE'dir (Sunucu tarafından Gönderilen Etkinlikler). Verileri uygulamaya (JS) aktarmak HTTP / 2'nin amacı değildir, ancak SSE içindir. SSE, HTTP / 2 ile gerçekten güçleniyor. Ancak önemli olan verinin kendisi olduğunda, değişken uç noktalara ulaşılmadığında WebSockets için gerçek bir yedek değildir. WebSocket ile her uç nokta için yeni bir veri akışı oluşturulur, ancak SSE ile mevcut HTTP / 2 oturumu arasında paylaşılır.


Burada her biri için hedefler özetlenmiştir:

  • HTTP - Bir öğeye sahip bir isteğe yanıt verme
  • HTTP / 2 - Birden fazla öğeye sahip bir isteğe yanıt verme
  • SSE - Tek yönlü metin (UTF-8) olay akışıyla yanıtlama
  • WebSocket - İki yönlü bir ikili veri akışı oluşturur
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.