Quando um navegador envia carga HTTP separadamente da solicitação HTTP?

2

Em que circunstâncias você esperaria que um navegador da Web dividisse uma solicitação HTTP em dois pacotes IP, mesmo se a soma dos tamanhos dos pacotes ainda fosse menor que o tamanho máximo do segmento? Eu diria que isso sempre seria enviado como um único pacote, mas minha experiência está mostrando o contrário.

Usando o Microsoft Network Monitor para analisar o tráfego HTTP, ocasionalmente vejo uma solicitação dividida em dois pacotes IP, conforme mostrado abaixo

HTTP:Request, POST /foobar.htm (PacketID=55178, TotalLength=528)
  POST /foobar.htm HTTP/1.1
  Content-Type: application/x-www-form-urlencoded
  ...etc...

HTTP:HTTP Payload, URL: /foo.htm (PacketID=55179, TotalLength=98)
  param1=foo&param2=bar&param3=foo+bar

Eu só vi isso acontecendo em clientes Windows XP até agora, mas isso não acontece em todos os clientes XP. E nos sistemas afetados, tanto o IE8 quanto o Firefox exibem o mesmo comportamento de pacote duplo.

Algum contexto: Recentemente, começamos a usar um pacote de software de terceiros que fornece um aplicativo da Web em nossa intranet. Mas, em vez de usar um servidor web real como o IIS ou o Apache, o software implementa internamente seu próprio servidor HTTP.

Como o servidor usa uma implementação ingênua de HTTP, ele apenas inspeciona o primeiro pacote de uma solicitação HTTP e não recebe os argumentos enviados no segundo pacote. Isso faz com que a solicitação falhe.

    
por Nic 06.12.2011 / 00:24

2 respostas

3

É aleatório e imprevisível, e se você se importa, está fazendo algo terrivelmente errado.

Because the server uses a naive implementation of HTTP, it only inspects the first packet of an HTTP request, and misses the arguments sent in the second packet. This causes the request to fail.

Eu não consigo descobrir o que você está tentando dizer lá. Se estiver realmente olhando para os pacotes, é uma implementação do TCP, não HTTP (já que os pacotes são pacotes de acordo com a especificação TCP). Uma implementação HTTP sensata nunca estaria olhando para os pacotes.

Se você realmente quer dizer que o servidor HTTP examina os pacotes, então ele precisa reconstruir o fluxo de dados TCP e seguir o protocolo HTTP. O final de uma solicitação HTTP é marcado com dois < CRLF > s no fluxo de bytes TCP. Qualquer outro método de detecção do final de uma solicitação HTTP está quebrado.

Como o primeiro pacote não contém uma sequência de fim de solicitação HTTP, ele claramente não pode conter toda a solicitação.

Um servidor HTTP deve seguir a especificação HTTP ou não é um servidor HTTP. A especificação HTTP apenas especifica quais bytes vão no fluxo de dados TCP. Não diz nada sobre segmentação, o que é bom porque, na prática, as aplicações não teriam como controlar isso. Ele especifica como o final de uma solicitação é identificado e o código que não obedece a essa especificação é não um servidor HTTP. Ele implementa um protocolo semelhante a HTTP que pode ou não ser compatível com HTTP.

    
por 06.12.2011 / 01:33
1

Como os POSTs em questão estão sendo feitos - aqueles que são derramados são feitos via XMLHTTPRequest, ou seja, AJAX?

Os POSTs AJAX enviam os cabeçalhos e o corpo como pelo menos dois pacotes TCP separados.

Há uma postagem no blog sobre isso na rede de desenvolvedores do Yahoo de alguns anos atrás.

    
por 25.12.2011 / 18:17