IP e Enderecamento
Video da aula estara disponivel em breve
O protocolo IP
O IP (Internet Protocol) e o protocolo que une todas as redes da Internet. Todo pacote que viaja pela Internet carrega um cabecalho IP com os enderecos de origem e destino. IP e connectionless e best-effort — nao garante entrega, ordem ou integridade (essas garantias vêm do TCP na camada acima).
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: Enderecos IP de 32 bits
Enderecos 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) usa a notacao /prefixo para indicar quantos bits identificam a rede. Os bits 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
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 e connectionless e best-effort — a "cola" da Internet
- IPv4: 32 bits (4.3B enderecos), IPv6: 128 bits (inesgotaveis)
- CIDR (/prefixo) define a separacao rede/host
- NAT permite compartilhar um IP publico entre muitos hosts privados
- TTL evita loops; Protocol identifica TCP/UDP/ICMP
Exercicio pratico
Projete um esquema de enderecamento para mesh nodes do harness.os.
- Cada harness instance precisa de um identificador unico — UUIDs sao 128 bits como IPv6. Coincidencia util?
- Defina "sub-redes" para cada tipo de harness (build, product, operations)
- Como funciona o NAT nesse contexto? (slug publico -> UUID interno)
- Implemente em Python:
assign_address(harness_type, instance_name)
Verifique seu entendimento
Quantos hosts utilizaveis existem em uma rede /24?