SuperNotes by yuri.rodrix

Notas de Yuri.Rodrix


Página tipo blog en el que voy a publicar mis notas de aprendizaje, en especial de temas como matemáticas, física y quizá algo de programación

Redes neuronales
Redes neuronales
Redes neuronales
Redes neuronales
Redes neuronales
Redes neuronales

Datagrama IPv6 y fragmentación

Un datagrama IPv6 empieza con una cabecera base de 40 bytes fijos — sin opciones, sin IHL, sin campo de fragmentación— seguida de cero o más cabeceras de extensión encadenadas. Esa decisión de diseño es la que explica el tema que más confunde del protocolo: la fragmentación en IPv6 funciona al revés que en IPv4. Aquí los routers no fragmentan; solo el host origen lo hace, y solo si hace falta.

La cabecera base es la misma cosa vista como suma de campos: 8 bytes de control + 32 bytes de direcciones.

40 bytes fijoscabecera base=4Ver+8TC+20Flow+16PayLen+8NextHdr+8HopLim8 bytes+128+128src + dst\underbrace{40\ \text{bytes fijos}}_{\text{cabecera base}}=\underbrace{\overbrace{4}^{\text{Ver}}+\overbrace{8}^{\text{TC}}+\overbrace{20}^{\text{Flow}}+\overbrace{16}^{\text{PayLen}}+\overbrace{8}^{\text{NextHdr}}+\overbrace{8}^{\text{HopLim}}}_{8\ \text{bytes}}+\underbrace{128+128}_{\text{src + dst}}

El campo Payload Length\text{Payload Length} cuenta solo lo que sigue a estos 40 bytes (extensiones + datos), a diferencia del Total Length de IPv4 que sí incluía su propia cabecera.

1. La cabecera base y la cadena Next Header

El campo estrella de IPv6 es Next Header: en vez de meter opciones dentro de la cabecera (como hacía IPv4 con su IHL variable), IPv6 las saca a cabeceras de extensión y las encadena con un puntero. Cada cabecera dice, con su Next Header, de qué tipo es la siguiente. Es, literalmente, una lista enlazada que termina en un protocolo de transporte (TCP=6, UDP=17, ICMPv6=58).

① La cabecera base IPv6 — 40 bytes fijos

Haz clic en un campo o en un byte del dump: ambos se resaltan a la vez. Fíjate en que no hay campo de fragmentación aquí dentro (ni IHL, ni opciones): IPv6 saca esos campos de la cabecera base y los mueve a cabeceras de extensión.

Diagrama de campos
Dump hex (40 bytes, 4 por fila)
0x00
0x04
0x08
0x0c
0x10
0x14
0x18
0x1c
0x20
0x24

Ejemplo: 2001:db8::1 → 2001:db8::2, payload 1440 B. El byte 0x06 (Next Header) cambia al activar una cabecera de extensión.

Next Header· 8 bits · ej. 44 (Fragment)

El campo clave de IPv6: dice de qué tipo es la SIGUIENTE cabecera. Puede ser una cabecera de extensión (44 = Fragment, 0 = Hop-by-Hop, 43 = Routing…) o un protocolo de transporte (6 = TCP, 17 = UDP, 58 = ICMPv6). Es el puntero de una lista enlazada.

Cadena de cabeceras (campo Next Header como lista enlazada)
Cabecera base IPv6
NH → 44
Fragment
NH → 6
TCP
datos
Ext. headers:Transporte:
Estructura de las cabeceras de extensión activas
Fragment · NH = 44 · 8 B fijos
Next Header
8b
Reserved
8b
Fragment Offset
13b
Res
2b
M
1b
Identification (32 bits)
32b

Esta es la cabecera que el origen inserta para fragmentar. Offset en unidades de 8 bytes; M = 1 en todos menos el último; el Identification (32 b) une los fragmentos del mismo datagrama.

Cada cabecera apunta a la siguiente con su Next Header. Para fragmentar, el origen inserta la cabecera Fragment (44) en esta cadena — no toca la cabecera base.

Las direcciones de origen y destino (128 bits cada una) salen de Direccionamiento IPv4 e IPv6, donde se ven bit a bit.

2. Fragmentación: el corazón del post

Cuando un datagrama es más grande que el MTU (Maximum Transmission Unit) del enlace, hay que partirlo en fragmentos. La pregunta es quién lo parte y dónde guarda la información para reensamblarlo. Ahí IPv4 e IPv6 toman caminos opuestos:

En ambos, el offset de cada fragmento se mide en unidades de 8 bytes y el último fragmento se marca con su bit de «no hay más»:

