PDF de programación - Introducción a SPDY ¿Futuro HTTP/2.0?

Imágen de pdf Introducción a SPDY ¿Futuro HTTP/2.0?

Introducción a SPDY ¿Futuro HTTP/2.0?gráfica de visualizaciones

Publicado el 16 de Agosto del 2020
505 visualizaciones desde el 16 de Agosto del 2020
802,6 KB
25 paginas
Creado hace 11a (19/11/2012)
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
  • Links de descarga
http://lwp-l.com/pdf18082

Comentarios de: Introducción a SPDY ¿Futuro HTTP/2.0? (0)


No hay comentarios
 

Comentar...

Nombre
Correo (no se visualiza en la web)
Valoración
Comentarios...
CerrarCerrar
CerrarCerrar
Cerrar

Tienes que ser un usuario registrado para poder insertar imágenes, archivos y/o videos.

Puedes registrarte o validarte desde aquí.

Codigo
Negrita
Subrayado
Tachado
Cursiva
Insertar enlace
Imagen externa
Emoticon
Tabular
Centrar
Titulo
Linea
Disminuir
Aumentar
Vista preliminar
sonreir
dientes
lengua
guiño
enfadado
confundido
llorar
avergonzado
sorprendido
triste
sol
estrella
jarra
camara
taza de cafe
email
beso
bombilla
amor
mal
bien
Es necesario revisar y aceptar las políticas de privacidad