# Playground de Python

> CPython 3.14 de verdade no seu navegador, para a aritmética das redes: sub-redes, máscaras, EUI-64, cabeçalhos DNS em struct, HMAC, estatísticas de latência, tempos de transferência. Um motor de 13,5 MB é baixado uma vez, quando você autorizar; nada do que você digita sai da página.

- Tool: https://ronutz.com/pt-BR/tools/python-playground
- Family: Operações e fieldcraft

---

## O que faz

CPython 3.14 de verdade roda no seu navegador. O motor é o Pyodide 314.0.7, a compilação do CPython para WebAssembly feita pelo projeto Pyodide, servida desta mesma origem e fixada por versão e por resumo SHA-256. Você escreve um programa, opcionalmente dá a ele alguma entrada padrão, aperta Executar e lê stdout, stderr e o valor da última expressão, do jeito que um REPL mostraria. Nada do que você digita sai da página: o interpretador vive em um Web Worker no seu dispositivo, não tem rede nem processos, e a política da própria página os recusaria de qualquer forma.

É a primeira ferramenta deste site que executa código que não é do próprio site. Três coisas decorrem disso, e a página diz cada uma em voz alta em vez de escondê-las:

- **Um download acontece, uma vez, quando você autorizar.** O motor tem cerca de 13,5 MB em cinco arquivos. A página abre com o editor e um exemplo, mas sem o motor; um botão, que diz o tamanho, inicia o download com uma barra de progresso. O navegador guarda os arquivos em cache (eles são versionados e marcados como imutáveis), então uma segunda visita não custa nada.
- **Um motor de terceiros roda.** As verificações do próprio site cobrem o arcabouço em volta dele: a pré-verificação, os limites, os exemplos (executados de novo no motor real a cada construção) e os resumos dos arquivos fixados. O comportamento do interpretador é do projeto Pyodide.
- **A biblioteca padrão é o que está disponível.** A distribuição do Pyodide oferece 357 pacotes (numpy, pandas, requests e os demais); nenhum deles é carregado nesta versão. Quarenta módulos da biblioteca padrão estão ausentes da compilação WebAssembly (tkinter, curses, pwd, grp, readline, entre outros) e a pré-verificação os nomeia se você importar algum.

## A pré-verificação

Antes de qualquer coisa ser enviada ao motor, o texto do programa é lido (nunca executado) e você fica sabendo o que não vai funcionar aqui e por quê, nos termos do próprio motor:

- um import de módulo da biblioteca padrão que falta nesta compilação, com o erro que o motor lança;
- um import de pacote que a distribuição do Pyodide oferece, mas que esta versão não carrega, nomeado pelo nome do pacote (PIL é Pillow, yaml é pyyaml);
- um import de algo que ninguém consegue instalar aqui, ou um import relativo, que não tem pacote ao qual ser relativo;
- módulos de rede (socket, urllib, http, requests...) e de processos (subprocess, multiprocessing, os.system), que o Emscripten recusa;
- zoneinfo, que não encontra banco de fusos horários aqui e lança ZoneInfoNotFoundError;
- input() com a caixa de entrada vazia, que lança EOFError na primeira leitura;
- um time.sleep maior que o limite de relógio, um while True sem fim, módulos cuja saída muda entre execuções (random, time, uuid, datetime.now);
- arquivos, que vivem na memória do motor e somem com a execução; um programa que não imprime nada (o valor da última expressão aparece no lugar); tabulações e espaços misturados na indentação.

Os itens marcados como erro bloqueiam a execução; o resto são notas.

## Limites

- Programa: 20.000 caracteres. Entrada padrão: 20.000 caracteres.
- Relógio: 30 segundos por execução. No limite, o Worker é encerrado e um novo é iniciado a partir dos arquivos em cache.
- Saída: 200.000 caracteres por fluxo, depois cortada e marcada.
- Parar encerra o Worker de imediato (a única forma de interromper Python síncrono sem um buffer de interrupção com isolamento de origem cruzada, que este site estático não carrega) e inicia um novo.
- Cada execução começa em um namespace global novo com `__name__` igual a `"__main__"`, então execuções não vazam variáveis umas para as outras e o idioma do main-guard funciona.

## Entrada padrão

A caixa de entrada alimenta `input()` e `sys.stdin`, uma linha por leitura, depois fim de arquivo. Uma quebra de linha final não acrescenta linha vazia. `for line in sys.stdin:` lê tudo.

## Os exemplos

