Introducción a SPDY
¿Futuro HTTP/2.0?
Publicado bajo Licencia Creative Commons - BY, excepto las
imágenes y logos tomadas de sitios de Internet
Lic. Marcelo Fidel Fernández
http://www.marcelofernandez.info
[email protected]
[email protected]
@fidelfernandez
Agenda
● Características de la web antes y ahora
● HTTP y la Web actual, inconvenientes
● Introducción a SPDY, características
● Ejemplos
● Estado actual y futuro del protocolo
● HTTP/2.0
● Conclusiones Generales
● SPDY dentro del ecosistema Python
En los orígenes de la Web...
● 1991: El servicio de WWW nace y HTTP/0.9 fue
“definido”. Sólo permitía un único método: GET.
● 1996: HTTP/1.0. Se estandarizó la base mínima de
lo que usamos a diario.
● 1997-1999: HTTP/1.1. Se completó el protocolo.
Escalabilidad, proxies, Keep-Alive y Pipelining.
¿Y cómo era la Web en ese entonces?
www.python.org @1997
● Prácticamente de texto, pocas
imágenes, nada de interactividad.
● 60 KB de tamaño promedio [ref]
Fuente: http://www.archive.org
¿Cómo es la Web de Hoy?
Tamaño de página y de peticiones promedio
(2010-2012)
2010: 74 peticiones HTTP
→ más de 80 en 2012
2010: 705 KB
1092 KB
en 2012
→
Fuente: http://www.httparchive.org
¿Cómo es la Web de Hoy?
Ancho de Banda y Latencia (RTT)
PLT
@ 60ms RTT
@ 60ms RTT
@ 5 Mbps
@ 5 Mbps
Fuente: http://www.belshe.com/2010/05/24/more-bandwidth-doesnt-matter-much/
“Cascada” HTTP - ww.python.org.ar
(18 + 3 requests, ~336 KB, 3.1 seg = ~100 KB/seg)
Recursos del mismo “origen”
obtenidos del parseo del
HTML + CSS + JS
6 Peticiones
Concurrentes
Máx. x Origen
Keep-Alive
Cascada
HTTP y la Web actual
● El RTT es determinante en el tiempo de carga de
la página en HTTP.
● Keep-Alive + Pipelining + Múltiples Conexiones !=
Paralelización
● HTTP es un protocolo que obliga a serializar las
peticiones.
● Mucha heurística de optimización de tráfico y
recursos en el browser.
HTTP y la Web actual (cont.)
● Hacks para evitar limitaciones de HTTP
– Domain Sharding
– Recursos inline, minificados, image maps, CSS
sprites
– Ordenamiento, dependencias...
● Headers cada vez más grandes
● TCP fue hecho para conexiones con un tiempo de
vida largo.
● Los browsers usan HTTP sobre TCP con ráfagas
de conexiones.
● Handshake TCP, Slow Start [1][2] y el efecto
Bufferbloat se multiplican por c/conexión.
SPDY
● Desarrollado abiertamente por Google desde
2009, v3 es un RFC desde Febrero 2012.
● Capa 5 OSI. Modifica cómo se lee/escribe el
tráfico HTTP en el socket.
● Toda la semántica de HTTP se mantiene.
● El objetivo es reducir el tiempo de carga de
las páginas web en forma global.
● Lo que hace no es nada novedoso.
SPDY
● Multiplexación del tráfico por una única
conexión TCP persistente.
● Priorización de Streams (“Peticiones”).
● Binario.
● Compresión obligatoria, incluye encabezados.
● Server-Pushed Streams
● En la práctica, se utiliza sobre TLS: Cifrado.
● TLS NPN: Next-Protocol Negotiation
Extension.
SPDY – Frame Types
← 4 Bytes == 32 bits →
Header
8 Bytes
1
Version (15 bits)
Type (16 bits)
Flags (8 bits)
Length (24 bits)
Data associated with Control Frame
Control Frame
← 4 Bytes == 32 bits →
Stream ID (31 bits)
0
Flags (8 bits)
Length (24 bits)
Header
8 Bytes
Upper Layer Data
(HTML, CSS, Javascript, etc.)
Data Frame
SPDY – Control Frames
1 - Syn_Stream
← 4 Bytes == 32 bits →
Header
8 Bytes
Version (15 bits)
Type (16 bits) (1)
Length (24 bits)
Stream ID (31 bits)
1
Flags (8 bits)
X
X
Prio
(3b) Unused
Number of Name/Value pairs (integer 32 bits)
Associated-To Stream ID (31 bits)
Slot
(8b)
1
0
0
0
0
0
3
0x00 0x00 0x52 (82)
1
1
1
0
5
Name/Value
Header Block
(Compressed)
Length of name (integer 32 bits)
Name (Variable String)
Length of Value (integer 32 bits)
Value (Variable String)
… (repeats) ...
7|:method|3|GET|
5|:path|1|/|
8|:version|8|HTTP/1.1|
5|:host|14|www.google.com|
7|:scheme|5|https|...
Representación Teórica y “en el cable”
SPDY – Control Frames
2 - Syn_Reply
← 4 Bytes == 32 bits →
Header
8 Bytes
1
Version (15 bits)
Flags (8 bits)
Type (16 bits) (2)
Length (24 bits)
X
Number of Name/Value pairs (integer 32 bits)
Stream ID (31 bits)
1
0
3
2
0
0x00 0x02 0x2e (558)
1
12
Name/Value
Header Block
(Compressed)
Length of name (integer 32 bits)
Name (Variable String)
Length of Value (integer 32 bits)
Value (Variable String)
… (repeats) ...
7|:status|6|200 OK|
8|:version|8|HTTP/1.1|
5|:date|29|
Tue, 06 Nov 2012 18:47:51 GMT
|12|:content-type|24|
text/html; charset=UTF-8|...
Representación Teórica y “en el cable”
SPDY – Control Frames
3 - Rst_Stream
← 4 Bytes == 32 bits →
Header
8 Bytes
1 Version (15 bits)
Flags (8 bits)
X
Type (16 bits) (3)
Length (24 bits) (8)
Stream ID (31 bits)
Status Code (32 bits)
Status Codes:
● 1: Protocol Error
● 2: Invalid Stream
● 3: Refused Stream
● 4: Unsupported Version
● 5: Cancel
● 6: Internal Error
● 7: Flow Control Error
● 8: Stream In Use
● 9: Stream Already Closed
● 10: Invalid Credentials
● 11: Frame Too Large
SPDY – Control Frames
4 - Settings
← 4 Bytes == 32 bits →
Header
8 Bytes
1 Version (15 bits)
Flags (8 bits)
Type (16 bits) (4)
Length (24 bits) (8)
ID/Value
Pairs
Flags (8 bits)
Number of Entries (32 bits)
ID (24 bits)
Value (32 bits)
… (repeats) ...
Settings IDs available:
● 1: Upload Bandwidth
● 2: Download Bandwidth
● 3: Round Trip Time
● 4: Max Concurrent Streams
● 5: Current Cwd
● 6: Download Retrans Rate
● 7: Initial Windows Size
● 8: Client Certificate Vector Size
SPDY – Control Frames
7 - Goaway y otros
← 4 Bytes == 32 bits →
Header
8 Bytes
Version (15 bits)
1
Flags (8 bits) (0)
X
Type (16 bits) (7)
Length (24 bits) (8)
Last Good Stream ID (31 bits)
Status Code (32 bits)
Status Codes:
● 0: OK
● 1: Protocol Error
● 2: Internal Error
Otros Control Frames:
● 6 – Ping: Medir RTT
● 8 – Headers: Permite intercambiar headers adicionales sobre un stream
● 9 - Window Update: Control de flujo por stream
● 10 – Credentials: Envío de certificados SSL adicionales
Ejemplos
chrome://net-internals/
Python-SPDY Examples
Estado Actual y Futuro de SPDY
● SPDY/3 lanzado en Febrero 2012, SPDY/4 en 2013
● Implementaciones:
– Clientes: Chrome/Chromium, Firefox, Opera y
Android ya soportan SPDY/3.
– Servidores: mod_spdy, nginx, F5, Jetty, HAProxy
– Infraestructura: Google (GAE sobre HTTPS),
Twitter, Wordpress, Akamai, Cloudflare,
Strangeloop….
– Amazon Kindle browser and reverse proxy [ref]
● Interesados: Facebook, Microsoft, libcurl...
HTTP/2.0
● SPDY/3 fue tomado como base para el próximo
HTTP/2.0 en el marco del HTTPbis WG (IETF).
● Mantener los conceptos básicos del protocolo.
● Resta tiempo para definirse (ETA fines de 2014)
● Quedan muchas cosas por definir [0]:
– Headers binarios/compresión? [1][2][3]
– Upgrade o algún otro mecanismo de negociación
– Cifrado y/o TLS obligatorio/opcional/indefinido?
– Server Push? [4]
– Mecanismos de Autenticación [5]
– Proxies, escalabilidad.
Conclusiones Generales
● HTTP/1.1 está mostrando sus años con las
características de los sitios y conexiones actuales.
● Los hacks no escalan y aumentan la complejidad.
● Más del 50% (?) de los usuarios ya soportan SPDY.
● SPDY mejora mucho el rendimiento, pero para
implementarlo bien™ hay que deshackear lo hecho.
● La migración no es painless (aunque podría ser peor).
● Resta mucho software dentro de la arquitectura Web
por construir y estabilizar (Proxys, Load Balancers,
Servers, Firewalls...)
● SPDY todavía está en evolución.
SPDY dentro del ecosistema Python
● Python 3 incorporó muchas cosas necesarias para:
– Hacer más simple el manejo de streams de bytes,
– Conversión desde/hacia bytes desde tipos builtin (3.2)
– SSL y Zlib en particular para SPDY (3.3)
● No hay ningún proyecto serio de infraestructura
de red que planee seriamente soportarlo
(todavía): Twisted, Requests, ¿otros?
● Otros lenguajes están siendo utilizados para
experimentación e implementación y están más
adelantados: Node.js, Ruby, Java, y obviamente
C/C++
Más Links
Para más información, además de los incluidos en
esta presentación, chequear estos links:
● http://www.guypo.com/technical/not-as-spdy-as-you-thought/
● http://www.belshe.com/2012/06/24/followup-to-not-as-spdy-as-you-thought/
● http://webtide.intalio.com/2012/06/spdy-we-push/
● http://bitsup.blogspot.com.ar/2011/09/spdy-what-i-like-about-you.html
● http://bitsup.blogspot.com.ar/2012/08/the-road-to-http2.html
● http://www.igvita.com/2012/10/31/simple-spdy-and-npn-negotiation-with-haproxy/
● https://developers.google.com/speed/articles/tcp_initcwnd_paper.pdf?hl=es-419
● http://research.microsoft.com/apps/pubs/?id=170059
● http://en.wikipedia.org/wiki/Head-of-line_blocking
● https://blogs.akamai.com/2012/10/http20-what-is-it-and-why-should-you-care.html
Charla de Roberto Peon, co-creador de SPDY, en la Google I/O 2012:
● http://www.youtube.com/watch?v=zN5MYf8FtN0
Biblioteca Python-SPDY:
● http://github.com/marcelofernandez/python-spdy
¡Muchas Gracias!
http://www.marcelofernandez.info
[email protected]
[email protected]
@fidelfernandez
Comentarios de: Introducción a SPDY ¿Futuro HTTP/2.0? (0)
No hay comentarios