ASCII Caio
Ep. 0: Antes da Viagem

Ep. 0: Antes da Viagem

Existe um universo que você atravessa dezenas de vezes por dia sem nunca ter visto. Ele começa no instante em que seu dedo deixa o Enter e termina quando as primeiras letras aparecem na tela. No meio, há mais do que você imagina.

Uma requisição HTTP dura, em condições normais, algumas centenas de milissegundos. É tempo demais para ser considerado instantâneo e tempo de menos para ser percebido. Nesse intervalo, acontecem coisas que engenheiros passaram décadas projetando, documentando e refinando. Protocolos que nasceram em laboratórios universitários nos anos 70 e ainda hoje carregam a maior parte do tráfego da internet. Estruturas de dados tão bem desenhadas que o kernel Linux as usa praticamente inalteradas há trinta anos. Algoritmos de criptografia cuja segurança depende de problemas matemáticos que nenhum computador conhecido consegue resolver em tempo útil.

Nada disso é visível de fora. Você vê o cursor, a página, a resposta. O que acontece entre o gesto e o resultado permanece, para a maioria, tão opaco quanto o interior de uma estrela.

Quem escreve e por que

Sou desenvolvedor há mais de seis anos. Nesse tempo, aprendi que existe uma diferença entre saber usar uma ferramenta e entender o que ela faz. A maioria dos cursos, tutoriais e documentações ensina o primeiro. Este projeto nasceu da obsessão com o segundo.

Desde cedo no ofício, percebi que descer um nível abaixo do que era necessário para a tarefa me tornava um programador melhor no nível de cima. Entender como o TCP gerencia a janela de congestionamento me fez escrever código de aplicações web mais robusta. Entender o Event Loop do Node.js me fez parar de escrever código que travava servidores em produção sem saber por quê. O conhecimento de baixo nível não é trivia acadêmica: ele aparece, cedo ou tarde, nos problemas reais.

O caminho até aqui foi feito de leitura. W. Richard Stevens e seus volumes sobre TCP/IP e programação Unix, que documentam com uma clareza rara o que acontece desde o accept() até o recv(). Rami Rosen e o interior da stack de rede do kernel Linux, onde um pacote vira uma sk_buff e percorre sete subsistemas antes de chegar ao processo que o espera. Robert Love e as entranhas do kernel: interrupções, chamadas de sistema, gerenciamento de memória. Ivan Ristić e a criptografia moderna, que transforma o handshake TLS num objeto de estudo quase elegante. Mario Casciaro e Luciano Mammino com os padrões internos do Node.js, onde o Event Loop deixa de ser uma metáfora e vira código. Andrew Tanenbaum com o mapa conceitual que conecta todas as camadas. Esses livros não são leitura leve, e não foi leitura rápida. Foram anos acumulando peças de um quebra-cabeça que só faz sentido completo quando as peças todas estão na mesa.

O problema é que nenhum desses livros conta a história inteira de uma vez. Cada um domina a sua camada, mas a jornada de um pacote atravessa todas elas. A lacuna entre um livro e o próximo é onde o entendimento costuma desaparecer.

Este projeto é uma tentativa de preencher essa lacuna: contar a história completa, de ponta a ponta, sem pular as partes difíceis.

A forma veio de uma fonte inesperada. Quando criança, assisti aos vídeos de Carl Sagan sobre o cosmos. O que me prendeu não foi somente a astronomia em si, a qual eu tanto gostava, foi o método: Sagan pegava algo imenso e incompreensível e te colocava dentro dele. Não como observador externo lendo uma descrição, mas como viajante dentro do fenômeno. Eu entendia a escala do universo não porque alguém me disse que era grande, mas porque Sagan me mostrou o que significa estar numa galáxia olhando para outra.

A computação, descobri, tem a mesma qualidade. Uma requisição HTTP é pequena demais para ser vista, rápida demais para ser percebida, e complexa o suficiente para esconder um universo inteiro de decisões de engenharia. O método de Sagan se aplica aqui da mesma forma: você só entende o que consegue imaginar.

O nome vem de dois flags do protocolo TCP. SYN é o primeiro bit enviado quando uma conexão começa, um sinal que diz “quero me conectar”. FIN é o último bit enviado quando ela termina, um sinal que diz “terminei”. Entre o SYN e o FIN, toda a conversa acontece: a negociação criptográfica, a requisição em texto, os bytes percorrendo o kernel, o Event Loop do Node.js acordando para processar o que chegou, a resposta descendo o mesmo caminho de volta.


O episódio 1 começa antes de qualquer pacote sair da máquina. Começa com uma pergunta que o sistema operacional precisa responder antes de tudo: onde fica “exemplo.com”?

A resposta é menos óbvia do que parece.

Todos os artigos