Neden “HTTP durum bilgisi olmayan bir protokoldür” deniyor?


170

HTTP'nin HTTP Çerezleri vardır. Çerezler, sunucunun kullanıcı durumunu, bağlantı sayısını, son bağlantı vb. İzlemesine olanak tanır.

HTTP'nin, aynı TCP Bağlantısından birkaç istek gönderilebildiği kalıcı bağlantılar (Canlı Tut) vardır.


3
"Vatansızlık" ı görmediğim başka bir alan Yetkilendirmededir - özellikle Proxy-Yetkilendirmesi. Görünüşe göre müzakere sırasında durum bilgisi var. NTLM Kimlik Doğrulaması için, istemcinin Proxy-Kimlik Doğrulaması türünü hatırlaması gerekir ve NTLM İleti Türlerinde bir sıra olduğundan sunucunun durum bilgisi olması gerekir. Bu yüzden cevapları anladığımdan emin değilim.
Lindsay Morsillo

1
Şimdi HTTP / 1.1 eklemeli miyim? Çünkü HTTP / 2'nin durumu olduğunu düşünüyorum.
Jose Nobile

4
HTTP / 2 durumludur. HTTP 1 vatansızdır. HTTP 1'e yönelik, çerezler gibi daha sonraki eklemeler, durum eklendi. Bu eklemeler "temel" HTTP 1 belirtimi dışında değildir. Bu nedenle HTTP 1'in uygulamada olmasa da durum bilgisi olmayan bir protokol olduğu söylenir. HTTP / 2 ise, pişmiş durumdaki bileşenlerle tasarlanmıştır. "Durum bilgisi" olarak adlandırılması gerekliliğini karşılamak için hiçbir ek gerekmemiştir.
Zamicol

Yanıtlar:


130

Aynı HTTP bağlantısı üzerinden birden fazla istek gönderilebilmesine rağmen, sunucu aynı soket üzerinden gelmelerine özel bir anlam yüklemez. Bu, yalnızca her istek için bir bağlantı kurmak için harcanacak zamanı / bant genişliğini en aza indirmeyi amaçlayan bir performans şeyidir.

HTTP ile ilgili olarak, hepsi hala ayrı isteklerdir ve isteği yerine getirmek için kendi başlarına yeterli bilgi içermelidir. "Vatansızlık" ın özü budur. İstekler, sunucunun bildiği bazı paylaşılan bilgiler olmadığında, çoğu durumda bir çerezde oturum kimliği olan birbirleriyle ilişkilendirilmez.


1
Sunucu bir oturumu (sunucu tarafı) hatırladığında ve kullanıcı deneyimini buna göre özelleştirdiğinde ne olur?
NurShomik

3
@NurShomik: Oturumların tipik olarak nasıl çalıştığına ilişkin açıklama için stackoverflow.com/a/3521393/319403 adresine bakın .
cHao

12
@Andrew: HTTP, TCP üzerinde "yerleşik değil" ve TCP'nin durumu HTTP değil. İkisi, yığındaki farklı katmanlardaki tamamen ayrı protokollerdir. İsterseniz HTTP'yi adlandırılmış kanallar üzerinden veya hatta dosya göndererek, bunu kabul etmek için yeterli mazoşistiniz varsa sunabilirsiniz ve HTTP'nin taşıma protokolü agnostik olması nedeniyle tam olarak çalışacaktır. Bu seviyede, hepsi sadece istek ve yanıtlar. Bu, alt veya üst düzey protokoller tarafından hangi durumun kullanılabileceğini / bakımının yapılacağını / gerektirdiğini dikkate almadan HTTP'nin kendisini vatansız hale getirir.
cHao

