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?


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.


1
O roteamento ocorre no nível tcp / ip.
— Fiasco Labs


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.


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.


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.


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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.