Treze programas escritos para quem este site atende: dividir um /24 em /26, agregar prefixos, máscaras e wildcards em binário, um EUI-64 modificado a partir de um MAC, um header DNS montado com struct, HMAC-SHA256 em hex e base64url, estatísticas de latência com p95, jitter e dois desvios-padrão, tempos de transferência em três taxas de linha, uma contagem de syslog por severidade a partir de texto de log colado, linhas lidas da caixa de entrada, campos extraídos de uma resposta de API, o algoritmo de caminho mais curto de Dijkstra em seis roteadores e a última expressão sozinha. A saída exata deles é registrada como vetores de ouro e medida de novo no motor real sob Node a cada construção; uma atualização do motor que mude qualquer um deles derruba a construção e é examinada de propósito.

O exemplo de latência imprime os dois desvios-padrão, cada um com seu rótulo. `statistics.pstdev` devolve "the population standard deviation", o desvio-padrão populacional, que é o que o ping mostra como mdev: a página de manual ping(8) diz "Population standard deviation (mdev)", e o iputils o calcula dividindo a soma dos quadrados dos desvios pelo número de respostas. `statistics.stdev` devolve "the sample standard deviation", o desvio-padrão amostral, que sai maior para as mesmas amostras (8,34 contra 7,99 ms no exemplo). Compare a linha pstdev com o resumo `rtt min/avg/max/mdev` do ping, não a linha stdev.

