Frames de HTTP/2
HTTP/2 es un protocolo binario. Cada mensaje es un frame tipado con un encabezado de 9 bytes. DATA lleva los cuerpos, HEADERS lleva metadata comprimida con HPACK, SETTINGS negocia los parámetros de la conexión, WINDOW_UPDATE controla el flujo.
Código
// nyx-http2 frames — HEADERS, DATA, SETTINGS frame types
import "std/http2"
fn main() -> int {
// HTTP/2 is a binary protocol with typed frames.
// Each frame has a 9-byte header + payload.
print("HTTP/2 frame types:")
print(" H2_DATA = " + int_to_string(H2_DATA) + " — request/response bodies")
print(" H2_HEADERS = " + int_to_string(H2_HEADERS) + " — HPACK-compressed headers")
print(" H2_SETTINGS = " + int_to_string(H2_SETTINGS) + " — connection parameters")
print(" H2_PING = " + int_to_string(H2_PING) + " — keep-alive")
print(" H2_GOAWAY = " + int_to_string(H2_GOAWAY) + " — graceful shutdown")
print(" H2_WINDOW_UPDATE = " + int_to_string(H2_WINDOW_UPDATE) + " — flow control")
print("")
print("Connection preface: client sends 24-byte magic string")
print("\"PRI * HTTP/2.0\\r\\n\\r\\nSM\\r\\n\\r\\n\" followed by SETTINGS frame.")
print("")
print("Each request opens a new stream_id (odd for client-initiated).")
print("HPACK compresses repeated headers: Host, User-Agent, etc.")
return 0
}
Salida
HTTP/2 frame types: H2_DATA = 0 — request/response bodies H2_HEADERS = 1 — HPACK-compressed headers H2_SETTINGS = 4 — connection parameters H2_PING = 6 — keep-alive H2_GOAWAY = 7 — graceful shutdown H2_WINDOW_UPDATE = 8 — flow control Connection preface: client sends 24-byte magic string "PRI * HTTP/2.0\r\n\r\nSM\r\n\r\n" followed by SETTINGS frame. Each request opens a new stream_id (odd for client-initiated). HPACK compresses repeated headers: Host, User-Agent, etc.
Explicación
Mientras que HTTP/1.1 era un protocolo de texto que se podía depurar con telnet, HTTP/2 es binario y está organizado en frames. El encabezado de 9 bytes codifica la longitud (24 bits), el tipo (8 bits), los flags (8 bits) y un identificador de stream de 31 bits. Entender los tipos de frame es la clave para leer trazas de HTTP/2: SETTINGS se envía al inicio para negociar límites, HEADERS abre un stream, DATA lleva el cuerpo, WINDOW_UPDATE evita que emisores rápidos saturen a receptores lentos, y GOAWAY le indica cortésmente al peer que deje de abrir nuevos streams.