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 stateless e ogni connessione è associata solo a una risorsa da scaricare. Dopo aver scaricato una risorsa, viene chiuso il socket TCP su cui viaggia la richiesta HTTP. La ragione originale per questo 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.
Ovviamente, dire che HTTP chiuderà il socket per risorsa sta semplificando eccessivamente le cose perché HTTP ha caratteristiche come pipelining e connessioni persistenti che possono scaricare più risorse per socket. Ma questa è solo ottimizzazione. Dopo che tutto è stato scaricato, il tuo browser chiuderà il socket dopo un certo timeout.
HTTP è stato originariamente progettato come un semplice protocollo per scaricare file HTML. I vecchi browser possono anche scaricare file HTML da altri protocolli come Gopher e ftp. Come tale, non c'era motivo di rendere lo stato HTTP perché i file HTML sono solo semplici file di testo.
Una volta che i moduli Web sono stati introdotti e le pagine HTML possono inviare dati al server, le pagine Web hanno iniziato a richiedere sessioni. Così sono stati creati i cookie per reintrodurre lo stato di un protocollo stateless che viene trasmesso attraverso un layer di trasferimento stato che viene trasmesso su un livello di rete stateless. Quindi i livelli completi dell'applicazione sono:
- Ethernet, Wifi ecc. = senza stato
- IP = stateless
- TCP = stateful
- HTTP = stateless
- HTTP + cookie = stateful
In questi giorni abbiamo web socket 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 è di per sé 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.