O exemplo de SPF roda o algoritmo shortest path first (SPF) de Dijkstra a partir do roteador R1 sobre os seis roteadores e os oito enlaces do [artigo sobre Dijkstra](https://ronutz.com/pt-BR/learn/dijkstra-and-the-twenty-minute-algorithm), com uma lista de candidatos em `heapq`, e imprime cada passo na ordem que a RFC 2328, seção 16.1, descreve: "the paths to the candidate vertex that is closest to the root are guaranteed to be shortest" (os caminhos até o candidato mais próximo da raiz são garantidamente os mais curtos), então esse roteador entra na árvore e os enlaces dele são examinados; um caminho mais curto substitui o custo e os próximos saltos de um candidato, um caminho de mesmo custo soma os próximos saltos dele aos já listados, e a execução termina quando a lista de candidatos fica vazia. No fim aparecem o custo, os próximos saltos e os pais de cada roteador, e a ordem em que os custos se tornaram definitivos (R1 R3 R2 R4 R5 R6), que é a ideia de Dijkstra em 1959 nas palavras dele: "the minimal paths from P to the other nodes are constructed in order of increasing length" (os caminhos mínimos de P até os outros nós são construídos em ordem crescente de comprimento). Candidatos de mesmo custo saem do heap em ordem de nome do roteador, regra que o programa declara em um comentário, então a saída é a mesma em toda execução. Mude um custo (o de R2 a R4, de 1 para 20, por exemplo) e rode de novo para ver os próximos saltos mudarem; o [artigo sobre OSPF](https://ronutz.com/pt-BR/learn/ospf-primer) trata do protocolo que faz esse cálculo.

## O que a API não faz

Esta ferramenta não é exposta na API HTTP. Executar Python arbitrário em infraestrutura compartilhada seria execução remota de código; o motor roda só no seu navegador. A pré-verificação é um apoio didático em volta do editor, não um contrato estável.

## Fontes

A documentação do Pyodide (páginas de web worker e de fluxos padrão, versão 314.0.7), o package.json, o pyodide-lock.json e as tipagens do próprio pacote no registro npm, a documentação do CPython 3.14 para os módulos que os exemplos usam, a RFC 1035 seção 4.1.1, a RFC 4291 Apêndice A e a RFC 5424 seção 6.2.1 para a aritmética dos exemplos, e a MDN para o Worker de módulo e a lista de fontes da Content Security Policy, lidos em 2026-10-04. A página statistics do Python 3.14 (pstdev e stdev), a página de manual ping(8) no man7.org e o código-fonte do iputils que imprime o resumo do ping (ping/ping_output.c) foram lidos em 2026-10-19, assim como a RFC 2328, seções 16.1 e 16.1.1 (rfc-editor.org), e a nota de Dijkstra de 1959, A Note on Two Problems in Connexion with Graphs, Numerische Mathematik 1, páginas 269 a 271 (a digitalização no repositório do CWI que o artigo sobre Dijkstra cita), para o exemplo de SPF. Tudo está listado na página da ferramenta.

## Standards and references

- [Pyodide documentation: Using Pyodide in a web worker](https://pyodide.org/en/stable/usage/webworker.html) - Pyodide requires a module-type worker because pyodide.asm.mjs is an ES module; classic workers using importScripts() are not supported.
- [Pyodide documentation: Redirecting standard streams](https://pyodide.org/en/stable/usage/streams.html) - The stdin callback returns one full line per call and null for end of file; batched stdout handlers receive lines without their newline or flushed partial lines.
- [pyodide 314.0.7 on the npm registry (package.json, pyodide-lock.json, pyodide.d.ts)](https://www.npmjs.com/package/pyodide/v/314.0.7) - Version, MPL-2.0 licence, the embedded Python 3.14.2, the 357-package lock, and the loadPyodide, runPythonAsync, setStdin, setStdout and setStderr signatures.
- [pyodide/pyodide on GitHub](https://github.com/pyodide/pyodide) - The engine's source repository.
- [Python 3.14 documentation: sys.stdlib_module_names](https://docs.python.org/3.14/library/sys.html#sys.stdlib_module_names) - The names classified as standard library are the engine's own sys.stdlib_module_names, read at generation time.
- [Python 3.14 documentation: ipaddress](https://docs.python.org/3.14/library/ipaddress.html) - ip_network, subnets, hosts, collapse_addresses, netmask and hostmask used by the examples.
- [Python 3.14 documentation: struct](https://docs.python.org/3.14/library/struct.html) - Big-endian packing of the DNS header example.
- [Python 3.14 documentation: hmac and hashlib](https://docs.python.org/3.14/library/hmac.html) - HMAC-SHA256 as the examples compute it.
- [Python 3.14 documentation: statistics](https://docs.python.org/3.14/library/statistics.html) - mean, median, pstdev (the population standard deviation) and stdev (the sample standard deviation) in the latency example.
- [ping(8), iputils manual page on man7.org: "Population standard deviation (mdev)"](https://man7.org/linux/man-pages/man8/ping.8.html) - What ping's mdev is: the population standard deviation of the round-trip times, which the latency example prints as pstdev.
- [iputils ping/ping_output.c, ping_print_statistics (master branch)](https://github.com/iputils/iputils/blob/master/ping/ping_output.c) - tmvar = (tsum2 - tsum * tsum / total) / total, then its integer square root printed as the mdev of rtt min/avg/max/mdev: a population (divide by the count) standard deviation.
- [Python 3.14 documentation: zoneinfo (data sources)](https://docs.python.org/3.14/library/zoneinfo.html#data-sources) - zoneinfo reads the system tz database or the tzdata package; the engine has neither unless the tzdata package is loaded, and raises ZoneInfoNotFoundError saying so (measured 2026-10-04).
- [RFC 1035, Domain names: implementation and specification, section 4.1.1 (header section format)](https://www.rfc-editor.org/rfc/rfc1035#section-4.1.1) - The 12-byte header the struct example builds.
- [RFC 4291, IP Version 6 Addressing Architecture, Appendix A (modified EUI-64 interface identifiers)](https://www.rfc-editor.org/rfc/rfc4291#appendix-A) - The universal/local bit flip and the FF FE insertion in the EUI-64 example.
- [RFC 5424, The Syslog Protocol, section 6.2.1 (PRI = facility times 8 plus severity)](https://www.rfc-editor.org/rfc/rfc5424#section-6.2.1) - The severity derived as PRI modulo 8 in the syslog example.
- [RFC 2328, OSPF Version 2, section 16.1 (calculating the shortest-path tree for an area) and 16.1.1 (the next hop calculation)](https://www.rfc-editor.org/rfc/rfc2328.txt) - The spf-dijkstra example follows section 16.1: the closest candidate joins the tree, its links are examined, an equal-cost path adds its next hops to those listed, a shorter one replaces them, and the run ends when the candidate list is empty; a destination behind another router inherits its parent's next hops (16.1.1).
- [E. W. Dijkstra, A Note on Two Problems in Connexion with Graphs, Numerische Mathematik 1, pages 269 to 271, 1959 (scan in the CWI repository)](https://ir.cwi.nl/pub/9256/9256D.pdf) - Problem 2, the path of minimum total length: the minimal paths from P to the other nodes are constructed in order of increasing length, which is the order the spf-dijkstra example prints.
- [MDN: Worker() constructor, the type option](https://developer.mozilla.org/en-US/docs/Web/API/Worker/Worker) - type: module makes the worker a module worker; the worker is created on the main thread and terminated with Worker.terminate().
- [MDN: Content-Security-Policy script-src, the wasm-unsafe-eval source](https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Headers/Content-Security-Policy/script-src) - The page policy already carries wasm-unsafe-eval for Pagefind; the engine was measured to load and run under that policy without unsafe-eval.

## Related reading

- [BFD: quando um enlace está no ar e morto ao mesmo tempo](https://ronutz.com/pt-BR/learn/bfd-when-a-link-is-up-and-dead.md): O Bidirectional Forwarding Detection (BFD) é um pequeno protocolo de hello entre dois planos de encaminhamento que percebe quando um caminho parou de levar pacotes, inclusive quando as duas interfaces continuam no ar, muito antes dos timers do próprio protocolo de roteamento. Depois da leitura, você consegue calcular um tempo de detecção a partir dos dois timers e do multiplicador, ler uma session no FRRouting campo a campo, escolher qual protocolo deve ser o cliente dela e dizer onde o próprio BFD pode ser enganado.
- [CGNAT: o que quebra quando mil assinantes dividem o mesmo endereço](https://ronutz.com/pt-BR/learn/cgnat-address-sharing-and-attribution.md): O carrier-grade NAT (CGN) é um NAT na rede da operadora que divide um endereço IPv4 público entre muitos assinantes, com o shared address space 100.64.0.0/10 numerando o link atrás dele. Depois da leitura, você consegue dizer o que a RFC 6888 exige de um CGN, nomear o que os testes publicados viram quebrar, explicar por que um endereço sozinho já não identifica um assinante, calcular o volume de logging e um port block determinístico, situar o NAT444 entre o DS-Lite e os desenhos A+P e verificar se a sua própria conexão está atrás de um.
- [Como funciona o endereçamento IPv6](https://ronutz.com/pt-BR/learn/ipv6-addressing.md): Um endereço IPv6 é um identificador de 128 bits de uma interface, escrito em hexadecimal com uma única grafia canônica, dividido em prefixo e identificador de interface e classificado pelos primeiros bits. Depois da leitura, você consegue escrever qualquer endereço na forma canônica, dizer o tipo e o escopo dele, dar a um endereço link-local a sua zona, recuperar o endereço de hardware contido num identificador derivado dele e dizer qual registro de DNS reverso liga um endereço a um host.
- [Como funciona uma ferramenta em WebAssembly: o que roda, de onde vem e o que sai da página](https://ronutz.com/pt-BR/learn/how-a-webassembly-tool-works.md): A maioria das ferramentas deste site são pequenas funções puras escritas aqui e testadas com vetores de ouro. Um playground de Python não pode ser isso: o que você quer é um interpretador de verdade, e a forma honesta de oferecer um em um site estático é o CPython compilado para WebAssembly, baixado pelo seu navegador e executado na sandbox dele. Este artigo explica o que muda quando uma ferramenta roda código de terceiros: o download e por que ele espera a sua autorização, o Worker e por que Parar é um encerramento, a Content Security Policy e o que foi medido contra ela, os arquivos fixados e seus resumos, o relógio de parede, e quais verificações são do site e quais são do motor. Com a documentação do próprio motor citada em cada afirmação.
- [Como funcionam os endereços IPv4](https://ronutz.com/pt-BR/learn/ipv4-addressing.md): Todo header IPv4 carrega dois endereços, origem e destino, cada um deles um número de 32 bits escrito como quatro octetos decimais, com um comprimento de prefixo que o divide em rede e host. Depois da leitura, você consegue converter um endereço para binário e para inteiro à mão, aplicar a máscara como um host faz para decidir se o destino está no próprio enlace, reconhecer os blocos de uso especial e suas regras, e dizer quem distribui os endereços e quando o estoque livre acabou.
- [Como hosts IPv6 obtêm endereços: SLAAC e DHCPv6](https://ronutz.com/pt-BR/learn/ipv6-address-configuration.md): Um host IPv6 se configura a partir do que os roteadores anunciam: um endereço link-local que ele testa contra duplicatas, endereços globais que monta por autoconfiguração sem estado a partir de cada prefixo marcado para isso e, onde a rede oferece, endereços, prefixos e servidores DNS concedidos pelo DHCPv6. Depois da leitura, você consegue ler as flags e os tempos de vida de um router advertisement, derivar identificadores de interface EUI-64, estáveis e temporários, distinguir o DHCPv6 com estado, sem estado e de delegação de prefixo, prever qual endereço de origem um host usa, reconhecer anúncios falsos, endereços duplicados e prefixos velhos, e acompanhar cada passo com ip, rdisc6, tcpdump e Wireshark.
- [Como rodar IPv6 e IPv4 juntos: dual-stack e tradução](https://ronutz.com/pt-BR/learn/ipv6-transition.md): IPv4 e IPv6 não trocam pacotes entre si, então as redes rodam os dois lado a lado, carregam IPv6 dentro de IPv4 ou traduzem um protocolo no outro. Depois da leitura, você consegue prever qual família um host dual-stack tenta primeiro, montar à mão endereços 6to4, Teredo, 6rd e NAT64, acompanhar passo a passo uma sessão NAT64 com DNS64, explicar por que o 464XLAT traduz em vez de tunelar e reconhecer as falhas que esses mecanismos causam com literais IPv4, respostas DNS assinadas e tamanho de pacote.
- [Como um ponto de acesso encontra sua controladora](https://ronutz.com/pt-BR/learn/dhcp-option-43-discovery.md): A option 43 do Dynamic Host Configuration Protocol (DHCP) carrega informação específica de fabricante, cujo significado é definido pelo fabricante indicado na option 60; por isso a mesma opção leva endereços binários para um ponto de acesso e texto para outro, enquanto um terceiro lê a controladora na option 138. Depois da leitura, você consegue montar e decodificar byte a byte o valor que cada fabricante documentado espera, fazer o servidor devolvê-lo à classe de fabricante certa, reconhecer a falha silenciosa e o risco do servidor intruso, e ler o valor de volta numa captura ou no servidor DHCP.
- [Descoberta de Vizinhos: como o IPv6 substitui o ARP](https://ronutz.com/pt-BR/learn/ipv6-neighbor-discovery.md): O Neighbor Discovery é o protocolo ICMPv6 que todo nó IPv6 executa no seu enlace: cinco mensagens que assumem o papel do ARP, da descoberta de roteadores e dos redirects do ICMP, e cuidam também da detecção de vizinho inalcançável e de endereço duplicado. Depois da leitura, você consegue decifrar as cinco mensagens, calcular à mão um grupo solicited-node e seu endereço Ethernet, acompanhar uma resolução pelo cache de vizinhos, reconhecer anúncios de roteador falsos e o esgotamento de cache com suas defesas e observar tudo com ip, ndisc6, tcpdump e Wireshark.
- [Dijkstra: o algoritmo de vinte minutos que os seus roteadores rodam todo dia](https://ronutz.com/pt-BR/learn/dijkstra-and-the-twenty-minute-algorithm.md): Em 1956, Edsger W. Dijkstra criou um algoritmo de caminho mais curto no terraço de um café em Amsterdã, sem lápis e sem papel, para demonstrar um computador novo; todo roteador que roda Open Shortest Path First (OSPF) ou Intermediate System to Intermediate System (IS-IS) calcula a árvore que esse algoritmo produz. Depois da leitura, você consegue contar a história com as palavras dele, executar o algoritmo à mão em seis roteadores, explicar por que o custo de um link precisa ser positivo e por que custos iguais dão vários next hops, e encontrar o resultado e o throttle de SPF num roteador.
- [Dimensionar timers do BFD: a aritmética da detecção](https://ronutz.com/pt-BR/learn/bfd-timers-the-arithmetic-of-detection.md): O Bidirectional Forwarding Detection (BFD) nunca envia o tempo de detecção: cada receptor o calcula a partir do multiplicador do outro lado e do intervalo que os dois acordam, separadamente em cada sentido. Depois da leitura, você consegue partir de uma meta de detecção e chegar a intervalos e a um multiplicador, prever os dois sentidos de uma sessão a partir dos seis números configurados e reconhecer o início lento, o jitter, o hardware e o Echo que esticam o resultado.
- [Espaço de endereços IPv4 privados e a RFC 1918](https://ronutz.com/pt-BR/learn/private-address-space.md): A RFC 1918, Best Current Practice 5 desde fevereiro de 1996, reserva 10.0.0.0/8, 172.16.0.0/12 e 192.168.0.0/16 para endereços que qualquer organização pode usar internamente: únicos só dentro dela e mantidos fora do roteamento e do DNS da internet. Depois da leitura, você consegue dar os limites e o tamanho exatos de cada bloco, aplicar as regras da RFC 1918 para roteadores de borda e DNS, explicar por que juntar duas redes privadas obriga a renumerar, distinguir uma consulta reversa respondida localmente de uma que vazou para o sumidouro AS112 e conferir cada ponto com ip, dig e Python.
- [Faixas de IP privadas, reservadas e públicas](https://ronutz.com/pt-BR/learn/private-vs-public-ip-ranges.md): A IANA registra todos os blocos IPv4 e IPv6 de propósito especial, de loopback, link-local e uso privado ao espaço compartilhado, à documentação e aos prefixos de tradução, e duas colunas desses registros, Destination e Globally Reachable, decidem se um endereço é um destino público. Depois da leitura, você consegue ler essas colunas, classificar um endereço só depois de transformar sua grafia no número ao qual o cliente se conecta, explicar como um destino público ainda leva para dentro por uma segunda consulta DNS ou por um redirecionamento, citar os endereços de metadados de nuvem e testar um filtro de SSRF.
- [ICMP, ping e traceroute: as mensagens de controle que explicam sua rede](https://ronutz.com/pt-BR/learn/icmp-ping-and-traceroute.md): O Internet Control Message Protocol (ICMP) é a parte do IP que relata a entrega em vez de carregar dados: Echo e Echo Reply são o ping, Time Exceeded é o traceroute, e Destination Unreachable diz o que falhou. Depois da leitura, você consegue ler uma linha do ping e seu resumo campo a campo, acompanhar um traceroute probe a probe do TTL 1 ao Port Unreachable final, distinguir um caminho filtrado de um caminho morto, dizer de quem é o endereço impresso em cada hop e decodificar os códigos de Unreachable em IPv4 e ICMPv6.
- [IS-IS: o protocolo de roteamento escondido sob a internet](https://ronutz.com/pt-BR/learn/isis-primer.md): O Intermediate System to Intermediate System (IS-IS) é o protocolo de roteamento link-state que a ISO escreveu para o OSI e que a RFC 1195 estendeu ao IP: inunda o estado dos enlaces como o OSPF, mas seus pacotes viajam direto na camada de enlace, fora do IP. Depois da leitura, você consegue montar um NET a partir de um endereço de loopback, distinguir o roteamento Level 1 do Level 2, prever qual roteador vira o DIS numa LAN, ler show isis neighbor e show isis database no FRRouting e dizer o que a autenticação protege e o que deixa aberto.
- [MPLS: rótulos, pilhas e o núcleo livre de BGP](https://ronutz.com/pt-BR/learn/mpls-primer.md): O Multiprotocol Label Switching (MPLS) classifica o pacote uma única vez, na borda da rede, e dali em diante os roteadores o encaminham por um label curto, com swap, pop ou push, sem ler de novo o header IP. Depois da leitura, você consegue decodificar em hexadecimal uma entrada da pilha de labels, nomear os labels de uso especial, seguir um label-switched path numa tabela de bindings real do Label Distribution Protocol (LDP), dizer exatamente o que um núcleo livre de BGP mantém e descarta, e explicar os dois labels de um pacote de rede privada virtual (VPN) de camada 3.
- [Multicast: o preço de não inundar](https://ronutz.com/pt-BR/learn/multicast-what-it-costs-to-not-flood.md): O multicast IP envia um datagrama a um endereço de grupo e deixa a rede fazer as cópias, e o preço é estado em cada switch e roteador que precisa saber onde estão os membros. Depois da leitura, você consegue mapear um endereço de grupo para o endereço MAC (media access control), calcular os timeouts do Internet Group Management Protocol (IGMP), explicar por que um switch inunda multicast e o que a falta de um querier provoca, ler o estado do Protocol Independent Multicast (PIM) no FRRouting e dizer o que o Source-Specific Multicast elimina.
- [NAT explicado: origem, destino, e por que a internet ainda funciona](https://ronutz.com/pt-BR/learn/nat-explained.md): O Network Address Translation mapeia endereços de um address realm para outro e mantém uma tabela para que as respostas encontrem o caminho de volta; o NAPT, a forma que um roteador doméstico executa, mapeia também a porta. Depois da leitura, você consegue ler uma tabela de tradução e uma listagem do conntrack campo a campo, acompanhar o ajuste do checksum, prever quanto tempo um mapping vive e quais pacotes ele deixa entrar, nomear o que o NAT quebra e dizer com precisão por que NAT não é firewall.
- [O cabeçalho DNS: opcode, status e flags](https://ronutz.com/pt-BR/learn/dns-message-header-and-flags.md): Toda mensagem DNS começa com o mesmo header de 12 bytes: um ID de 16 bits, uma palavra de flags que guarda o opcode, sete flags nomeadas, um bit reservado e o código de resposta, e quatro contadores de seção, que o dig imprime como as linhas de header e de flags. Depois da leitura, você consegue decodificar um header a partir dos bytes em hexadecimal, dizer o que cada flag, opcode e status conta para um diagnóstico, reconhecer uma resposta truncada e testar a repetição por TCP que ela exige, e explicar por que o ID e a porta de origem precisam ser imprevisíveis.
- [OSPF: o mapa, a matemática e a área 0](https://ronutz.com/pt-BR/learn/ospf-primer.md): O OSPF é o protocolo de gateway interior link-state padronizado como Internet Standard: cada roteador faz o flooding da descrição dos próprios enlaces, todos os roteadores de uma área guardam o mesmo banco de dados e cada um calcula a própria árvore de caminhos mais curtos a partir dele. Depois da leitura, você consegue calcular uma rota à mão a partir dos costs, dizer por que dois roteadores não viram neighbors, explicar a eleição do designated router e as regras das áreas, definir costs sem cair na armadilha da reference bandwidth e ler a saída de neighbors, banco de dados, rotas e interfaces do FRRouting.
- [Port blocks e port sets: a aritmética de dividir um endereço IPv4](https://ronutz.com/pt-BR/learn/port-blocks-and-port-sets.md): Quando um carrier-grade NAT ou um domínio MAP divide um endereço IPv4 público, o que ele reparte é o campo de porta de 16 bits, em blocos, por uma fórmula determinística ou por campos de bits. Depois da leitura, você consegue calcular quantos assinantes cabem em um endereço e em um pool, quanto o logging por bloco economiza, qual assinante estava com um endereço, uma porta e um horário pela RFC 7422 e quais portas pertencem a um PSID do MAP.
- [Python como calculadora do engenheiro de redes: a biblioteca padrão já sabe a sua aritmética](https://ronutz.com/pt-BR/learn/python-as-a-network-engineers-calculator.md): Divisões de sub-rede, agregação de rotas, máscaras wildcard, EUI-64, um cabeçalho DNS em bytes, um HMAC, um p95 de amostras de latência, um tempo de transferência na taxa da linha: cada um é poucas linhas de Python sem instalar nada, porque ipaddress, struct, hmac, statistics e re vêm com o interpretador. Este artigo percorre os doze exemplos com que o playground de Python abre, diz qual módulo faz o trabalho em cada um e por que é o certo, aponta as armadilhas (hosts() em um /31, arredondamento para o par, o bit universal/local), e mostra onde as mesmas respostas saem à mão nas outras ferramentas deste site, para que você confira uma contra a outra.
- [Redundância de first hop: VRRP, HSRP e o gateway que é uma ficção](https://ronutz.com/pt-BR/learn/first-hop-redundancy-vrrp-and-hsrp.md): Os protocolos de redundância de first hop, como o VRRP e o HSRP, fazem vários roteadores dividirem um único endereço de default gateway e um único MAC virtual, para que os hosts continuem encaminhando tráfego quando o roteador por trás desse endereço cai. Depois da leitura, você consegue dizer o que um host faz e o que não faz sozinho, calcular o tempo de failover do VRRPv3 a partir da prioridade e do intervalo, comparar os defaults do HSRP, reconhecer as falhas comuns e a superfície de ataque e encontrar os dois protocolos numa captura e na saída dos roteadores.
- [Resolvedores DNS públicos: o que você está de fato escolhendo](https://ronutz.com/pt-BR/learn/choosing-a-public-dns-resolver.md): Um resolver público é um resolver recursivo que qualquer pessoa pode usar, e trocar para um deles entrega ao operador todo nome que o seu dispositivo consulta. O que separa 1.1.1.1, 8.8.8.8, 9.9.9.9 e 208.67.222.222 é política, não velocidade: o que é registrado e por quanto tempo, quais endereços filtram e como um bloqueio responde, se há validação DNSSEC, se a sua sub-rede é repassada aos servidores autoritativos e quais transportes cifrados são oferecidos. Depois da leitura, você consegue ler as páginas de um operador contra a lista que a RFC 8932 pede que ele publique, escolher por esses critérios e testar cada um com dig e curl.
- [Sobreposições e lacunas de sub-redes](https://ronutz.com/pt-BR/learn/subnet-overlap-and-gaps.md): Dois prefixos IPv4 se sobrepõem quando algum endereço pertence aos dois, e com prefixos sem classe isso só pode significar que um está inteiro dentro do outro, de propósito ou por engano; lacunas são os endereços de um bloco pai que nenhum prefixo cobre. Depois da leitura, você consegue provar em binário que dois prefixos se aninham ou nunca se tocam, distinguir uma rota mais específica deliberada de um defeito, listar as lacunas de uma alocação como blocos alinhados que fecham a conta de cada endereço e explicar por que túneis e peering na nuvem recusam faixas sobrepostas e como a tradução contorna isso.
- [Sub-redes IPv6 e a fronteira /64](https://ronutz.com/pt-BR/learn/ipv6-subnetting.md): Dividir o espaço IPv6 em sub-redes é repartir os 64 bits de cima do endereço entre registro, provedor, site e enlace, porque em quase todo enlace os 64 bits de baixo pertencem ao identificador de interface. Depois da leitura, você consegue explicar por que um enlace é um /64 e o que a autoconfiguração sem estado tem a ver com isso, dimensionar o prefixo de um site e acompanhar a delegação dele, contar e numerar sub-redes em fronteiras de nibble, numerar enlaces entre roteadores e loopbacks com /127 e /128, montar um prefixo local único e evitar os erros que quebram um plano de endereçamento.
- [Sumarização de rotas](https://ronutz.com/pt-BR/learn/route-summarization.md): A sumarização de rotas anuncia um único prefixo através de uma fronteira de roteamento no lugar dos muitos que ele cobre, e assim os roteadores do outro lado guardam uma só entrada e não veem os componentes caírem e voltarem. Depois da leitura, você consegue calcular um resumo exato em binário, configurar e conferir faixas de área do OSPF, sumarização externa, sumarização do EIGRP por interface e rotas estáticas sumarizadas, explicar a rota de descarte que impede o loop e reconhecer como uma rota sumarizada esconde falhas e desvia caminhos.
- [Supernetting e agregação de rotas](https://ronutz.com/pt-BR/learn/supernetting-and-aggregation.md): O supernetting encurta um prefixo para que uma só rota cubra vários blocos IPv4 alinhados, e a agregação de rotas anuncia essa rota no lugar das mais longas. Depois da leitura, você consegue testar em binário se blocos se fundem, distinguir o agregado exato da super-rede de cobertura e dizer quando esta é legítima, ler como o BGP marca um agregado e por que o AS_SET foi descontinuado em maio de 2025, reconhecer como a agregação falha e conferir tudo na calculadora CIDR, no Python e nos comandos do FRRouting, do Junos e da Cisco.
- [Tabelas de roteamento e o default gateway: como um pacote escolhe o próximo hop](https://ronutz.com/pt-BR/learn/routing-tables-and-default-gateway.md): Uma tabela de rotas responde à única pergunta que todo host e todo roteador fazem a um pacote: para onde ele vai agora. O host decide entre local e remoto pela máscara e entrega o resto a um default gateway; o roteador poda a tabela até sobrar uma entrada, por basic match e longest match, com a rota default de prefixo zero como entrada de último recurso. Depois da leitura, você consegue executar a decisão de longest match à mão, ler uma tabela Linux ou Windows linha a linha, dizer como um host aprendeu seu default (à mão, por DHCP, por Router Discovery ou por um Router Advertisement IPv6) e reconhecer um default ausente, morto ou falso pelos sintomas.
- [Uma alocação com VLSM, resolvida do começo ao fim](https://ronutz.com/pt-BR/learn/vlsm-worked-example.md): Um bloco de documentação, 203.0.113.0/24, dividido em cinco subnets de tamanhos diferentes para um site pequeno, com cada endereço de rede, máscara, faixa de hosts e endereço de broadcast escrito e conferido, a sobra contabilizada, os mesmos dois links entre roteadores como prefixos /31, a falha que a ordem de chegada produz e a única rota que alcança o plano inteiro. Depois da leitura, você consegue repetir o procedimento num bloco seu, à mão, com a Calculadora CIDR / de sub-redes e com algumas linhas de Python.
- [VLSM: como dividir um bloco em sub-redes de tamanhos diferentes](https://ronutz.com/pt-BR/learn/vlsm.md): Máscaras de tamanho variável (VLSM) permitem que as subnets recortadas de um mesmo bloco pai tenham prefixos de comprimentos diferentes, cada uma dimensionada para os hosts que precisa abrigar, em vez de uma única máscara para a rede inteira. Depois da leitura, você consegue dimensionar cada subnet pela quantidade de hosts, alocar os blocos do maior para o menor sem que nenhum pule para a frente, dizer quais protocolos de roteamento conseguem carregar o plano e por que o longest match torna as máscaras mistas seguras, contabilizar o espaço livre em blocos alinhados e conferir a alocação no modo VLSM da calculadora CIDR.
