O melhor esforço da Internet

Quando falamos da Internet existem alguns princípios que regem a forma como ela trabalha e que são fundamentais para seu sucesso e suas limitações. Nós já aprendemos que a Internet é formada por borda e núcleo e que, pelo argumento fim-a-fim, a complexidade foi empurrada para a borda da rede. Contudo, existem ainda outros princípios naquilo que chamamos de núcleo e neste artigo veremos um deles.

Os roteadores do núcleo se interconectam e trocam pacotes o tempo todo. Caso nunca tenha ouvido falar, estes pacotes são pedaços de dados originados nas aplicações e que se movem um salto por vez. Um “salto” neste caso significa a transmissão de um roteador para o próximo. E quando dizemos “por vez” significa que um roteador precisa receber um pacote completamente, antes de retransmiti-lo para o próximo roteador.

Desta forma, os pacotes que chegam são armazenados no roteador formando uma fila de saída conforme chegam ao roteador e haja outros pacotes aguardando saída. Note que esta fila é, de modo geral, do tipo FIFO. É possível usar outras filas e isso se chama engenharia de tráfego, mas deixemos este assunto para outro momento.

Contudo, estas filas podem crescer caso haja um elevado número de pacotes chegando ao roteador. Neste caso, os pacotes sofrerão atraso quanto maior for esta demanda, mas só até um certo ponto. Sim, este atraso não cresce indefinidamente, porque uma hora a fila enche e os pacotes passam a ser descartados! Entenda que “ficar na fila” nada mais é do que armazenar dados na memória do roteador (um roteador é só um computador de propósito específico) e esta tem limite. Quando não é possível armazenar mais pacotes, o roteador não tem outra opção a não ser descartá-los.

Você pode estar chocado com isso, mas segure-se na cadeira: você sabia que isso não é um efeito indesejado, mas foi realmente pensado para ser assim? Pois é, isso se chama princípio do melhor esforço (best effort), o que significa que a rede vai tentar levar seus dados adiante para entregá-los ao destinatário, embora não haja garantia de que isso vá acontecer. 

De certa forma, o princípio do melhor esforço é consequência do argumento fim-a-fim. Lembre-se que o objetivo é deixar o núcleo simples para que os roteadores possam fazer bem o repasse de pacotes, evitando que “percam tempo” com questões como reenvio de pacotes ou controle da taxa dos transmissores. Assim, estas funcionalidades são de responsabilidade da borda. No caso, o protocolo TCP, um protocolo muito importante na Internet.

Para ficar claro como o princípio do melhor esforço simplifica o núcleo da rede, vamos imaginar que cada roteador tivesse que controlar a taxa de envio em casa salto. Funcionaria assim, suponha que um roteador A esteja enviando dados para um roteador B e que este roteador B fique sobrecarregado. O roteador A teria então que regular sua taxa de envio, armazenando os pacotes por mais tempo e tendo que usar algoritmos para determinar a taxa correta de envio de pacotes. 

Note que isso teria um impacto direto sobre o custo e complexidade de implementação de cada roteador. Nós já comentamos anteriormente que o custo da rede deve ser muito menor que seu custo e nós já vimos como adicionar roteadores ajuda a diminuir o custo da rede. Embora tenhamos comentado apenas sobre os enlaces, é certo que se os roteadores fossem complexos, isso encareceria o custo da rede e diminuiria a viabilidade e escalabilidade das redes.

O fato dos roteadores serem projetados seguindo o princípio do melhor esforço é, portanto, fundamental para o alcance que a Internet tem hoje. Contudo, é também fundamental para algumas de suas limitações.

Você tem costume de jogar alguns tipos de jogos em que um pequeno atraso (gamers costumam chamar isso também de lag ou ping) são decisivos em sua experiência? Nestes jogos, como jogos de tiro em primeira pessoa, a interação entre os participantes é rápida e um atraso maior pode fazer com que um jogador perca tempo de reação o que leva ao fim do jogo para ele. 

Se você é um jogador destes então já deve ter passado pela situação de ver seu atraso alto e tentar mudar de computador, de modem e até de provedor de internet, mas ainda assim seu atraso (ou perda em outros casos) não diminuir. E o que você acha se a rede pudesse lhe oferecer um serviço que limitasse o atraso do jogo a um tempo máximo (dezenas de milissegundos, por exemplo)? Acho que seria bom e várias pessoas certamente pagariam por esse serviço, para obter melhor desempenho no jogo e em outras aplicações.

E por que será que não temos isso na Internet? Por causa do princípio do melhor esforço! 

Para manter o atraso baixo é preciso que cada roteador participe do serviço, dando prioridade aos pacotes daquele cliente em detrimento aos pacotes dos demais usuários. Veja que tecnicamente isso não é impossível, e na prática isso é implementado para redução de atraso de alguns fluxos de dados em redes de campus, empresas e provedores de Internet. Contudo, implementar isso em toda a Internet aumentaria o custo do roteamento de modo geral: todos os roteadores dos diferentes provedores pelos quais o pacote passa até chegar ao seu destino teriam que participar deste serviço. Não é trivial mantermos isso. 

Além disso, em cenários de escassez de recursos, as técnicas de priorização prejudicam os fluxos não-prioritários. Imagine isso atrelado a um serviço pago.  Em pouco tempo, teríamos serviços cada vez mais caros, para oferecer maior prioridade. Seria uma combinação perfeita para tornar a Internet útil apenas para poucos, o que diminuiria o valor da rede!

Bom, agora quando seu jogo preferido estiver com atraso alto, você vai se lembrar que o culpado é o melhor esforço da Internet. Mas quando seu atraso estiver baixo, lembre-se que é o melhor esforço trabalhando por você também!

Comentários