offsetcampo=posicioˊn en bytes8,uˊltima pieza  MF=0IPv4    M=0IPv6\text{offset}_{\text{campo}}=\frac{\text{posición en bytes}}{8}\,,\qquad \text{última pieza}\ \Rightarrow\ \underbrace{\text{MF}=0}_{\text{IPv4}}\;\equiv\;\underbrace{\text{M}=0}_{\text{IPv6}}
AspectoIPv4IPv6
¿Quién fragmenta?Origen y cualquier router del caminoSolo el host origen
¿Dónde vive el campo?Dentro de la cabecera (Identification, Flags, Fragment Offset)En una cabecera de extensión Fragment (Next Header = 44)
Identification16 bits32 bits
Si no cabe en un routerEl router lo fragmenta (salvo bit DF=1 → descarta + ICMP)Lo descarta + ICMPv6 «Packet Too Big»
MTU mínimo garantizado576 B1280 B
¿Quién reensambla?Solo el destinoSolo el destino

Mueve el MTU y el tamaño de la carga y compara cómo cada protocolo parte el mismo paquete. Fíjate en que IPv6 paga más overhead por fragmento (48 B contra 20 B), razón de más para preferir no fragmentar:

② Fragmentación: IPv4 vs IPv6 (mismo payload, mismo MTU) 🎯

IPv4 — cabecera 20 B3 fragmentos

cabecera/fragmento: 20 B · carga máx/fragmento: ⌊(150020)/8⌋×8

#0IDoff=0MF=1len=1480B1500B en el cable
hdr
1480B
#1IDoff=185MF=1len=1480B1500B en el cable
hdr
1480B
#2IDoff=370MF=0len=1040B1060B en el cable
hdr
1040B
Cualquier router del camino puede fragmentar en vuelo (o el origen). Reensambla solo el destino.
IPv6 — base 40 B + Fragment 8 B3 fragmentos

cabecera/fragmento: 40 + 8 B · carga máx/fragmento: ⌊(150048)/8⌋×8

#0ID(32b)off=0M=1len=1448B1496B en el cable
hdr
1448B
#1ID(32b)off=181M=1len=1448B1496B en el cable
hdr
1448B
#2ID(32b)off=362M=0len=1104B1152B en el cable
hdr
1104B
Solo el host origen fragmenta, vía cabecera Fragment (44). Los routers NO fragmentan: descartan y mandan ICMPv6 Packet Too Big.
cabecera del fragmentodatos (carga útil)cabe sin fragmentar
Fragmentos IPv43
Fragmentos IPv63
Carga útil máx / frag (v4)1480 B
Carga útil máx / frag (v6)1448 B

La diferencia que importa: en IPv4 el campo de fragmentación (Identification, MF, Fragment Offset) vive dentro de la cabecera, así que cualquier router puede partir el paquete en vuelo. En IPv6 ese campo no existe en la cabecera base: para fragmentar hay que añadir la cabecera de extensión Fragment, y eso solo lo hace el origen. Un router que recibe un paquete IPv6 demasiado grande lo descarta y devuelve un ICMPv6 tipo 2 «Packet Too Big» con el MTU del enlace; el origen aprende ese MTU (Path MTU Discovery) y, si hace falta, fragmenta él mismo.

En ambos protocolos el offset va en unidades de 8 bytes y el reensamblaje ocurre solo en el destino. Lo que cambia es quiénfragmenta y dónde está el campo.

3. Path MTU Discovery

Si los routers IPv6 no fragmentan, ¿cómo sabe el origen qué tamaño usar? Lo aprende: manda un paquete, y si algún enlace del camino es demasiado estrecho, el router que lo descarta le devuelve un ICMPv6 «Packet Too Big» con el MTU de ese enlace. El origen baja su tamaño y reintenta. El Path MTU es el mínimo de todos los enlaces, y nunca baja de 1280 bytes:

Path MTU=minenlaces del caminoMTUi    1280 B\text{Path MTU}=\min_{\text{enlaces del camino}}\text{MTU}_i\;\ge\;1280\ \text{B}

③ Path MTU Discovery — cómo el origen aprende el MTU del camino

Origen
MTU 1500
R1
MTU 1400
✗ Packet Too Big
R2
MTU 1500
Destino
El paquete de 1500 B no cabe en el enlace de 1400 B. El router lo descarta y manda un ICMPv6 «Packet Too Big» (MTU = 1400). El origen baja su MTU de ruta a 1400 y reenvía (fragmentando si la app lo necesita).

El Path MTU es el mínimo de todos los enlaces del camino. Como los routers IPv6 no fragmentan, el origen los «escucha» a través de los ICMPv6 Packet Too Big y ajusta su tamaño — ese es todo el truco de PMTUD.

