Lección 5 de 1514 min
Protocolos de red: de TCP/IP a HTTP/3
Las capas que hay debajo de cada petición: TCP/IP, TLS, HTTPS, la evolución de HTTP, los tipos MIME y la diferencia entre URI, URL y URN.
Cuando abres https://tienda.ejemplo en el móvil, tu petición HTTP no viaja sola: va metida dentro de otras capas, como una carta dentro de un sobre dentro de una saca de correos. Una capa trocea los datos en paquetes y los lleva de máquina en máquina, otra comprueba que llegan todos y en orden, y otra los cifra para que nadie los lea por el camino.
En la lección de HTTP viste métodos, cabeceras y códigos de estado, y en la de DNS, cómo se encuentra el servidor. Aquí bajamos un nivel: qué transporta esos mensajes, cómo se protegen, por qué HTTP ha cambiado tanto en los últimos años y cómo se etiqueta e identifica lo que viaja.
Las capas de debajo
Internet funciona por capas: cada una resuelve un problema concreto y se apoya en la de abajo sin saber cómo trabaja por dentro. Gracias a eso, HTTP funciona igual por wifi, por fibra o por datos móviles.
TCP/IP: el modelo de capas
La familia de protocolos que mueve los datos de Internet, organizada en capas.
- Capas:
- 4
- Mantiene:
- IETF
TCP/IP es el conjunto de protocolos sobre el que funciona Internet. Se suele explicar en cuatro capas: enlace (cómo viajan los bits por el cable, el wifi o la fibra), internet (cómo llega un paquete de una máquina a otra saltando de router en router), transporte (cómo se entregan los datos al programa correcto) y aplicación (HTTP, DNS, el correo… lo que de verdad quieres hacer).
La capa de internet es IP: envía paquetes sueltos a una dirección, como 203.0.113.7 en IPv4 o 2001:db8::7 en IPv6, sin ninguna garantía. Un paquete puede perderse, duplicarse o llegar desordenado. La capa de transporte añade el puerto, el número que indica a qué programa va dirigido (443 para HTTPS, 53 para DNS), y, si usa TCP, la fiabilidad.
Quizá oigas hablar también del modelo OSI, de siete capas. Es un modelo teórico más detallado, pero su numeración se usa mucho: «capa 7» es la de aplicación y «capa 4», la de transporte.
Úsalo cuando
Te sirve para ubicar cada problema: un nombre que no resuelve, un puerto cerrado en el firewall o un certificado caducado ocurren en capas distintas y se diagnostican con herramientas distintas.
Ten en cuenta
Las capas son un modelo para entender, no compartimentos estancos. TLS, por ejemplo, vive entre el transporte y la aplicación, y QUIC, que verás más abajo, mezcla transporte y cifrado.
Aplicación HTTP GET /productos Host: tienda.ejemplo
(Seguridad) TLS cifra el mensaje HTTP
Transporte TCP puerto 51234 → puerto 443
Internet IP 192.0.2.10 → 203.0.113.7
Enlace Wi-Fi hasta el router de casa
Cada capa envuelve a la anterior con su propia cabecera,
como un sobre dentro de otro sobre.TCP y UDP
Dos formas de transportar datos: con garantías de entrega o sin esperar a nadie.
- TCP:
- fiable y ordenado
- UDP:
- ligero, sin garantías
TCP abre una conexión antes de enviar nada, con un saludo de tres pasos (SYN, SYN-ACK, ACK) que cuesta un viaje de ida y vuelta. Después numera los datos, confirma lo que recibe y reenvía lo que se pierde, así que la aplicación los recibe completos y en orden. Además regula el ritmo para no saturar la red (el control de congestión).
UDP no abre conexión ni confirma nada: envía cada paquete, llamado datagrama, y se olvida. Es más ligero y no hace esperar a nadie, pero si algo se pierde, se pierde. Lo usan DNS, las videollamadas, los juegos en línea y, como verás enseguida, HTTP/3.
La garantía de orden de TCP tiene un precio: si se pierde un paquete, todo lo que llegó detrás espera en un búfer hasta que llega el reenvío, aunque ya esté completo. Es el bloqueo de cabeza de línea (head-of-line blocking), la clave para entender HTTP/2 y HTTP/3.
Úsalo cuando
TCP, cuando no puede faltar ni un byte: páginas, APIs, descargas. UDP, cuando un dato que llega tarde ya no sirve: la voz de una llamada o la posición de un jugador.
Ten en cuenta
UDP no es «más rápido» por arte de magia: si necesitas fiabilidad, tienes que construirla encima, que es justo lo que hace QUIC. Y algunas redes corporativas bloquean el tráfico UDP que no reconocen.
TCP cliente → SYN
servidor → SYN-ACK
cliente → ACK (conexión abierta)
cliente → segmentos 1, 2 y 3 (el 2 se pierde)
servidor → «tengo hasta el 1, me falta el 2»
cliente → reenvía el 2 (mientras, el 3 espera en el búfer)
UDP cliente → datagramas 1, 2 y 3
(sin saludo ni confirmaciones: si el 2 se pierde, nadie lo reenvía)Conexiones seguras: TLS y HTTPS
TLS (antes, SSL)
El protocolo que cifra la conexión y demuestra que hablas con el servidor correcto.
- Versión actual:
- TLS 1.3
- Obsoletos:
- SSL, TLS 1.0 y 1.1
TLS (Transport Layer Security) se coloca encima de TCP y ofrece tres garantías: confidencialidad (nadie en el camino puede leer los datos), integridad (nadie puede modificarlos sin que se note) y autenticación (el servidor demuestra quién es con un certificado firmado por una autoridad de certificación en la que confía tu navegador).
Antes de enviar datos, cliente y servidor hacen un handshake (saludo): acuerdan los algoritmos, el servidor presenta su certificado y ambos calculan unas claves que solo ellos conocen. En TLS 1.3, la versión actual, ese saludo cuesta un solo viaje de ida y vuelta.
SSL es el nombre de su predecesor, de los años 90. Todas sus versiones son inseguras, igual que TLS 1.0 y 1.1, y los navegadores ya no las aceptan. Aun así, mucha gente sigue diciendo «certificado SSL» cuando habla de TLS.
Úsalo cuando
Siempre que viajen datos por una red, y no solo en la web: el correo, las conexiones a bases de datos y las llamadas entre microservicios también usan TLS.
Ten en cuenta
Los certificados caducan, y su duración máxima es cada vez más corta. Si no automatizas la renovación (por ejemplo, con Let's Encrypt y el protocolo ACME), un día tu web dejará de cargar con un aviso de seguridad. Lo verás a fondo en el módulo de seguridad web.
Cliente → ClientHello: «hablo TLS 1.3; propongo estos algoritmos
y esta parte de la clave»
Servidor → ServerHello + certificado de tienda.ejemplo
+ firma que demuestra que tiene la clave privada
Cliente → comprueba el certificado y la firma → «listo»
… a partir de aquí, todo viaja cifrado (1 ida y vuelta)HTTPS
El HTTP de siempre, pero viajando dentro de una conexión TLS.
- Puerto:
- 443
- Esquema:
- https://
HTTPS no es un protocolo distinto: son los mismos mensajes HTTP, cifrados con TLS. Usa el esquema https:// y, por defecto, el puerto 443 en lugar del 80. El candado de la barra de direcciones indica que la conexión está cifrada y que el certificado corresponde a ese dominio; no dice nada de si la web es de fiar.
Hoy es obligatorio en la práctica: los navegadores marcan como «No seguro» las páginas HTTP, solo usan HTTP/2 y HTTP/3 sobre conexiones cifradas, y muchas APIs (Service Workers, geolocalización, el portapapeles) solo funcionan en un contexto seguro, es decir, en HTTPS o en localhost.
Úsalo cuando
En todas las webs, también en las que «no tienen nada que proteger»: sin cifrado, cualquiera en la misma red wifi puede leer o modificar lo que ves, incluso inyectar anuncios o scripts.
Ten en cuenta
Si una página HTTPS carga un script o una imagen por http://, tiene contenido mixto, y el navegador lo bloquea o intenta pasarlo a HTTPS. Para que nadie vuelva a entrar por HTTP, envía la cabecera Strict-Transport-Security (HSTS).
server {
listen 80;
server_name tienda.ejemplo;
return 301 https://$host$request_uri; # todo lo que llegue por HTTP, a HTTPS
}
server {
listen 443 ssl;
server_name tienda.ejemplo;
ssl_certificate /etc/ssl/tienda.crt;
ssl_certificate_key /etc/ssl/tienda.key;
# «Durante un año, entra siempre por HTTPS»
add_header Strict-Transport-Security "max-age=31536000" always;
}Pruébalo
Haz clic en el icono que hay junto a la dirección de cualquier web con HTTPS y abre la información del certificado: verás para qué dominio se emitió, quién lo firmó y cuándo caduca.
La evolución de HTTP
Los mensajes de HTTP (métodos, cabeceras, códigos de estado) apenas han cambiado en todos estos años. Lo que ha cambiado es cómo viajan: cuántas peticiones caben a la vez en una conexión y qué pasa cuando se pierde un paquete por el camino.
HTTP/1.1
La versión de texto: en cada conexión, una petición detrás de otra.
- Formato:
- texto
- Desde:
- 1997
HTTP/1.1 envía los mensajes como texto legible, como los que viste en la lección de HTTP. Trajo las conexiones persistentes (keep-alive), que reutilizan una misma conexión TCP para varias peticiones, y la cabecera Host, que permite alojar muchos dominios en un mismo servidor.
Su gran limitación: en cada conexión, una petición tiene que esperar a que termine la respuesta anterior. Para no hacer tanta cola, los navegadores abren varias conexiones en paralelo con el mismo dominio, normalmente hasta seis, y los desarrolladores inventaron trucos como juntar todos los iconos en una sola imagen (sprites) o repartir los recursos entre varios subdominios.
Úsalo cuando
Sigue siendo el mínimo común que entiende cualquier cliente o servidor, y es lo que suele hablarse entre un proxy inverso y tu aplicación dentro de un mismo servidor.
Ten en cuenta
Los trucos de la época de HTTP/1.1, como repartir recursos entre subdominios (domain sharding), son contraproducentes con HTTP/2 y HTTP/3, que rinden mejor con una sola conexión.
GET /estilos.css HTTP/1.1
Host: tienda.ejemplo
HTTP/1.1 200 OK
Content-Type: text/css
Content-Length: 1830
(… 1830 bytes de CSS …)
GET /app.js HTTP/1.1 ← sale cuando termina la respuesta anterior
Host: tienda.ejemploHTTP/2
Binario y multiplexado: muchas peticiones a la vez por una sola conexión.
- Formato:
- binario
- Transporte:
- TCP
- Desde:
- 2015
HTTP/2 mantiene la misma semántica, pero cambia el formato: divide cada mensaje en frames binarios etiquetados con un número de flujo (stream). Así, por una única conexión TCP viajan a la vez, intercaladas, todas las peticiones y respuestas de la página: es la multiplexación. Además comprime las cabeceras con HPACK, para no reenviar una y otra vez las mismas cookies.
Su punto débil está debajo: TCP no sabe que hay varios flujos, solo ve una fila de bytes. Si se pierde un paquete, retiene todo lo que llegó detrás, sea del flujo que sea. En una red con pérdidas, como un móvil con mala cobertura, una sola pérdida frena toda la página.
Úsalo cuando
Es lo normal hoy en cualquier servidor o CDN. Actívalo y olvídate de los trucos para ahorrar conexiones: ya no hace falta repartir recursos entre subdominios.
Ten en cuenta
Los navegadores solo usan HTTP/2 sobre TLS. Y su función de server push, con la que el servidor enviaba recursos antes de que se pidieran, apenas se usó y Chrome y Firefox la han retirado.
Conexión TCP única con tienda.ejemplo
flujo 1 HEADERS GET /estilos.css
flujo 3 HEADERS GET /app.js
flujo 5 HEADERS GET /foto.jpg
flujo 1 DATA estilos.css (parte 1)
flujo 5 DATA foto.jpg (parte 1)
flujo 3 DATA app.js (completo)
flujo 1 DATA estilos.css (parte 2, fin)HTTP/3 y QUIC
HTTP sobre QUIC, un transporte nuevo construido encima de UDP.
- Transporte:
- QUIC sobre UDP
- Desde:
- 2022
HTTP/3 resuelve lo que HTTP/2 no podía resolver por ir sobre TCP. Usa QUIC, un protocolo de transporte que funciona sobre UDP e implementa por su cuenta lo que hacía TCP: confirmaciones, reenvíos y control de congestión. La diferencia es que QUIC sí conoce los flujos: si se pierde un paquete, solo espera el flujo al que pertenecía.
QUIC lleva TLS 1.3 integrado, así que la conexión y el cifrado se negocian a la vez, en un solo viaje de ida y vuelta (o en ninguno, si reanudas una conexión reciente). Y como identifica la conexión con un ID propio, no por la IP, puede sobrevivir a un cambio de red, como pasar del wifi a los datos móviles.
El navegador no sabe de antemano si un servidor habla HTTP/3: lo normal es que conecte primero por HTTP/2 y que el servidor le anuncie, con la cabecera Alt-Svc o con un registro DNS, que puede usar HTTP/3 en las siguientes peticiones.
Úsalo cuando
Te beneficia sobre todo en móviles y redes inestables. No cambia tu código: lo activas en el servidor o en la CDN y los navegadores lo usan cuando está disponible.
Ten en cuenta
Algunas redes bloquean o limitan UDP; entonces el navegador vuelve a HTTP/2 sin que el usuario lo note. Por eso conviene servir siempre las dos versiones.
HTTP/2 200
content-type: text/html; charset=utf-8
alt-svc: h3=":443"; ma=86400
# «También hablo HTTP/3 (h3) en el puerto 443; recuérdalo un día.»
# La siguiente petición del navegador irá por QUIC, sobre UDP.Pruébalo
Abre las herramientas de desarrollo (F12), ve a la pestaña Red y activa la columna «Protocolo»: verás qué versión de HTTP usó cada petición, por ejemplo h2 o h3.
Interactivo
HTTP/1.1, HTTP/2 y HTTP/3
La página necesita seis recursos. Elige una versión de HTTP, pierde un paquete por el camino y mira quién tiene que esperar.
- Abrir conexión
- En cola
- Petición en camino
- Paquete recibido
- Paquete perdido
- Recibido, pero esperando
- Reenvío
- Se entrega tras el reenvío
Cuándo están listos los seis recursos
Las seis peticiones viajan a la vez por una sola conexión (multiplexación): no hay cola y todo está listo en el instante 9.
Modelo simplificado: una ida y vuelta dura dos instantes y HTTP/1.1 usa dos conexiones para que se vea la cola (los navegadores abren hasta seis por dominio, pero una página real pide muchos más recursos).
Etiquetar e identificar lo que viaja
Tipos MIME
La etiqueta que dice qué es un contenido: text/html, image/png, application/json…
- Forma:
- tipo/subtipo
- Registro:
- IANA
Un tipo MIME, o tipo de medio, tiene la forma tipo/subtipo: text/html, text/css, text/javascript, image/webp, application/json, font/woff2. Puede llevar parámetros, como text/html; charset=utf-8. El nombre viene del correo electrónico (Multipurpose Internet Mail Extensions), donde nació para adjuntar archivos, y la IANA mantiene el registro oficial.
En HTTP viaja en dos cabeceras: Content-Type dice qué se está enviando y Accept dice qué formatos prefiere recibir el cliente. El navegador se fía del tipo MIME, no de la extensión: un archivo datos.json servido como text/html se tratará como HTML.
Úsalo cuando
Cada vez que tu servidor devuelve algo o tu cliente envía un cuerpo: una API que responde JSON debe enviar Content-Type: application/json, y un formulario con archivos viaja como multipart/form-data.
Ten en cuenta
Un tipo equivocado rompe cosas: el navegador ignora una hoja de estilos que no llegue como text/css y rechaza un módulo de JavaScript que no llegue con un tipo de JavaScript. Envía también X-Content-Type-Options: nosniff, para que el navegador no intente adivinar el tipo, una vía clásica de ataques.
# El cliente dice qué prefiere recibir
GET /api/productos/7 HTTP/1.1
Accept: application/json
# El servidor dice qué envía
HTTP/1.1 200 OK
Content-Type: application/json
X-Content-Type-Options: nosniff
{ "id": 7, "nombre": "Taza" }URI, URL y URN
Tres siglas para identificar recursos: en general, por su ubicación o por su nombre.
- Sintaxis:
- RFC 3986
- En navegadores:
- URL Standard
Un URI (Uniform Resource Identifier) es cualquier cadena que identifica un recurso con una sintaxis común: un esquema, dos puntos y lo que ese esquema necesite. Es el término general.
Una URL (Uniform Resource Locator) es un URI que además dice dónde está el recurso y cómo llegar a él, como https://tienda.ejemplo/libros/7; sus partes ya las desmontaste en «Anatomía de una URL». Un URN (Uniform Resource Name) lo identifica por su nombre, de forma permanente y sin decir dónde encontrarlo: urn:isbn:0451450523 nombra un libro, no una tienda que lo venda.
En el día a día la diferencia importa poco: el estándar URL del WHATWG, el que siguen los navegadores, llama URL a todo, incluidos mailto: o data:. Los URN aparecen en sitios concretos, como los ISBN, los UUID (urn:uuid:…) o algunos parámetros de OAuth.
Úsalo cuando
Di «URL» al hablar de direcciones web. Reserva «URI» para cuando leas especificaciones, que hablan de URI, y «URN» para identificadores que no deben cambiar aunque el recurso cambie de sitio.
Ten en cuenta
Toda URL y todo URN son URI, pero no al revés. Y que algo tenga forma de URL no significa que haya que visitarlo: los espacios de nombres de XML, como http://www.w3.org/2000/svg, son identificadores, no direcciones que el navegador vaya a descargar.
https://tienda.ejemplo/libros/7?formato=tapa URL: dónde está y cómo pedirlo
mailto:soporte@tienda.ejemplo URI (URL, para el WHATWG)
urn:isbn:0451450523 URN: el nombre de un libro
urn:ietf:params:oauth:grant-type:device_code URN que usa OAuthInteractivo
HTTP/1.1, HTTP/2 y HTTP/3 cara a cara
Activa o desactiva opciones para compararlas cara a cara.
| Característica | HTTP/1.1 | HTTP/2 | HTTP/3 |
|---|---|---|---|
| Formato | Texto | Binario, en frames | Binario, en frames |
| Transporte | TCP, con TLS para HTTPS | TCP + TLS | QUIC sobre UDP, con TLS 1.3 integrado |
| Peticiones a la vez por conexión | Una; el navegador abre varias conexiones | Muchas, multiplexadas en flujos | Muchas, en flujos independientes |
| Si se pierde un paquete… | Se para esa conexión y lo que hace cola en ella | Esperan todos los flujos (bloqueo de TCP) | Solo espera el flujo afectado |
| Cabeceras | Sin comprimir, repetidas en cada petición | Comprimidas con HPACK | Comprimidas con QPACK |
| Abrir una conexión segura | TCP + TLS: unas dos idas y vueltas con TLS 1.3 | Igual que HTTP/1.1 | Una ida y vuelta, o ninguna al reanudar |
Ponlo en práctica
Saber qué es cada cosa es la mitad del trabajo. La otra mitad es reconocer cuándo usarla.
Interactivo
¿Qué usarías?
Lee cada situación y elige la opción que mejor la resuelve. Fallar aquí no cuenta: es para practicar.
Tu tienda carga bien en la oficina, pero en el metro, con cobertura irregular, se queda a medias aunque todo viaje por una única conexión HTTP/2. Quieres que perder un paquete no frene todos los recursos a la vez.
Para recordar
- Internet funciona por capas: IP lleva paquetes entre máquinas, TCP o UDP los entregan al programa correcto y HTTP va encima.
- TCP entrega todo completo y en orden; ese orden es justo lo que provoca el bloqueo de cabeza de línea cuando se pierde un paquete.
- HTTPS es HTTP dentro de TLS, y SSL es el nombre antiguo y obsoleto de TLS.
- HTTP/1.1 hace cola en cada conexión, HTTP/2 multiplexa sobre TCP y HTTP/3 multiplexa sobre QUIC, con flujos independientes.
- El tipo MIME, no la extensión, dice qué es un contenido; URL y URN son dos clases de URI.
Comprueba lo aprendido
Cuestionario
Responde las 5 preguntas para completar la lección.
1.¿Por qué HTTP/2 sufre bloqueo de cabeza de línea si ya multiplexa las peticiones?
2.Ves el candado junto a la dirección de una web. ¿Qué te garantiza?
3.QUIC funciona sobre UDP, que no garantiza la entrega. ¿Cómo evita HTTP/3 perder datos?
4.El servidor envía
app.jscomotext/plainy tu página lo carga con<script type="module">. ¿Qué ocurre?5.¿Cuál es la diferencia entre una URL y un URN?