Study Notes

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/IPEquivalente OSIFunção
Aplicação5, 6 e 7Protocolos de alto nível usados pelas aplicações
Transporte4Controle de fluxo, segmentação, confiabilidade
Internet3Endereçamento lógico e roteamento (IP)
Acesso à Rede1 e 2Transmissã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). colision-and-broadcast-domain

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.

ClasseFaixa de IPMáscara padrãoNº de hosts
A1.0.0.0 – 126.0.0.0255.0.0.0 (/8)~16 milhões
B128.0.0.0 – 191.255.0.0255.255.0.0 (/16)~65 mil
C192.0.0.0 – 223.255.255.0255.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/16 ao 154.12.1.245/16, (eles nao vinham com a notacao /16, seria algo implícito). O restante dos outros IPs, 154.12.1.246/16 ao 154.12.255.255/16 nã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 ler 154.12.x.x e 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.

Referências

On this page