TCP soketleri durumsal olacak şekilde tasarlanmıştır, bu nedenle genel olarak oturumları tanımlamak için kullanılırlar. SSH ve ftp gibi protokoller tam olarak bunu yapar.
HTTP durum bilgisi olmayan olarak tasarlanmıştır ve her bağlantı yalnızca karşıdan yüklenecek bir kaynakla ilişkilendirilir. Bir kaynak indirildikten sonra HTTP isteğinin sürdüğü TCP soketi kapatılır. Bunun asıl nedeni basitlikti. Ancak yan etki, modern web sitelerini çalıştıran HTTP sunucularının SSH veya ftp gibi soket tabanlı sunuculardan çok daha fazla kullanıcıyı işleyebilmesidir.
Bu yüzden soketler kullanılamaz çünkü HTTP web sayfasını indirdikten sonra soketi kapatacaktır.
Tabii ki, HTTP'nin kaynak başına soketi kapatacağını söylemek, işleri aşırı derecede basitleştiriyor çünkü HTTP, soket başına birden çok kaynak indirebilen boru hattı ve kalıcı bağlantılar gibi özelliklere sahip. Ama bu sadece optimizasyon. Her şey indirildikten sonra, tarayıcınız biraz zaman aşımından sonra soketi kapatacaktır.
HTTP başlangıçta HTML dosyalarını indirmek için basit bir protokol olarak tasarlanmıştır. Eski tarayıcılar ayrıca Gopher ve ftp gibi diğer protokollerden HTML dosyaları indirebilir. Bu nedenle, HTML dosyaları sadece basit metin dosyaları olduğu için HTTP'yi durumlu hale getirmenin bir nedeni yoktu.
Web formları tanıtıldıktan ve HTML sayfaları verileri sunucuya geri gönderdikten sonra oturumlara ihtiyaç duymaya başladı. Böylece durumları, durumsuz bir ağ katmanı üzerinden iletilen durum bilgisi olan bir aktarım katmanı üzerinden aktarılan durumsuz bir protokole yeniden sokmak için çerezler oluşturuldu. Yani tüm uygulama katmanları:
- Ethernet, Wifi vb. = Vatansız
- IP = vatansız
- TCP = durum bilgisi olan
- HTTP = durum bilgisi olmayan
- HTTP + çerezleri = durum bilgisi olan
Bugünlerde web sayfanızdan sunucuya tek bir açık soket tutabilecek web soketlerimiz var. Bu yüzden websockets ile bir kullanıcıyı tanımlamak için tekrar yuvaları kullanabilirsiniz çünkü websocket kendi başına durumsaldır. Ancak çoğu durumda, ana html sayfası için web soketini başlatan javascript'i yükleyen bir çereze ihtiyacınız olacaktır.