Network
Camadas de Redes
Modelo OSI
O modelo OSI é um modelo de referência conceitual que padroniza como sistemas de comunicação trocam dados. Possui 7 camadas, cada uma com responsabilidade bem definida.
7. Aplicação
É a camada mais próxima do usuário. Fornece a interface entre o software e a rede, permitindo que aplicações acessem serviços de comunicação. Protocolos: HTTP, FTP, DNS, SMTP, SSH
6. Apresentação
Responsável pela tradução dos dados entre formatos que a aplicação entende e formatos adequados para transmissão. Também cuida de criptografia e compressão. Protocolos: SSL/TLS, JPEG, ASCII, MPEG
5. Sessão
Gerencia o estabelecimento, manutenção e encerramento de sessões entre aplicações. Controla o diálogo entre sistemas, inclusive recuperação em caso de falha. Protocolos: NetBIOS, RPC, PPTP
4. Transporte
Garante a entrega fim-a-fim dos dados. É responsável por segmentação, controle de fluxo, controle de erro e confiabilidade da transmissão. Protocolos: TCP (confiável, orientado a conexão), UDP (rápido, sem garantia)
3. Rede
Determina o melhor caminho para os dados chegarem ao destino, realizando o roteamento entre redes distintas. Trabalha com endereçamento lógico. Protocolos: IP, ICMP, OSPF, BGP
2. Enlace de Dados
Garante a transferência confiável de dados entre dois nós diretamente conectados. Detecta e corrige erros da camada física. Trabalha com endereçamento físico (MAC). Protocolos: Ethernet, Wi-Fi (802.11), ARP
1. Física
Transmite os bits brutos pelo meio físico. Define características elétricas, mecânicas e funcionais do meio de transmissão. Exemplos: Cabos coaxiais, fibra óptica, sinais de rádio, conectores RJ45
Modelo TCP/IP (4 camadas)
O modelo prático usado na internet real, que "colapsa" algumas camadas do OSI.
| Camada TCP/IP | Equivalente OSI | Função |
|---|---|---|
| Aplicação | 5, 6 e 7 | Protocolos de alto nível usados pelas aplicações |
| Transporte | 4 | Controle de fluxo, segmentação, confiabilidade |
| Internet | 3 | Endereçamento lógico e roteamento (IP) |
| Acesso à Rede | 1 e 2 | Transmissão física e controle de enlace |
PDUs
Protocol Data Unit é a forma como cada layer é encapsulado. Cada camada adiciona um cabeçalho (header) ao dado antes de passar para a camada abaixo. Na recepção, cada camada remove o seu cabeçalho (desencapsulamento). PDUs por camada:
- Aplicação → mensagem
- Transporte → segmento (TCP) / datagrama (UDP)
- Rede → pacote
- Enlace → quadro (frame)
- Física → bit
Domínio de Colisão
Sobre a l1 e l2, é a área da rede onde dois dispositivos podem tentar enviar dados ao mesmo tempo pelo mesmo meio, causando uma interferência (colisão).

