La Batcueva - the cold, dark abyss of human soul
 
~future
~present
~past
 - June 2002
 - July 2002
 - August 2002
 - September 2002
 - October 2002
 - November 2002
 - December 2002
 - January 2003
 - February 2003
 - March 2003
 - April 2003
 - May 2003
 - July 2003
 - August 2003
 - October 2003
 - November 2003
 - December 2003
 - January 2004
 - February 2004
 - March 2004
 - April 2004
 - May 2004
 - July 2004
 - August 2004
 - October 2004
 - February 2005
 - August 2005
 - September 2005
 - October 2005
 - November 2005
 - December 2005
 - January 2006
 - February 2006
 - March 2006
 - April 2006
 - May 2006
 - June 2006
 - May 2007
 - June 2007
 - April 2008
 - January 2009
 - March 2009
 - July 2009
 - May 2010
 - May 2011
 - September 2011
 - May 2013
Thursday, April 20, 2006
arrows
Speedy: o estupro internético: agora com fantoches

Depois de fazer mais testes, descobri outra coisa que acontece (e acontece com mais frequencia, aparentemente, do que o que eu descrevi no texto anterior) com minha conexão: Existe um problema com a implementação do protocolo TCP/IP no dito proxy da Telefonica. Vou explicar com fantoches (pra ver se o pessoal da TeleAfonica entende):


proxy - conexão ok


Quem conhece provavelmente já reconheceu, mas essa é uma imagem do programa de monitoramento Ethereal, que eu usei pra fazer a captura dos pacotes e diagnosticar o problema. Essa imagem (chamemos de fig.1) mostra uma conexão completa e sem problemas. Meu IP foi escondido pelas tarjas pretas, por motivos óbvios. Vamos ao passo-a-passo:


toda comunicação que use o protocolo TCP começa da mesma forma:

1 - o cliente (no caso, o meu computador) pede ao servidor a abertura de uma conexao (ou sincronia), que acontece com o envio de um pacote com o flag SYN ligado (destacado em azul).

2 - O servidor, ao receber meu pedido (chamemos de "pacote SYN"), me envia uma mensagem dizendo que recebeu meu pedido e que está disposto a abrir a conexão. Isso acontece com o envio (pelo servidor) de um pacote com as flags SYN e ACK (do inglês "acknowledge", "entendido", e destacado em amarelo). Chamemos esse passo de "pacote SYN/ACK".

3 - O cliente (meu computador) responde ao servidor com uma mensagem dizendo que recebi sua resposta (com apenas a flag ACK ligada). Chamemos esse passo de "pacote ACK".

A isso se dá o nome de "three-way handshake", ou "aperto de mão em 3 etapas".

Imediatamente depois disso o cliente, no caso do protocolo HTTP, faz o pedido do conteúdo que deseja receber (a linha destacada em azul escuro), o servidor envia a resposta e a conexão é encerrada (pela troca de pacotes com a flag FIN ligada).


Pela definição do protocolo TCP, ao passar certa quantidade de tempo sem o recebimento da resposta esperada (timeout) para um devido pacote, esse pacote é re-enviado, assumindo que o pacote foi perdido. E é exatamente isso que causa o problema nos servidores da Telefonica, como demonstrado a seguir:


proxy - erro


Essa imagem (fig.2) mostra uma conexão problemática, causada pelo erro na implementação TCP do cace da Telefonica. Vamos recapitular:


1 - o cliente (meu computador) pede ao servidor a abertura de uma conexão, com o envio do "pacote SYN".

2 - cerca de 3 segundos após o envio do primeiro pacote, e sem receber resposta, o cliente re-envia o "pacote SYN", com as mesmas características do anterior. Ele assumiu que o pacote foi perdido.

3 - o cliente recebe do servidor o "pacote SYN/ACK", sinalizando a abertura da conexão do lado do servidor.

4 - o cliente envia ao servidor o "pacote ACK", finalizando o "three-way handshake" e abrindo a conexão.

5 - o cliente faz o pedido do conteúdo desejado, utilizando o protocolo HTTP.

6 - aqui está o problema - o cliente recebe um segundo "pacote SYN/ACK", mas este é inválido - já existe uma conexão com essas configurações. Algo está errado.

7 - o cliente respode ao servidor com um "pacote RST" (de reset), pedindo que a conexão de onde se originou o pacote número 6 seja terminada.

O problema é que essa conexão é exatamente a conexão de onde o cliente espera receber o conteúdo pedido pelo protocolo HTTP (tem os mesmos endereços e portas), e a conexão é encerrada abruptamente (connection reset by peer), causando o erro que impossibilita que as páginas de web sejam visualizadas. A única maneira de conseguir acessar as páginas sem encontrar o erro é "fugir" do proxy HTTP da Telefonica (já que este simplesmente captura todo o tráfego para portas de HTTP), configurando no navegador um servidor proxy externo. E isso é ilustrado na próxima (e última) imagem:



Essa imagem (fig.3) mostra uma conexão com o mesmo reenvio do "pacote SYN" da anterior, mas com a resposta adequada do Servidor (um servidor proxy Squid externo, configurado no navegador):


1 - o cliente (meu computador) pede ao servidor a abertura de uma conexão, com o envio do "pacote SYN".

2 - cerca de 3 segundos depois, sem ter recebido resposta, o cliente re-envia o "pacote SYN", com as mesmas características do anterior. Ele assumiu a perda do pacote anterior.

3 - o cliente recebe do servidor a confirmação da abertura da conexão, o "pacote SYN/ACK".


A partir daí, acontece o mesmo que aconteceu no primeiro exemplo: o cliente pede o conteúdo (pelo protocolo HTTP), o recebe e a conexão é finalizada.


Reparem que, nesse exemplo, o segundo "pacote SYN" foi simplesmente ignorado pelo servidor - ele sabe que já existe uma abertura de conexão em andamento para o endereço e porta do cliente, e assume que o segundo pacote recebido é uma retransmissão. E é exatamente esse o comportamento esperado.


Eu, o usuário, fui obrigado (pela telefônica) não só a diagnosticar o problema como a documentá-lo. E a esperar (sem esperança, por mais paradoxal que pareça) uma solução por parte da empresa. Os servidores em questão são provavelmente antigos, e é possível que uma simples atualização do software resolva esse e muitos outros problemas da rede. Até lá nós, usuários PAGANTES dos serviços da Telefonica, somos prejudicados e tratados como imbecis. Mas eu vou deixar minhas reclamações dos últimos atendimentos da Telefonica pra outra hora. Prefiro conseguir dormir essa noite.