SPDY – Speedy de Google

SPDY, conocido como “speedy” es un protocolo creado por google sobre la capa de aplicaciones del modelo de referencia OSI y TCP. Se trata de una capa extra sobre el protocolo TCP/IP  creado por Vint Cerf y Robert Kahn allá por 1973 y 1974.

Aunque todo esto de internet os parezca relativamente moderno, no podemos olvidar que el sistema de transmisión de datos TCP se empezó a construir hace bastante tiempo y se ha ido expandiendo de forma salvaje a lo largo de los últimos años.

Todos los programas, dentro de una red de datos de ordenadores común, utilizan TCP para crear conexiones entre ellos a través de los cuales se envían los flujos de datos garantizando su entrega íntegra y en orden al destinatario además de proporcionar un mecanismo que permite distinguir varias aplicaciones en una misma máquina utilizando diferentes puertos (2¹⁶)

Hasta ahora, el modelo de conexión típico del TCP era el “Three Way Handshake” o negociación en tres pasos. A grandes rasgos (en la wikipedia tenéis el modelo bien explicado), consiste en la creación de un socket entre dos ordenadores que permita el flujo de datos entre ellos. Estos sockets están compuestos por un par de direcciones IP local y remota, un protocolo de transporte y un par de números de puerto local y remoto.

El proceso de negociación es muy simple y, por tanto, rápido y fiable pero actualmente y gracias a las redes de alto ancho de banda, contiene un problema importante al generar latencias en la transmisión, sobre todo cuando enviamos paquetes de pequeño tamaño, ya que la negociación en tres pasos implica abrir y establecer una conexión para cada flujo de datos en el tiempo. Es decir, para enviar un paquete de, por ejemplo, 1500 bytes, tenemos que realizar la secuencia completa de establecimiento de conexión, después enviar el paquete y  cerrar la conexión para luego volver establecer conexión con una nueva negociación de tres pasos y continuar enviando otro paquete diferente de datos.

En este esquema lo clarifico un poco:

three-way-handshake-tcp

 1. El primer ordenador envía la señal. En este momento, el segundo ordenador estaba en modo “escucha”.

2. El ordenador que está en escucha devuelve el reconocimiento al equipo anterior.

3. Ambos equipos establecen la conexión usando los puertos que correspondan según el programa que esté escuchando ese puerto.

4. Se inicia el flujo de datos o transmisión propiamente dicha.

5. Una vez que termina de enviar el flujo, se desconectan a través de un proceso de cuatro pasos.

Si necesitamos volver a enviar otro paquete, se debe establecer una nueva conexión que seguirá todos estos pasos, generando una latencia importante sobre todo cuando los paquetes de datos son pequeños, ya que las cabeceras del HTTP se envían íntegras y sin comprimir cada vez y pueden llegar a tener un tamaño mayor que el propio paquete.

El SPDY

Como complemento al HTTP sobre TCP/IP, google ha presentado lo que han denominado como SPDY y que, en teoría, permite acelerar las conexiones hasta en un 64%.

Esta nueva capa utiliza una sola conexión TCP para manejar varias peticiones HTTP de forma simultánea y concurrente, además de enviar la información cifrada con SSL para aumentar la seguridad en la transmisión. Además, incluye la opción de que el servidor conecte con el cliente en vez de quedar sólo a la espera en escucha.

Por otro lado, al establecer peticiones simultáneas, y según google, se disminuye la cantidad de cabeceras que se envían con lo que estamos minimizando las posibles pérdidas de paquetes en la transmisión, de modo que ahorramos retransmisiones. En la web spdy-whitepaper lo explica con tablas y porcentajes.

Lo más importante, implantar SPDY en mi servidor local

Antes de nada, os diré que hay algunas aplicaciones que no soportan SPDY, con lo que tendréis que hacer pruebas con las mismas antes de pasar a producción cualquier desarrollo que tengáis en mente. Por mi parte, he comprobado que funciona bien un wordpress pero que he tenido problemas con owncloud entrando por https + spdy.

Otra cuestión interesante antes de lanzarnos a instalar el soporte SPDY en local, es añadir un plugin a nuestro firefox que nos indique qué páginas están cargando vía SPDY actualmente (facebook, twitter, google… etc). El plugin está aquí.

 Paso a paso: (toda la información es open, podéis copiar, usar o enviarme cualquier modificación)

mod_spdy para Apache

mod_spdy es un módulo para Apache open-source que añade soporte SPDY a un servidor HTTPD Apache. Ésto permite la carga mucho más rápido y eficiente cuando se usan direcciones de tipo https con navegadores que soporten SPDY.

Descargar los paquetes mod_spdy

Plataformas compatibles

  • CentOS/Fedora (32-bit y 64-bit)
  • Debian/Ubuntu (32-bit y 64-bit)

Requerimientos de Sistema

  • Apache 2.2 (≥2.2.4)
  • Módulo mod_ssl activado

Instalación

La instalación es, a priori, bastante sencilla. Basta con descargar el paquete mod_spdy apropiado para nuestro sistema y versión de la lista que os he mostrado un poco más arriba de este artículo. Para saber qué linux y qué versión tenéis, podéis usar el comando “uname -m” y el comando “lsb_release -a” en una ventana de terminal.

Una vez descargados, para instalar el módulo:

sudo dpkg -i mod-spdy-*.deb
sudo apt-get -f install

Bajo CentOS/Fedora, como root:

yum install at
rpm -U mod-spdy-*.rpm

Activar HTTPS en Apache

El módulo SPDY utiliza HTTPS, con lo que tu servidor deberá tener activado este protocolo.

Para los que nunca han activado https o no recuerdan cómo hacerlo (incluido yo mismo ;)), aquí tenéis un enlace que lo explica de forma sencilla y pasito a pasito: http://www.netstorming.com.ar/2009/06/24/habilitar-https-en-apache/

Comprobar si funciona SPDY en nuestro server

Una vez que se ha instalado mod_spdy, tendrás que reiniciar el servidor Apache:

sudo /etc/init.d/apache2 restart

¡Y listo!. Los únicos problemas que puedes encontrar serán relacionados con los certificados para usar SSL/TLS en tu servidor. Te remito a netstorming, que lo explica bastante bien.

A partir de ahora, cada vez que entres en cualquiera de tus páginas web de tu servidor utilizando HTTPS y un navegador con soporte (Opera, Firefox y Chrome, no he probado con IExplorer), tu sistema negociará vía SPDY.

Referencias:

Wikipedia: http://es.wikipedia.org/wiki/Transmission_Control_Protocol

TCP/IP Guide: http://www.tcpipguide.com/free/t_TCPConnectionEstablishmentProcessTheThreeWayHandsh-3.htm

Speedy Whitepaper: http://www.chromium.org/spdy/spdy-whitepaper

SPDY Indicator para Firefox: https://addons.mozilla.org/es/firefox/addon/spdy-indicator/

Soporte SPDY: http://code.google.com/p/mod-spdy/