2011-02-06 20 views
31

Sto studiando java per il web e si accenna a http è senza stato. cosa vuol dire e come ha effetto la programmazionecosa significa quando dicono che http è stateless

Stavo anche studiando il quadro di primavera e lì si parla di alcuni fagioli hanno dichiarato come fagioli interni come i loro cambiamenti di stato. Che cosa significa questo?

+4

darci qualche riferimento al libro/carta Stai studiando. Non capisco perché stai mescolando insieme lo stato di un protocollo di rete con uno stato di un oggetto in una singola domanda? Dove possiamo trovare quell'informazione sui fagioli Spring che hai menzionato? – Ritesh

risposta

56

HTTP - che è il protocollo di trasporto vero e proprio tra il server e il client - è "senza stato", perché non ricorda nulla tra le chiamate. OGNI risorsa a cui si accede tramite HTTP è una singola richiesta senza connessione filettata tra di loro.Se si carica una pagina Web con un file HTML che al suo interno contiene tre tag <img> che colpiscono lo stesso server, ci saranno quattro connessioni TCP negoziate e aperte, quattro trasferimenti di dati, quattro connessioni chiuse. Semplicemente non c'è stato conservato presso il server al protocollo livello che avrà il server sapere nulla di te come si arriva in.

(Beh, questo è vero per HTTP fino a 1,0 in ogni caso. HTTP 1.1 aggiunge meccanismi di connessione persistenti di vario tipo a causa degli inevitabili problemi di prestazioni che un protocollo veramente stateless genera. Per il momento ignoreremo questo perché non rendono veramente lo stato HTTP, lo rendono solo sporco-stateless invece che puro- apolidi.)

Per aiutarti a capire la differenza, immagina che un protocollo come Telnet o SSH fosse senza stato. Se si desidera ottenere un elenco di directory di un file remoto, è necessario, come operazione atomica, connettersi, accedere, passare alla directory ed eseguire il comando ls. Quando il comando ls ha terminato di visualizzare il contenuto della directory, la connessione si chiudeva. Se si desidera visualizzare il contenuto di un file specifico, è necessario connettersi nuovamente, accedere, passare alla directory e ora inviare il comando cat. Quando il comando di visualizzazione del file è terminato, la connessione si chiuderà nuovamente.

Quando lo guardi in quel modo, anche se l'obiettivo di Telnet/SSH, sembra abbastanza stupido, non è così? Beh, per certi versi lo è e per certi versi non lo è. Quando un protocollo è stateless, il server può fare delle ottimizzazioni piuttosto buone e i dati possono essere diffusi facilmente. I server che utilizzano protocolli stateless possono scalare in modo molto efficace, quindi mentre i singoli trasferimenti di dati effettivi possono essere molto lenti (l'apertura e la chiusura delle connessioni TCP NON è economica!) Un sistema generale può essere molto, molto efficiente e scalabile per qualsiasi numero di utenti.

Ma ...

Quasi tutto quello che vuoi fare altro che la visualizzazione di pagine web statiche coinvolgerà le sessioni e gli stati. Quando HTTP viene utilizzato per il suo scopo originale (condivisione di informazioni statiche come documenti scientifici) il protocollo stateless ha molto senso. Quando si inizia a utilizzarlo per cose come applicazioni web, negozi online, ecc., L'apolidia inizia a essere un problema perché si tratta di attività intrinsecamente stateful. Di conseguenza le persone molto rapidamente hanno escogitato dei modi per aumentare lo stato in base al protocollo stateless. Questi meccanismi hanno incluso cose come i cookie, come lo stato di codifica negli URL e il fatto che i server attivano dinamicamente i dati in base a quelli, come le richieste di stato nascoste, come ... beh, come un sacco di cose fino al più moderno cose come Web Sockets.

Qui ci sono alcuni link è possibile seguire per ottenere una più profonda comprensione dei concetti:

+0

, ma supponiamo che se http2.1 diventa statico, lo scenario corrente viene visualizzato rispetto alla pagina Web. Voglio dire, voglio vedere il diff ora e poi –

+0

1.1, non 2.1. ;) E come ho già detto, l'HTTP 1.1 non è davvero aggiornato. Ha solo alcuni trucchi ottimizzanti che ti permettono di riutilizzare le connessioni, ecc. Dal punto di vista del browser web significa che i tuoi siti web si caricano più velocemente perché devi solo negoziare la connessione TCP una volta per quei file HTML + 3 immagini (per usare il mio esempio) invece di 4 volte. –

+1

perché non possono renderlo stato. c'è qualche problema di programmazione o non può essere fatto –

4

HTTP viene chiamato un protocollo stateless poiché ogni comando viene eseguito indipendentemente, senza alcuna conoscenza dei comandi precedenti.

Questa mancanza di HTTP viene affrontata in una serie di nuove tecnologie, tra cui cookies.

+0

ActiveX, Java e Javascript non risolvono il fatto che http non è stateless, fanno leva sui cookie, riscrittura degli URL, ecc per mantenere lo stato – Luis

10

HTTP è senza stato - questo significa che quando si utilizza HTTP il punto finale non "ricorda" le cose (come chi sei). Non ha stato. Ciò è in contrasto con un'applicazione desktop - se si dispone di un modulo e si passa a un modulo diverso, quindi tornare indietro, lo stato è stato mantenuto (fino a quando non si è arrestato l'applicazione).

Normalmente, per mantenere lo stato nell'applicazione Web, si utilizzano i cookie.

+1

puoi dare un esempio di protocollo che ricorda lo stato in modo da poter confrontare –

+1

@Name - [TCP] (http://en.wikipedia.org/wiki/Transmission_Control_Protocol) è un protocollo che mantiene uno stato. – Oded

+1

sebbene non sia previsto per la rete utilizzare la famiglia di protocolli XYZModem (XModem, YModem, e così via) sono utili allo stato – alvaroc

3

Quando si dice che qualcosa è senza stato, di solito significa che non si può assumere che il server tenga traccia di uno stato tra le interazioni.

Per impostazione predefinita, il protocollo HTTP presuppone un server veramente stateless. Ogni richiesta viene considerata come una richiesta indipendente.

In pratica si tratta di fixed da parte di alcuni server (molti di essi) che utilizzano un cookie di tracciamento nella richiesta per abbinare alcuni stati sul server con un client specifico. Questo funziona perché il modo in cui i cookie funzionano (vengono postati sul server su ogni richiesta successiva, una volta che sono stati impostati sul client).

Fondamentalmente un server che non è stateless è un impedimento alla scalabilità. È necessario assicurarsi di indirizzare tutte le richieste da un browser specifico alla stessa istanza o di eseguire la replica di backend degli stati. Questo di solito è un fattore limitante quando si tenta di ridimensionare un'applicazione.

Ci sono alcune altre soluzioni per tenere traccia dello stato (vedi cookie di stato crittografato delle rotaie) ma fondamentalmente se vuoi crescere devi capire un modo per evitare lo stato di tracciamento sul server :).

5

Un protocollo stateless non richiede al server di conservare informazioni o stato su ciascun utente per la durata di più richieste. Ad esempio, quando è richiesto un server Web per personalizzare il contenuto di una pagina Web per un utente, l'applicazione Web potrebbe dover monitorare i progressi dell'utente da una pagina all'altra.

Una soluzione comune è l'uso dei cookie HTTP. Altri metodi includono sessioni lato server, variabili nascoste (quando la pagina corrente è un modulo) e riscrittura URL utilizzando parametri codificati URI, ad es. /index.php?session_id=some_unique_session_code.

here

Problemi correlati