College Online
0%

IP e Enderecamento

Modulo 4 · Aula 1 ~25 min de leitura Nivel: Intermediario

Video da aula estara disponivel em breve

O protocolo IP

O IP (Internet Protocol) é o protocolo que une todas as redes da Internet. Todo pacote que viaja pela Internet carrega um cabeçalho IP com os endereços de origem e destino. IP é connectionless e best-effort — não garante entrega, ordem ou integridade (essas garantias vêm do TCP na camada acima). Existem duas versões em uso: IPv4 (32 bits, dominante) e IPv6 (128 bits, em transição).

IPv4: formato e enderecos

Diagrama
Cabecalho IPv4 (20 bytes minimo):

 0                   1                   2                   3
 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|Version|  IHL  |    DSCP   |ECN|          Total Length         |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|         Identification        |Flags|    Fragment Offset      |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|  Time to Live |    Protocol   |       Header Checksum         |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                       Source Address                          |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                    Destination Address                        |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

Campos importantes:
  Version:     4 (IPv4)
  TTL:         Decrementado a cada roteador. Se chega a 0, pacote e descartado.
               Evita loops infinitos.
  Protocol:    6 = TCP, 17 = UDP, 1 = ICMP
  Source/Dest: Endereços IP de 32 bits

Fragmentação IP:
  Se pacote > MTU do link (geralmente 1500 bytes):
    - Roteador fragmenta em múltiplos pacotes menores
    - Identification: mesmo valor em todos os fragmentos
    - Fragment Offset: posição do fragmento no pacote original
    - Flags: MF (More Fragments), DF (Don't Fragment)
    - Destino reassembla os fragmentos

  DF flag: se setado e pacote > MTU → pacote descartado + ICMP
  Path MTU Discovery: usa DF flag para descobrir menor MTU no caminho

DHCP: configuração automática de IP

DHCP (Dynamic Host Configuration Protocol) atribui endereços IP automaticamente. O processo segue quatro passos (DORA):

Diagrama
DHCP DORA (Discover, Offer, Request, Acknowledge):

Cliente (sem IP)              Servidor DHCP
    |                              |
    |--- DHCP Discover ---------->|  (broadcast: "preciso de um IP")
    |    src: 0.0.0.0              |
    |    dst: 255.255.255.255      |
    |                              |
    |<-- DHCP Offer --------------|  ("posso te dar 192.168.1.50")
    |    IP oferecido: 192.168.1.50|
    |    Máscara: 255.255.255.0    |
    |    Gateway: 192.168.1.1      |
    |    DNS: 8.8.8.8              |
    |    Lease time: 86400s (24h)  |
    |                              |
    |--- DHCP Request ---------->|  ("aceito o 192.168.1.50")
    |                              |
    |<-- DHCP Acknowledge --------|  ("confirmado, é seu por 24h")
    |                              |
    [Agora o cliente tem IP, máscara, gateway e DNS]

Lease renewal: cliente pede renovação em T/2 (12h)
Se servidor não responde: tenta em T (24h)
Se ainda falha: IP expira, cliente volta ao DORA

Endereços IPv4

Um endereco IPv4 tem 32 bits, representado em notacao decimal com pontos: 192.168.1.100. Cada octeto (8 bits) vai de 0 a 255.

Python
import ipaddress

# Trabalhando com enderecos IPv4
ip = ipaddress.ip_address("192.168.1.100")
print(f"Endereco: {ip}")
print(f"Binario:  {int(ip):032b}")
print(f"Inteiro:  {int(ip)}")
print(f"Privado:  {ip.is_private}")
print(f"Loopback: {ip.is_loopback}")

# Subnetting com CIDR
network = ipaddress.ip_network("192.168.1.0/24")
print(f"\nRede:      {network}")
print(f"Mascara:   {network.netmask}")        # 255.255.255.0
print(f"Hosts:     {network.num_addresses - 2}")  # 254 hosts
print(f"Broadcast: {network.broadcast_address}")  # 192.168.1.255

# Verificar se IP esta na rede
print(f"\n192.168.1.100 na rede? {ip in network}")  # True

Subnetting e CIDR

CIDR (Classless Inter-Domain Routing) substituiu o sistema antigo de classes (A, B, C) para permitir alocação flexível de endereços. A notação /prefixo indica quantos bits identificam a rede — os restantes identificam o host.

Diagrama
192.168.1.0/24:
  11000000.10101000.00000001 . 00000000
  |-------- rede (24 bits) ---|-- host (8 bits) --|
  Mascara: 255.255.255.0
  Hosts possiveis: 2^8 - 2 = 254

10.0.0.0/8:
  00001010 . 00000000.00000000.00000000
  |--rede--|-------- host (24 bits) --------|
  Mascara: 255.0.0.0
  Hosts possiveis: 2^24 - 2 = 16.777.214

172.16.0.0/16:
  10101100.00010000 . 00000000.00000000
  |---- rede (16 bits) ---|----- host (16 bits) -----|
  Hosts possiveis: 2^16 - 2 = 65.534

Enderecos privados vs. publicos

Referencia
Faixas de enderecos privados (RFC 1918):
  10.0.0.0/8        (10.0.0.0 - 10.255.255.255)      ~16M hosts
  172.16.0.0/12     (172.16.0.0 - 172.31.255.255)     ~1M hosts
  192.168.0.0/16    (192.168.0.0 - 192.168.255.255)   ~65K hosts

Enderecos especiais:
  127.0.0.0/8       Loopback (localhost)
  0.0.0.0/0         Default route (toda a Internet)
  169.254.0.0/16    Link-local (APIPA, quando DHCP falha)
  224.0.0.0/4       Multicast
Python
import ipaddress

def subnet_calculator(network_str):
    """Calcula todas as informações de uma subnet."""
    net = ipaddress.ip_network(network_str, strict=False)

    print(f"Rede:          {net.network_address}")
    print(f"Máscara:       {net.netmask}")
    print(f"Wildcard:      {net.hostmask}")
    print(f"Broadcast:     {net.broadcast_address}")
    print(f"Primeiro host: {net.network_address + 1}")
    print(f"Último host:   {net.broadcast_address - 1}")
    print(f"Hosts úteis:   {net.num_addresses - 2}")
    print(f"Prefixo:       /{net.prefixlen}")

    # Dividir em sub-redes
    print(f"\nDividindo em sub-redes /{net.prefixlen + 2}:")
    for subnet in net.subnets(prefixlen_diff=2):
        print(f"  {subnet} ({subnet.num_addresses - 2} hosts)")

subnet_calculator("192.168.1.0/24")
# Divide /24 em 4 sub-redes /26 (62 hosts cada)

NAT (Network Address Translation)

NAT permite que multiplos dispositivos de uma rede privada compartilhem um unico endereco IP publico. O roteador traduz enderecos privados para o endereco publico na saida, e faz a traducao reversa na entrada.

Diagrama
Rede privada (192.168.1.0/24)        Internet
┌──────────────────────┐          ┌─────────────────┐
│ PC1: 192.168.1.10    │          │                 │
│ PC2: 192.168.1.11    │──[NAT]──│  IP publico:    │──> google.com
│ PC3: 192.168.1.12    │ Router   │  200.1.2.3      │
└──────────────────────┘          └─────────────────┘

Tabela NAT no roteador:
  192.168.1.10:5000 <-> 200.1.2.3:40001
  192.168.1.11:5001 <-> 200.1.2.3:40002
  192.168.1.12:5002 <-> 200.1.2.3:40003

NAT resolve a escassez de enderecos IPv4 (4.3 bilhoes de enderecos
nao sao suficientes para todos os dispositivos do mundo).

IPv6

IPv6 usa enderecos de 128 bits (vs 32 do IPv4), fornecendo 2^128 enderecos (praticamente inesgotaveis). Formato: oito grupos de 4 digitos hexadecimais, ex: 2001:0db8:85a3:0000:0000:8a2e:0370:7334.

i
Transicao IPv4 -> IPv6 A transicao esta em andamento ha decadas. Mecanismos como dual-stack (ambos os protocolos), tunneling (IPv6 sobre IPv4), e NAT64 (traducao entre protocolos) permitem a coexistencia.

No harness.os

Diagrama
Enderecamento IP           Enderecamento harness.os
──────────────────         ──────────────────────────
IP Address (32/128 bits)   Project UUID (128 bits!)
                           Coincidencia: UUIDs sao 128 bits, como IPv6

Subnet (rede/host)         Harness type / project
  10.0.0.0/8               Build harness: build-ai, college-online, ...
  172.16.0.0/12             Product harness: cortex-ai, way2do, ...
  192.168.0.0/16            Personal harness: marco-ai

NAT                        Slug resolution
  IP privado -> IP publico  Slug (amigavel) -> UUID (interno)
  192.168.1.10 -> 200.1.2.3  "build-ai" -> "abc-123-def-456"

Routing table              Mesh routing
  dest: 10.0.0.0/8 -> eth0  concern: "governance" -> governance-agent
  dest: 0.0.0.0/0 -> gw     concern: "*" -> general-agent (default route)

Resumo

Homework

Exercício 1: Use o subnet_calculator() para planejar o endereçamento de uma rede corporativa.

  1. Rede 10.0.0.0/16 precisa de 4 sub-redes: engenharia (500 hosts), vendas (200 hosts), RH (50 hosts), servidores (20 hosts)
  2. Calcule o menor prefixo CIDR que comporta cada sub-rede
  3. Atribua as sub-redes evitando desperdício de endereços
  4. Verifique que nenhuma sub-rede se sobrepõe

Exercício 2: Projete um esquema de endereçamento para mesh nodes do harness.os.

  1. Cada harness instance precisa de um identificador único — UUIDs são 128 bits como IPv6. Coincidência útil?
  2. Defina "sub-redes" para cada tipo de harness (build, product, operations)
  3. Implemente em Python: assign_address(harness_type, instance_name)

Exercício 3: Execute ip addr e ip route no seu computador. Identifique: seu IP privado, a máscara, o gateway padrão, e a interface de rede. O IP é estático ou DHCP?

Exercício 4: Capture um handshake DHCP completo com tshark -f "port 67 or port 68". Identifique os 4 passos DORA e os parâmetros oferecidos (IP, máscara, gateway, DNS, lease time).

Verifique seu entendimento

Quantos hosts utilizaveis existem em uma rede /24?

  • 256
  • 254 (256 - 2 para rede e broadcast)
  • 255
  • 24

Verifique seu entendimento

Qual é a função do campo TTL (Time to Live) no cabeçalho IPv4?

  • Define o tempo máximo que o pacote pode ficar em cache
  • Limita o número de saltos (roteadores) que o pacote pode atravessar, evitando loops infinitos
  • Define a prioridade do pacote na fila do roteador
  • Indica o tempo de vida da conexão TCP

Verifique seu entendimento

No DHCP, qual é a sequência correta de mensagens trocadas entre cliente e servidor?

  • Request → Offer → Discover → Acknowledge
  • SYN → SYN-ACK → ACK → Data
  • Discover → Offer → Request → Acknowledge (DORA)
  • Query → Response → Confirm → Complete