Cabecera HTTP/1.1 Upgrade
# Cabecera HTTP/1.1 Upgrade

HTTP/1.1 introdujo el soporte para el campo de cabecera Upgrade. En el intercambio, el cliente comienza haciendo una petición de texto claro, que es posteriormente actualizada/mejorada (upgraded) a una versión más nueva del protocolo http o cambiada a un protocolo diferente. La actualización (upgrade) de la conexión debe ser solicitada por el cliente, si el servidor quiere imponer un upgrade puede enviar una respuesta "426 upgrade required". El cliente puede entonces enviar una nueva solicitud con las cabeceras upgrade apropiadas.

## Uso con TLS

Un uso posible es comenzar una solicitud en el puerto http normal, pero cambiar a Transport Layer Security (TLS). En la práctica, dicho uso es poco frecuente, siendo el esquema de URL https una forma mucho más común de iniciar http cifrado.

El servidor devuelve un código de estado 426 para alertar a los clientes de versiones anteriores de que el fallo está relacionado con el cliente (los códigos de nivel 400 indican un fallo del cliente: Lista de códigos de estado HTTP).

Este método para establecer una conexión segura es ventajoso debido a que :

* No requiere redirección desordenada y problemática y reescritura de URL en el servidor.
* Permite el alojamiento virtual de sitios web protegidos (aunque HTTPS también permite esto usando Server Name Indication).
* Reduce la posibilidad de confusión del usuario, proporcionando una única forma de acceder a un recurso determinado.

Una desventaja de este método es que el cliente no puede especificar el requisito para HTTP seguro en el URI. Por tanto un ataque Man-in-the-middle puede mantener una conexión sin cifrar y sin autenticar con el cliente mientras mantiene una conexión cifrada con el servidor.

## Uso con WebSockets

WebSocket también utiliza este mecanismo para establecer una conexión con un servidor HTTP de forma compatible. El protocolo de WebSocket tiene dos partes: un apretón de manos (handshake) para establecer la conexión mejorada (upgrade) y, posteriormente, la transferencia real de datos. Primero, un cliente solicita una conexión websocket usando las cabeceras "Upgrade: websocket" y "Connection: Upgrade", junto con algunas cabeceras específicas del protocolo para establecer la versión utilizada y establecer un apretón de manos. El servidor, si es compatible con el protocolo, responde con las mismas cabeceras "Upgrade: websocket" y "Connection: Upgrade" y completa el apretón de manos. Una vez que el apretón de manos se realiza correctamente, se inicia la transferencia de datos.

