I socket TCP sono progettati per essere stateful, quindi in generale vengono utilizzati per identificare le sessioni. Protocolli come SSH e ftp fanno esattamente questo.
HTTP è progettato per essere senza stato e ogni connessione è associata solo a una risorsa da scaricare. Dopo aver scaricato una risorsa, il socket TCP su cui si basa la richiesta HTTP viene chiuso. La ragione originale di ciò era la semplicità. Ma l'effetto collaterale è che i server HTTP che eseguono siti Web moderni possono gestire molti più utenti rispetto ai server basati su socket come SSH o ftp.
Quindi i socket non possono essere utilizzati perché HTTP chiuderà il socket dopo aver scaricato la pagina Web.
Naturalmente, dire che HTTP chiuderà il socket per risorsa sta semplificando eccessivamente le cose perché HTTP ha funzionalità come pipelining e connessioni persistenti che possono scaricare più risorse per socket. Ma questa è solo ottimizzazione. Dopo aver scaricato tutto, il browser chiuderà il socket dopo un certo timeout.
HTTP è stato originariamente progettato come un semplice protocollo per il download di file HTML. I vecchi browser possono anche scaricare file HTML da altri protocolli come Gopher e ftp. Pertanto, non vi era alcun motivo per rendere stateful HTTP perché i file HTML sono solo semplici file di testo.
Una volta introdotti i moduli Web e le pagine HTML possono inviare i dati ai server, le pagine Web hanno iniziato a richiedere sessioni. Pertanto, i cookie sono stati creati per reintrodurre lo stato in un protocollo stateless che viene trasmesso tramite un layer di trasferimento stateful che viene trasmesso su un layer di rete stateless. Quindi i livelli di applicazione completi sono:
- Ethernet, Wifi ecc. = Apolidi
- IP = apolide
- TCP = stateful
- HTTP = stateless
- HTTP + cookies = stateful
In questi giorni abbiamo websocket che possono mantenere un singolo socket aperto dalla tua pagina web al server. Quindi con i websocket è possibile utilizzare nuovamente i socket per identificare un utente perché il websocket da solo è con stato. Ma nella maggior parte dei casi avrai ancora bisogno di un cookie per la pagina html principale che carica il javascript che avvia il websocket.