Domínio de Broadcast
Broadcast é a transmissão simultânea para multiplos receptores. O domínio então seria quais dispositivos estariam conectados para processar um sinal enviado por broadcast. Quem limita esse domínio é um router ou alterar a máscara (usando #CIDR).
Máscara
Existe tanto para IPv4 quanto para IPv6. A máscara ela define qual rede o IP está. Ou seja, enquanto que o IP identifica exatamente o dispositivo, a máscara do IP revela quem é considerado vizinho direto (está na mesma rede ou não). Exemplo: 192.168.1.10/24 e
192.168.1.10/26 pertencem a um mesmo dispositvo, porém, a forma como se interpreta a rede é diferente.
CIDR
Classless Inter-Domain Routing é uma forma moderna (surgiu em1993) de representar faixas de IP e fazer roteamento. É o substituto do modelo #Classful Addressing. Dessa forma, os IP são munidos junto com a notação /n, indicando tamanho a se considerar da máscara e, portanto, qual rede. Passar a usar mácaras de tamanho variável e não mais classes (com máscaras implícitas fixas), reduziu o desperdiço de IPs. Agora é possível ajustar a máscara conforme a nescessidade.
VLSM
Classful Addressing
Surgiu em 1981, os IPs eram divididos em classes, baseadas no primeiro número do endereço.
| Classe | Faixa de IP | Máscara padrão | Nº de hosts |
|---|---|---|---|
| A | 1.0.0.0 – 126.0.0.0 | 255.0.0.0 (/8) | ~16 milhões |
| B | 128.0.0.0 – 191.255.0.0 | 255.255.0.0 (/16) | ~65 mil |
| C | 192.0.0.0 – 223.255.255.0 | 255.255.255.0 (/24) | 254 |
| Cada classe tinha uma máscara fixa, que era implícita (não precisava ser informada). Isso pois apenas ao olhar o IP e em qual faixa ele pertencia já sabia a classe. Dessa forma, não era possível alterar a máscara e, portanto, não escolhia o tamanho da rede. |
Desperdício de IPs
Imagine uma empresa que precisava de 500 IPs. No modelo Classful Addressing:
- Classe C (254) → pequeno demais
- Classe B (65 mil) → absurdo de grande
Se a empresa escolhesse um IP de classe B. Ex:
154.12.0.1/16ao154.12.1.245/16, (eles nao vinham com a notacao/16, seria algo implícito). O restante dos outros IPs,154.12.1.246/16ao154.12.255.255/16não poderiam ser alocados. Se alguem tentasse alocar um desses IPs e nao estivesse fisicamente perto/ conectado em um router comum, a pessoa nao conseguiria se conectar a internet/ uma rede maior. Todo pacote que fosse para ela seria roteado para a empresa na verdade (os roteadores iriam ler154.12.x.xe ir enviando ponto a ponto para onde está a empresa). (Ou seja, fora o erro de roteamento errado, os vários hosts que pertecem a mesma rede produziriam Broadcast Storm/ erro devido ao #Domínio de Broadcast ser muito grande).
Network Socket
É uma abstração do SO usada pela camada de aplicação para acessar a rede. é basicamente a interface que o SO fornece para a aplicação usar TCP/UDP/IP.
O SO fornece operações de sockets principais para os programas:
bind(): vincular uma porta a um IP. isso faz com que o SO saiba para qual processo entregar os dados.listen(): é exclusivo para TCP. prepara o socket, definindo o tamanho da fila de conexões (para começar a receber SYNs e handshakes).accept(): é exclusivo para TCP.recv():send(): receive um dado
Quando falamos de blocking/non-blocking estamos no rerindo ao comportamento de I/O, seja no contexto de CPU, Filesystem e em sockets de rede.
Blocking
Se chamar recv() e não houver dados, a thread atual fica bloqueada até que os dados cheguem.
É mais fácil de programar e entender (programação síncrona/sequencial). Porém, tem baixa eficiência para muitos clientes. Requer uma thread por conexão, o que consome muita memória e CPU para troca de contexto sobrecarregada.
Non-blocking
Se recv() for chamado e não houver dados, a função retorna um erro específico (como EWOULDBLOCK ou EAGAIN no Linux/Unix) imediatamente. Isso permitindo a multiplexação de conexões.
Sync/Async vs Blocking/Non-blocking
Sync/async é sobre como você espera no seu programa. "chega depois". Bllocking/non-blocking é sobre se a thread fica realmente bloqueada na syscall;
Os dois eixos são independentes — só são fortemente correlacionados porque os runtimes mais populares casam um modelo async com I/O non-blocking por baixo.
Event Loop é uma arquitetura que coordena Async + Non-Blocking.
Analogia
- Sync + blocking: você pede e fica parado no balcão até sair.
- Sync + non-blocking: você pede, pergunta "pronto?", recebe "não" e fica perguntando em loop.
- Async + non-blocking: você pede, recebe uma senha (Future/Promise), vai sentar e mexer no celular; te chamam quando fica pronto.
- Async + blocking: você "tem uma senha", mas ainda assim fica plantado no balcão sem fazer nada — desperdiça o mecanismo assíncrono.
Conclusão
sync + blocking é o thread-per-request tradicional. MUITO usado. Async + non-blocking é o moderno modelo event-loop com multiplexação de IO. muito usado. Sync + non-blocking é um pooling. meio estranho mas é usado em alguns cenários. Async + blocking é possívelmente erro. Não traz benefício de fato. é estranho voce fazer um "chega depois"/prometer ceder a thread durante esperas — mas chama algo que segura a thread mesmo assim.