Como o HTTP se torna sem estado?

26

Diz-se que o HTTP é sem estado. Ou seja, ele não precisa armazenar informações para a transmissão de dados.

Mas o HTTP usa TCP, que é orientado ao estado.

Se for esse o caso, como o HTTP se torna sem estado?

Formigas
fonte
6
Como isso não é duplicado 5 anos após o lançamento do Superusuário?
Peter Mortensen
Como a maioria dos enganadores está no StackOverflow? Estou apenas adivinhando.
trysis
8
Só porque ele é executado através de cabos (entre outros), não torná-lo um protocolo elétrica quer
Hagen von Eitzen

Respostas:

42

O HTTP não se importa com - e é independente de - qualquer um dos protocolos de nível inferior usados ​​para se transportar, mesmo que ele próprio não tenha estado.

A tecnologia de transporte pode ser TCP, ou o antigo SPX da Novell, ou SCTP, ou qualquer outra coisa que você possa imaginar, e o HTTP continuará funcionando da mesma maneira. O HTTP requer um protocolo orientado a streaming ou conexão - e depende da resolução de URLs - mas não se importa com o que isso é feito.

Essa é uma das razões pelas quais o modelo em camadas ou a pilha de rede existe: A camada do aplicativo não precisa se preocupar com as camadas inferiores.

Só porque um protocolo de nível inferior é stateful não significa que nada em cima dele se torne stateful automaticamente ou seja necessário que ele seja stateful.

O próprio HTTP é sem estado. Isso significa que os aplicativos precisam implementar outra camada em cima do HTTP para estabelecer o estado. Isso geralmente é feito com cookies de sessão.

LawrenceC
fonte
1
O roteamento ocorre no nível tcp / ip.
Fiasco Labs
3
Esta imagem explica bem. vichargrave.com/wp-content/uploads/2013/01/...
JakeGould
2
Por coincidência, o fato de o HTTP ignorar a integridade do estado da conexão subjacente (que quase sempre será TCP) é uma das principais falhas de desempenho que várias abordagens do HTTP2 estão tentando resolver.
Skolima # 13/14
2
@ Fiasco: Estritamente falando, o roteamento ocorre no nível do IP. O roteamento é baseado em endereços da Internet, nenhuma informação da camada TCP é usada no roteamento básico.
RedGrittyBrick
1
@skolima: por outro lado, apatridia é a razão pela qual o HTTP é o protocolo mais escalável e confiável em uso amplo. O HTTP sempre foi projetado explicitamente para escalabilidade em vez de desempenho (sim, são diferentes), portanto, se você acha que precisa de baixa latência, então está usando o protocolo errado ou incorretamente. Embora o HTTP2 pretenda melhorar o desempenho, ele o faz de uma maneira que permanece fiel à apatridia. Quando usado para o que se destina, nunca tinha visto apatridia como um gargalo de um aplicativo HTTP bem projetado.
Lie Ryan
10

"HTTP é sem estado" significa que cada transação HTTP (par de solicitação-resposta) pode ser processada independentemente de qualquer estado do par de solicitação-resposta anterior.

Para transportar o par de solicitação-resposta específico, você precisa de um protocolo capaz de transportar blocos arbitrariamente grandes para lá e de volta arbitrariamente grandes, e para fazer isso em uma camada com tamanho de pacote limitado, o TCP deve ser stateful.

Mas além do limite da transação, não há estado. O cliente pode descartar a conexão e estabelecer uma nova para a próxima solicitação. De fato, essa era a única opção nas versões anteriores e ainda funcionaria assim se o cliente não incluir o Connection: keep-alivecabeçalho.

A próxima solicitação também pode ser facilmente tratada por um servidor diferente e o cliente nunca saberá, porque o servidor não precisa manter nenhum estado (a menos que o aplicativo adicione seu próprio estado no HTTP, geralmente na forma de sessão; as conseqüentes complicações no balanceamento de carga é sua punição por criar um protocolo stateful no HTTP). Isso é aproveitado no servidor ocupado com balanceamento de carga.

