Estructura Profunda de los Paquetes de Red
Estructura Profunda de los Paquetes de Red
Te voy a explicar capa por capa cómo se construye un paquete, desde los datos de aplicación hasta los bits en el cable.
📦 Visión General de Capas
┌─────────────────────────────────────────────────────────────┐
│ DATOS DE APLICACIÓN │ ← Lo que ves en la API
├─────────────────────────────────────────────────────────────┤
│ ENCABEZADO TCP/UDP (Segmento/Datagrama) │
├─────────────────────────────────────────────────────────────┤
│ ENCABEZADO IP (Paquete/Datagrama) │
├─────────────────────────────────────────────────────────────┤
│ ENCABEZADO ETHERNET (Trama/MAC) │
└─────────────────────────────────────────────────────────────┘🎯 Capa por Capa en Detalle
CAPA 7 - APLICACIÓN (HTTP, HTTPS, API)
┌─────────────────────────────────────────────────────────────┐
│ HTTP Request │
│ │
│ POST /api/users HTTP/1.1 │ ← Start Line
│ Host: api.ejemplo.com │
│ Content-Type: application/json │
│ Authorization: Bearer token123 │ ← Headers
│ Content-Length: 45 │
│ │
│ { │
│ "name": "Juan", │ ← Body (Payload)
│ "email": "juan@email.com" │
│ } │
└─────────────────────────────────────────────────────────────┘CAPA 4 - TRANSPORTE (TCP Segment)
Estructura del segmento TCP (20-60 bytes de header):
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
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Puerto Origen | Puerto Destino | ← Ports
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Número de Secuencia | ← SEQ
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Número de Acuse (ACK) | ← ACK
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Data | |C|E|U|A|P|R|S|F| |
| Offset|Reserv.|W|C|R|C|S|S|Y|I| Ventana | ← Flags + Window
| | |R|E|G|K|H|T|N|N| |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Checksum | Puntero Urgente |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Opciones (Variable) |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| DATOS | ← HTTP Request
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+Campos importantes de TCP:
Puertos: Identifican aplicación (80 HTTP, 443 HTTPS)
SEQ/ACK: Control de flujo y orden
Flags: SYN, ACK, FIN, RST (control de conexión)
Window: Control de congestión
CAPA 3 - RED (IP Packet)
Estructura del paquete IP (20-60 bytes de header):
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
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|Versión| IHL |Tipo Servicio| Longitud Total |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Identificación |Flags| Desplazamiento |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| TTL | Protocolo | Checksum Cabecera |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Dirección IP Origen |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Dirección IP Destino |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Opciones (si IHL > 5) |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| DATOS | ← TCP Segment
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+Campos importantes de IP:
Versión: 4 (IPv4) o 6 (IPv6)
TTL: Time To Live (evita loops infinitos)
Protocolo: 6=TCP, 17=UDP, 1=ICMP
IP Origen/Destino: Direcciones lógicas
CAPA 2 - ENLACE DE DATOS (Ethernet Frame)
Estructura trama Ethernet (14-22 bytes de header):
┌─────────────────┬─────────────────┬─────────┬─────────────────┐
│ Destino MAC │ Origen MAC │ Tipo │ Datos │ ← Ethernet Frame
│ (6 bytes) │ (6 bytes) │(2 bytes)│ (46-1500 bytes) │
└─────────────────┴─────────────────┴─────────┴─────────────────┘
↓ ↓ ↓ ↓
┌──────────────┬──────────────┬────────────┬─────────────────────┐
│ FF:FF:FF:FF: │ 00:1A:2B:3C: │ 0x0800 │ Paquete IP │
│ FF:FF │ 4D:5E:6F │ (IPv4) │ completo │
└──────────────┴──────────────┴────────────┴─────────────────────┘Campos importantes Ethernet:
MAC Destino/Origen: Direcciones físicas
Tipo: 0x0800=IPv4, 0x0806=ARP, 0x86DD=IPv6
CAPA 1 - FÍSICA (Bits en el cable)
Preamble (7 bytes) │ SFD (1 byte) │ Ethernet Frame │ CRC (4 bytes)
10101010...10101010 │ 10101011 │ [Frame completo]│ Checksum🔄 Ejemplo Real: HTTP Request Convertido en Paquetes
Datos originales de API:
{"action": "login", "user": "admin"}Paso 1: Aplicación añade headers HTTP
POST /api/auth HTTP/1.1
Host: api.server.com
Content-Type: application/json
Content-Length: 36
{"action": "login", "user": "admin"}Tamaño: 135 bytes
Paso 2: TCP encapsula (añade 20 bytes)
[TCP Header - 20 bytes]
Src Port: 54321
Dst Port: 443
SEQ: 1000
ACK: 0
Flags: SYN
Window: 64240
[HTTP Data - 135 bytes]Tamaño: 155 bytes
Paso 3: IP encapsula (añade 20 bytes)
[IP Header - 20 bytes]
Version: 4
TTL: 64
Protocol: TCP (6)
Src IP: 192.168.1.100
Dst IP: 93.184.216.34
[TCP Segment - 155 bytes]Tamaño: 175 bytes
Paso 4: Ethernet encapsula (añade 14 bytes)
[Ethernet Header - 14 bytes]
Dst MAC: 00:1A:2B:3C:4D:5E
Src MAC: 00:0C:29:AB:CD:EF
Type: 0x0800 (IPv4)
[IP Packet - 175 bytes]Tamaño: 189 bytes
Paso 5: Envío físico (añade 8 bytes preamble + 4 bytes CRC)
[Preamble: 7 bytes] + [SFD: 1 byte] + [Frame: 189 bytes] + [CRC: 4 bytes]Tamaño total transmitido: 201 bytes
📊 Resumen de Encapsulación
┌─────────────────────────────────────────────────────────────┐
│ HTTP: │ Headers HTTP │ Body JSON │
│ ├──────────────┴───────────────────────────────────┤
│ TCP: │ TCP Header │ Segmento TCP (HTTP completo) │
│ ├──────────────┴───────────────────────────────────┤
│ IP: │ IP Header │ Datagrama IP (TCP + HTTP) │
│ ├──────────────┴───────────────────────────────────┤
│ Ethernet │ MAC Header │ Trama (IP + TCP + HTTP) │
│ ├──────────────┴───────────────────────────────────┤
│ Física │ Preamble │ Señales eléctricas/ópticas │
└──────────┴──────────────┴───────────────────────────────────┘🔢 Tamaños Típicos y MTU
MTU (Maximum Transmission Unit):
Ethernet estándar: 1500 bytes
Jumbo Frames: hasta 9000 bytes
PPPoE: 1492 bytes
Desglose de tamaños:
┌─────────────────────────────────────────────┐
│ Headers: │
│ • Ethernet: 14-22 bytes │
│ • IP: 20-60 bytes │
│ • TCP: 20-60 bytes │
│ • HTTP: 200-8000 bytes (depende de API) │
├─────────────────────────────────────────────┤
│ Payload máximo útil por paquete: │
│ 1500 - (14+20+20) = 1446 bytes │
└─────────────────────────────────────────────┘🛠️ Fragmentación IP
Cuando los datos exceden el MTU:
Paquete original (2000 bytes):
┌────────┬─────────────────────────────┐
│ IP Hdr │ Datos 2000 bytes │
└────────┴─────────────────────────────┘Se fragmenta en:
Fragmento 1:
┌────────┬────────────┬─────────────────┐
│ IP Hdr │ Offset: 0 │ Datos 1480 bytes│
└────────┴────────────┴─────────────────┘
Fragmento 2:
┌────────┬──────────────┬───────────────┐
│ IP Hdr │ Offset: 1480 │ Datos 520 bytes│
└────────┴──────────────┴───────────────┘📡 Ejemplo Práctico con Wireshark
Captura de un paquete HTTP real:
Frame 1: 542 bytes on wire (4336 bits)
Ethernet II, Src: Apple_ab:cd:ef (a0:99:9b:ab:cd:ef)
Destination: GoogleLLC_12:34:56 (00:11:22:33:44:55)
Source: Apple_ab:cd:ef (a0:99:9b:ab:cd:ef)
Type: IPv4 (0x0800)
Internet Protocol Version 4, Src: 192.168.1.100, Dst: 142.250.185.78
0100 .... = Version: 4
.... 0101 = Header Length: 20 bytes
Total Length: 528
Identification: 0x1234
Flags: 0x4000, Don't fragment
Time to live: 64
Protocol: TCP (6)
Transmission Control Protocol, Src Port: 54321, Dst Port: 443
Sequence number: 1000
Acknowledgment number: 0
Header length: 20 bytes
Flags: 0x002 (SYN)
Window size value: 64240
Hypertext Transfer Protocol
GET /api/v1/users HTTP/1.1\r\n
Host: api.google.com\r\n
User-Agent: curl/7.68.0\r\n
Accept: application/json\r\n
\r\n🔍 Headers Específicos por Capa
TCP Flags (1 byte)
CWR ECE URG ACK PSH RST SYN FIN
0 0 0 0 0 0 1 0 = SYN (inicio conexión)
0 0 0 1 0 0 0 0 = ACK (confirmación)
0 0 0 1 0 0 0 1 = FIN (cierre conexión)IP Flags (3 bits)
Bit 0: Reservado (0)
Bit 1: Don't Fragment (DF)
Bit 2: More Fragments (MF)Protocol Numbers
1: ICMP (ping)
6: TCP
17: UDP
47: GRE
50: ESP (IPSec)
88: EIGRP
89: OSPF🎯 Resumen de Partes del Paquete
Preamble/SFD: Sincronización física (8 bytes)
Ethernet Header: MACs + Tipo (14 bytes)
IP Header: IPs + Control (20-60 bytes)
TCP/UDP Header: Puertos + Control (20-60 bytes)
Payload/Aplicación: Datos reales (variable)
FCS/CRC: Detección errores (4 bytes)
Comentarios
Publicar un comentario