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

text
┌─────────────────────────────────────────────────────────────┐
│                    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)

text
┌─────────────────────────────────────────────────────────────┐
│ 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):

text
 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):

text
 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):

text
┌─────────────────┬─────────────────┬─────────┬─────────────────┐
│ 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)

text
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:

json
{"action": "login", "user": "admin"}

Paso 1: Aplicación añade headers HTTP

text
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)

text
[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)

text
[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)

text
[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)

text
[Preamble: 7 bytes] + [SFD: 1 byte] + [Frame: 189 bytes] + [CRC: 4 bytes]

Tamaño total transmitido: 201 bytes

📊 Resumen de Encapsulación

text
┌─────────────────────────────────────────────────────────────┐
│ 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:

text
┌─────────────────────────────────────────────┐
│ 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):

text
┌────────┬─────────────────────────────┐
│ IP Hdr │       Datos 2000 bytes      │
└────────┴─────────────────────────────┘

Se fragmenta en:

text
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:

text
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)

text
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)

text
Bit 0: Reservado (0)
Bit 1: Don't Fragment (DF)
Bit 2: More Fragments (MF)

Protocol Numbers

text
1: ICMP (ping)
6: TCP
17: UDP
47: GRE
50: ESP (IPSec)
88: EIGRP
89: OSPF

🎯 Resumen de Partes del Paquete

  1. Preamble/SFD: Sincronización física (8 bytes)

  2. Ethernet Header: MACs + Tipo (14 bytes)

  3. IP Header: IPs + Control (20-60 bytes)

  4. TCP/UDP Header: Puertos + Control (20-60 bytes)

  5. Payload/Aplicación: Datos reales (variable)

  6. FCS/CRC: Detección errores (4 bytes)

Comentarios

Entradas populares de este blog

¿Qué es el Modelo OSI?

bit -El codigo ASCII

38. Tema 1: Protocolos de comunicación.