Conclusión práctica. Como fragmentar en IPv6 es caro (overhead, riesgo de pérdida de un fragmento = pérdida de todo) y depende del origen, lo habitual es evitarlo: las aplicaciones usan PMTUD o segmentan en capas superiores (p. ej. TCP ajusta su MSS) para que el datagrama siempre quepa.

4. Tipos de dirección IPv6 (recap)

No todas las direcciones IPv6 sirven para lo mismo: los bits altos deciden el alcance. Esto se ve bit a bit en Direccionamiento IPv4 e IPv6; aquí basta el resumen porque NDP y SLAAC lo usan:

TipoPrefijoPara qué
Global unicast2000::/3Enrutable en Internet (la «pública»).
Link-localfe80::/10Solo dentro del enlace; la forma cada interfaz por sí sola. La usa NDP.
ULA (única local)fc00::/7Privada (el equivalente a 10.0.0.0/8 de IPv4).
Multicastff00::/8Uno-a-muchos; reemplaza al broadcast. ff02::1/2, solicited-node…

IPv6 no tiene broadcast: todo lo que IPv4 hacía con difusión (ARP, DHCP discovery) aquí se hace con multicast.

5. NDP — descubrir vecinos y routers

¿Cómo averigua un host la MAC del vecino con quien quiere hablar, o quién es su router? IPv4 usaba ARP (con broadcast); IPv6 lo reemplaza por NDP (Neighbor Discovery Protocol), cuatro mensajes ICMPv6 sobre multicast: RS y RA (router) y NS y NA (vecino). Elige un escenario y mira el intercambio:

⑤ NDP — Neighbor Discovery (los cuatro mensajes ICMPv6)

Host
Router
──▶RS — Router Solicitation· ICMPv6 133dst: ff02::2 (all-routers)

«¿hay algún router? mándame el prefijo de la red»

◀──RA — Router Advertisement· ICMPv6 134dst: ff02::1 (all-nodes)

anuncia el prefijo /64, el gateway, el MTU y los flags M/O

El host forma su dirección global (SLAAC)

prefijo del RA + interface ID (EUI-64 o aleatorio)

Mensaje NDP (ICMPv6)Equivalente en IPv4
RS / RA (133 / 134)Router discovery (ICMP)
NS / NA (135 / 136)ARP request / reply
Redirect (137)ICMP Redirect

IPv6 elimina ARP y el broadcast: NDP viaja sobre ICMPv6 y usa multicast (la dirección solicited-node) para molestar solo a los nodos relevantes. Con NS/NA un host descubre la MAC de un vecino; con RS/RA descubre el router y el prefijo para autoconfigurarse.

6. SLAAC — autoconfiguración sin DHCP

Con el prefijo que aprendió en un RA, un host IPv6 puede formar su propia dirección sin servidor DHCP: es SLAAC (Stateless Address Autoconfiguration). Solo necesita inventar los 64 bits del interface ID; el método clásico, EUI-64, lo deriva de la MAC. Cambia la MAC y míralo bit a bit:

④ SLAAC / EUI-64 — de la MAC a la dirección IPv6

1 · Partir la MAC en dos mitades e insertar FF:FE en medio
00OUI
1a
2b
ffinsertado
feinsertado
3cNIC
4d
5e
2 · Invertir el 7º bit (U/L) del primer byte
MAC: 0000000000
→ flip bit U/L →
EUI-64: 0200000010

El bit U/L marca si la MAC es universal (0, asignada de fábrica) o local (1). EUI-64 lo invierte por convención.

3 · Interface ID y direcciones resultantes
Interface ID (64 bits)021a:2bff:fe3c:4d5e
Link-local (fe80::/64)fe80::021a:2bff:fe3c:4d5e
Global (2001:db8:0:1::/64)2001:db8:0:1:021a:2bff:fe3c:4d5e
Tipo de la link-localsolo válida dentro del enlace

En SLAAC, el host toma el prefijo /64 que anuncia el router (en un RA) y le pega su interface ID para formar la dirección global — sin servidor DHCP. La link-local fe80:: la forma siempre, aun sin router. (Hoy muchos SO usan IIDs aleatorios por privacidad en vez de EUI-64, pero el mecanismo del prefijo + interface ID es el mismo.)

El paquete sigue su viaje

Ya tienes el datagrama IPv6 formado: cabecera base de 40 B, su cadena de extensiones y —si hizo falta— sus fragmentos. Con la dirección destino de 128 bits, el siguiente paso es enrutarlo: los mismos algoritmos de Dijkstra y Bellman-Ford que usa IPv4, ahora sobre RIPng y OSPFv3.

Antes de seguir, repasa el reparto de direcciones en Direccionamiento IPv4 e IPv6. En el laboratorio del curso esto se valida con el Lab N°4 — Enrutamiento estático en IPv6 (GNS3 / eNSP).