@cHao Tamam, kabul edeceğim. Eğer biz "olarak değil vatansızlığa tanımlamak mutlaka çalışabilmesi için devlet olması gerek" (HTTP içinde devlet için seçenekler listesi aşağıda dimo414 cevabını bkz Wikipedia'dan alıntı) ve eğer biz kendi başına kesinlikle her protokol görüntülemek ve altındaki katmanları dayalı değil , sonra evet, HTTP'nin "durumsuz" olduğunu kabul edebilirim.
Andrew

101

Gönderen Vikipedi :

HTTP durum bilgisi olmayan bir protokoldür. Durum bilgisi olmayan bir protokol, sunucunun birden fazla istek süresince her kullanıcı hakkında bilgi veya durum tutmasını gerektirmez.

Ancak bazı web uygulamalarının, örneğin bir web sayfasının içeriğini bir kullanıcı için özelleştirmek için bir web sunucusu gerektiğinde, kullanıcının sayfadan ilerlemesini izlemesi gerekebilir. Bu durumlar için çözümler şunları içerir:

  • HTTP çerezlerinin kullanımı.
  • sunucu tarafı oturumları,
  • gizli değişkenler (geçerli sayfa bir form içerdiğinde) ve
  • URI tarafından kodlanmış parametreler kullanılarak URL yeniden yazma, örneğin /index.php?session_id=some_unique_session_code.

Protokolü vatansız yapan şey, sunucunun durumu birden fazla istek üzerinde izlemesine gerek olmamasıdır, eğer isterse bunu yapamaz. Bu, istemci ve sunucu arasındaki sözleşmeyi basitleştirir ve çoğu durumda (örneğin bir CDN üzerinden statik veri sunmak) aktarılması gereken veri miktarını en aza indirir. Sunucuların , müşterilerin ziyaretlerinin durumunu korumaları isteniyorsa , istekleri verme ve yanıtlama yapısı daha karmaşık olacaktır. Olduğu gibi, modelin sadeliği en büyük özelliklerinden biridir.


21

Durumsuz bir protokol, sunucunun çoklu iletişim istekleri boyunca her iletişim ortağı hakkındaki oturum bilgilerini veya durumunu tutmasını gerektirmediğinden.

HTTP durum bilgisi olmayan bir protokoldür, yani işlem sona erdiğinde tarayıcı ile sunucu arasındaki bağlantı kesilir.


2
Ancak, HTTP çerezleri kullanarak bilgileri sunucuya kaydedebilir. Canlı tutma HTTP her istekte bağlantıyı kapatmaz.
Jose Nobile


18
Bilgilerin sunucuya kaydedilmesi, bağlantının sürekli olduğu anlamına gelmez.
srijan

1
@srijan Şey, hayır. Yani? Kimse aksini iddia etmiyordu.
Mark Amery

10

HTTP olarak adlandırılır, stateless protocolçünkü her istek, daha önce yürütülen isteklerle ilgili herhangi bir bilgi sahibi olmadan bağımsız olarak yürütülür;

Protokolü yapan statelessşey, orijinal tasarımında HTTP'nin nispeten basit olmasıdır file transfer protocol:

  1. URL adlı bir dosya için istekte bulunma,
  2. dosyayı yanıt olarak al,
  3. kes.

Aynı istemciden bile, bir bağlantıyla diğeri arasında hiçbir ilişki kurulmadı. Bu, istemci ve sunucu arasındaki sözleşmeyi basitleştirir ve çoğu durumda aktarılması gereken veri miktarını en aza indirir.


3

Protokol HTTP Durum tam protokolü olarak verilirse, tarayıcı penceresi web uygulamasına verilen birden fazla istek için web sunucusuyla iletişim kurmak için tek bağlantı kullanır. Bu, tarayıcı penceresi ile web sunucuları arasındaki bağlantıları uzun süre meşgul etmek ve tutmak için tarayıcı penceresine şans verir. istemcilerdeki bağlantıların çoğu boşta olsa bile, web sunucusunun maksimum bağlantılarına ulaşma durumu yaratabilir.


1
HTTP zaten canlı durumdadır, yani sunucu bağlantıyı kapatmaz ve istemci aynı bağlantıda birçok istekte bulunabilir.
Jose Nobile

3

HTTP bağlantısızdır ve bu, HTTP'nin durum bilgisi olmayan bir protokol olduğu doğrudan bir sonucudur. Sunucu ve istemci yalnızca geçerli bir istek sırasında birbirinin farkındadır. Daha sonra ikisi de birbirini unutur. Protokolün bu yapısı nedeniyle, ne istemci ne de tarayıcı web sayfalarındaki farklı talepler arasında bilgi tutamaz.


1

Vatansız nedir ??

İstek yapıldığında ve yanıt istemciye geri verildikten sonra bağlantı kesilir veya sonlandırılır. Sunucu istekte bulunanla ilgili her şeyi unutacaktır.

Neden vatansız ??

Web, vatansız protokolü seçmeyi tercih ediyor. Dahi bir seçimdi çünkü web'in asıl amacı belgelerin (web sayfaları) son derece büyük bir hizmete sunulmasına izin vermekti. sunucu için çok temel donanım kullanan kişilerin.

Uzun süredir devam eden bir bağlantının sürdürülmesi son derece kaynak yoğun olurdu.

Web durum protokolü seçildiyse, ziyaretçinin bağlantısını sürdürmek için sunucu üzerindeki yük artırılmış olur.


1

HTTPvatansızdır. TCPdurumludur. Sözde HTTP connectiondeğil, sadece HTTP requestve vardır HTTP response. Bir başkasını yapmak için bakıma ihtiyacımız yok HTTP request. "Canlı tutma" bağlantı başlığı, bağlantıyı her zaman kesmek ve yeniden kurmak yerine TCP, sonraki HTTPistek ve yanıtlar tarafından yeniden kullanılacağı anlamına gelir TCP.


0

Bence birisi STATELESS konsepti için çok talihsiz bir isim seçti ve bu yüzden tüm yanlış anlaşılmaya yol açıldı. Bu, herhangi bir kaynağı depolamak değil, istemci ve sunucu arasındaki ilişkiyle ilgilidir.

Müşteri: Tüm kaynakları yanımda tutuyorum ve işlenmesi gereken tüm önemli öğelerin "listesini" gönderiyorum. İşinizi yapın.

Sunucu: Pekala .. size doğru cevabı vermek için neyin önemli olduğunu filtreleme sorumluluğunu üstleneyim.

Bu, sunucunun istemcinin "kölesi" olduğu ve her istekden sonra "efendisinin" unutulması gerektiği anlamına gelir. Aslında STATELESS sadece sunucunun durumunu ifade eder.

https://www.ics.uci.edu/~fielding/pubs/dissertation/rest_arch_style.htm#sec_5_1_3

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.