IP e Enderecamento
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
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):
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.
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.
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
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
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.
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.
No harness.os
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
- IP é connectionless e best-effort — a "cola" da Internet
- IPv4: 32 bits (4.3B endereços), IPv6: 128 bits (inesgotáveis)
- CIDR (/prefixo) substituiu classes e permite alocação flexível de endereços
- DHCP atribui IP automaticamente via processo DORA (Discover, Offer, Request, Acknowledge)
- NAT permite compartilhar um IP público entre muitos hosts privados
- Fragmentação IP acontece quando pacote excede o MTU do link
- TTL evita loops; Protocol identifica TCP/UDP/ICMP
Homework
Exercício 1: Use o subnet_calculator() para planejar o endereçamento de uma rede corporativa.
- Rede 10.0.0.0/16 precisa de 4 sub-redes: engenharia (500 hosts), vendas (200 hosts), RH (50 hosts), servidores (20 hosts)
- Calcule o menor prefixo CIDR que comporta cada sub-rede
- Atribua as sub-redes evitando desperdício de endereços
- Verifique que nenhuma sub-rede se sobrepõe
Exercício 2: Projete um esquema de endereçamento para mesh nodes do harness.os.
- Cada harness instance precisa de um identificador único — UUIDs são 128 bits como IPv6. Coincidência útil?
- Defina "sub-redes" para cada tipo de harness (build, product, operations)
- 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?
Verifique seu entendimento
Qual é a função do campo TTL (Time to Live) no cabeçalho IPv4?
Verifique seu entendimento
No DHCP, qual é a sequência correta de mensagens trocadas entre cliente e servidor?