Jan Hudec
fonte
can also easily be handled by different server and the client will never knowEmbora tecnicamente verdadeiro, isso é enganador, pois muitos aplicativos da Web usam sessões persistentes, exigindo um balanceador de carga para rotear solicitações futuras da mesma sessão de navegação para o mesmo servidor. Do ponto de vista do HTTP, as sessões são irrelevantes, mas sua última frase implica que a experiência do usuário final não será afetada, o que seria falso em sessões complicadas.
Brandon
1
@Brandon: Tais aplicativos constroem um protocolo stateful sobre HTTP e este é o seu castigo por isso!
Jan Hudec
@Brandon: Muitos servidores com balanceamento de carga, como o gmail, não enviam solicitações de volta ao mesmo servidor. Em vez disso, a sessão é armazenada em um banco de dados compartilhado que todos os servidores do cluster podem acessar. O estado, portanto, não é tratado pelo servidor, mas pelo banco de dados.
Slebetman
@slebetman: Sim, tanto faz. O próprio HTTP não possui esse estado, portanto, para o HTTP, é simples. Se o aplicativo adicionar algum estado próprio, é a luta.
Jan Hudec 14/10
Certo, eu não disse tudo. Eu disse algumas. Pessoalmente, prefiro evitar sessões complicadas e, se possível, evitar sessões por completo. No entanto, existe um software que não atende ao ideal de todos.
Brandon
2

A natureza "sem estado" do HTTP significa que nessa camada, nenhuma informação de estado é criada ou usada.

Você pode ver isso em algumas instâncias, por exemplo, na autenticação HTTP, as credenciais são enviadas a cada solicitação e as conexões persistentes são realmente apenas uma otimização (ou seja, se eu enviar credenciais, o servidor as esquece após a solicitação, mesmo que saia a conexão aberta).

Por outro lado, os mecanismos de login baseados em cookies são stateful, mas não fazem parte do HTTP.

Simon Richter
fonte
1

Você precisa entendê-lo como um conjunto de bonecas russas (ou caixas, se quiser), cada uma delas carregando outra, é assim que funciona: o TCP carrega o HTTP "dentro", mas não se importa com isso ou com seus recursos.

Para obter uma imagem completa, recomendo ler sobre o modelo OSI, pois ele fica mais claro.

O TCP fica algumas camadas abaixo do HTTP no modelo OSI, cada camada de fato corresponde a um protocolo diferente.

No nosso caso, o HTTP fica nas camadas de apresentação e aplicação e o TCP na camada de transporte. Ou, se você usar o modelo TCP / IP, os protocolos TCP e IP ficam na camada Link de rede e HTTP nas camadas de aplicativo e apresentação.

runlevel0
fonte
1
O problema com o modelo OSI é que agora é teórico (houve tentativas reais de implementá-lo, mas eles falharam no mercado devido à sua complexidade). Na realidade, não há camadas entre TCP e HTTP. Além disso, a camada de apresentação seria HTML, não HTTP.
MSalters
No modelo TCP / IP, o TCP não reside na camada de rede. Ele vive na camada de transporte sobre o IP, que fica na rede posteriormente. O primeiro hit do Google para "modelo TCP" demonstra isso: technet.microsoft.com/en-us/library/cc786900(v=ws.10).aspx
Brandon
@MSalters: TLS não é uma camada?
grawity
1
@ MSalters: Você percebe que HTTPS é apenas o nome dado pelo HTTP que está sendo encapsulado pelo TLS? Como tal, o TLS é uma camada sob HTTP e, em cima do TCP e TLS / SSL + HTTP, a combinação é chamada HTTPS.
Slebetman 14/10
1
Além disso, há outro novo nome para a combinação TLS / HTTP. Se o TLS que transporta o tráfego HTTP implementa a multiplexação de soquete / fluxo virtual, ele se chama SPDY (mas a URL no seu navegador ainda é HTTPS).
Sleevetman