In che modo HTTP diventa apolide?


26

Si dice che HTTP sia apolide. Significato, non è necessario archiviare informazioni per la trasmissione di dati.

Ma HTTP utilizza TCP, che è orientato allo stato.

In tal caso, in che modo HTTP diventa apolide?


6
In che modo questo non è un duplicato 5 anni dopo il lancio di Super User?
Peter Mortensen,

Perché la maggior parte dei duplicati sono su StackOverflow? Sto solo indovinando.
trysis,

8
Solo perché passa attraverso i cavi (tra gli altri), non lo rende nemmeno un protocollo elettrico
Hagen von Eitzen,

Risposte:


42

All'HTTP non interessa - ed è indipendente da - nessuno dei protocolli di livello inferiore usati per trasportare se stesso, anche se è esso stesso apolide.

La tecnologia di trasporto può essere TCP, o il vecchio SPX di Novell, o SCTP, o qualsiasi altra cosa tu possa immaginare, e HTTP continuerà a funzionare allo stesso modo. HTTP richiede un protocollo orientato allo streaming o orientato alla connessione e dipende dalla risoluzione degli URL, ma non importa come ciò venga realizzato.

Questo è uno dei motivi per cui esiste il modello a più livelli o lo stack di rete: il livello dell'applicazione non deve occuparsi di livelli inferiori.

Solo perché un protocollo di livello inferiore è stateful non significa che nulla in più diventi automaticamente stateful o sia necessario per essere stateful.

HTTP stesso è senza stato. Ciò significa che le applicazioni devono implementare un altro livello sopra HTTP per stabilire lo stato. Questo in genere viene fatto con i cookie di sessione.


1
Il routing avviene a livello di tcp / ip.
Fiasco Labs

3
Questa immagine lo spiega bene. vichargrave.com/wp-content/uploads/2013/01/…
JakeGould

2
Per coincidenza, il fatto che HTTP ignori la condizione di connessione sottostante (che quasi sempre sarà TCP) è una delle principali carenze prestazionali che vari approcci HTTP2 stanno cercando di risolvere.
skolima,

2
@Fiasco: a rigor di termini, il routing avviene a livello IP. Il routing si basa su indirizzi Internet, nessuna informazione dal livello TCP viene utilizzata nel routing di base.
RedGrittyBrick,

1
@skolima: d'altra parte, l'apolidia è il motivo per cui HTTP è il protocollo più scalabile e affidabile di largo uso. HTTP è sempre stato progettato in modo esplicito per la scalabilità piuttosto che per le prestazioni (sì, sono cose diverse), quindi se ritieni di aver bisogno di una latenza bassa e dura rispetto a quando stai usando il protocollo sbagliato o stai usando il protocollo in modo errato. Mentre HTTP2 intende migliorare le prestazioni, lo fa in un modo che rimane fedele all'apolidia. Quando usato per quello a cui è destinato, non avevo mai visto l'apolidia essere un collo di bottiglia di un'applicazione HTTP ben progettata.
Lie Ryan,

10

"HTTP è senza stato" significa che ogni transazione HTTP (coppia richiesta-risposta) può essere elaborata indipendentemente da qualsiasi stato dalla precedente coppia richiesta-risposta.

Per trasportare la particolare coppia richiesta-risposta è necessario un protocollo in grado di trasportare lì blocchi arbitrariamente grandi e blocchi di dimensioni arbitrariamente grandi, e per farlo su un layer con dimensioni dei pacchetti limitate, TCP deve essere stateful.

Ma oltre il limite delle transazioni, non esiste uno stato. Il client può eliminare la connessione e stabilirne una nuova per la richiesta successiva. In effetti questa era l'unica opzione nelle prime versioni e funziona ancora così se il client non include l' Connection: keep-aliveintestazione.

La richiesta successiva può anche essere facilmente gestita da server diversi e il client non lo saprà mai, poiché il server non ha bisogno di mantenere alcuno stato (a meno che l'applicazione non aggiunga il proprio stato sopra HTTP, di solito in forma di sessione; le conseguenti complicazioni nel bilanciamento del carico è la sua punizione per la costruzione di protocollo con stato su HTTP). Ciò viene sfruttato nei server occupati con bilanciamento del carico.


can also easily be handled by different server and the client will never knowAnche se tecnicamente vero, questo è fuorviante poiché molte applicazioni Web utilizzano sessioni permanenti, che richiedono un bilanciamento del carico per instradare richieste future dalla stessa sessione di navigazione allo stesso server. Dal punto di vista HTTP, le sessioni sono irrilevanti, ma la tua ultima frase implica che l'esperienza dell'utente finale non sarà influenzata, il che sarebbe falso con le sessioni permanenti.
Brandon,

1
@Brandon: tali applicazioni costruiscono un protocollo con stato su HTTP e questa è la loro punizione!
Jan Hudec,

@Brandon: molti server con bilanciamento del carico, come gmail, non inviano richieste allo stesso server. Invece la sessione viene archiviata in un database condiviso a cui possono accedere tutti i server del cluster. Lo stato pertanto non è gestito dal server ma dal database.
slebetman,

@slebetman: Sì, qualunque cosa. HTTP stesso non ha tale stato, quindi per HTTP è semplice. Se l'applicazione aggiunge un suo stato, è la sua lotta.
Jan Hudec,

Bene, non ho detto tutto. Ho detto alcuni. Personalmente preferisco evitare sessioni appiccicose e, se possibile, evitare del tutto le sessioni. Tuttavia, esiste un software che non è all'altezza dell'ideale di tutti.
Brandon,

2

La natura "senza stato" di HTTP significa che su questo livello non vengono create o utilizzate informazioni sullo stato.

Puoi vederlo in alcuni casi, ad esempio nell'autenticazione HTTP, le credenziali vengono inviate con ogni richiesta e le connessioni persistenti sono in realtà solo un'ottimizzazione (cioè se invio le credenziali, il server le dimentica dopo la richiesta, anche se lascia la connessione è aperta).

Al contrario, i meccanismi di accesso basati su cookie sono stateful, ma non fanno parte di HTTP.


1

Devi capirlo come un set di bambole russe (o scatole se vuoi) ognuna delle quali ne trasporta un'altra all'interno, ecco come funziona: TCP porta HTTP "dentro", ma non gliene importa o le sue caratteristiche.

Per ottenere il quadro completo, ti consiglio di leggere il Modello OSI in quanto lo rende più chiaro.

TCP si trova alcuni livelli al di sotto di HTTP nel modello OSI, ogni livello corrisponde infatti a un protocollo diverso.

Nel nostro caso HTTP si trova nei livelli di presentazione e applicazione e TCP nel livello di trasporto. Oppure se si utilizza il modello TCP / IP, entrambi i protocolli TCP e IP si trovano nel livello Network Link e HTTP nei livelli applicazione e presentazione.


1
Il problema con il modello OSI è che ora è teorico (ci sono stati tentativi reali di implementarlo, ma hanno fallito nel mercato a causa della loro complessità). In realtà, non ci sono livelli tra TCP e HTTP. Inoltre, il livello di presentazione sarebbe HTML, non HTTP.
Salterio,

Nel modello TCP / IP, TCP non vive nel livello di rete. Vive nel livello di trasporto in cima all'IP, che si trova successivamente nella rete. Il primo hit google per "Modello TCP" lo dimostra: technet.microsoft.com/en-us/library/cc786900(v=ws.10).aspx
Brandon

@MSalters: TLS non è un layer?
Grawity

1
@MSalters: ti rendi conto che HTTPS è semplicemente il nome dato da HTTP che viene tunnelato da TLS? Come tale TLS è un livello in HTTP e sopra TCP e TLS / SSL + HTTP combo è chiamato HTTPS.
slebetman,

1
Inoltre, esiste un altro nuovo nome per la combinazione TLS / HTTP. Se il TLS che trasporta il traffico HTTP implementa il multiplexing socket / stream virtuale si chiama SPDY (ma l'URL nel tuo browser è ancora HTTPS).
slebetman,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.