HTTP/2 no IIS
de David So
Compatibilidade
Versão | Observações |
---|---|
IIS 10.0 | O suporte a HTTP/2 foi lançado no IIS 10.0 |
IIS 8.5 e versões anteriores | Não havia suporte para HTTP/2 antes do IIS 10.0 |
O que é HTTP/2?
O HTTP/2 é um retrabalho de como a semântica HTTP flui sobre conexões TCP, e o suporte a HTTP/2 está presente no Windows 10 e no Windows Server 2016. O HTTP/2 é uma grande atualização após quase duas décadas de uso do HTTP/1.1 e reduz o impacto da latência e da carga de conexão nos servidores Web.
O principal avanço do HTTP/1.1 foi o uso de conexões persistentes para atender a várias solicitações seguidas. Em HTTP/2, uma conexão persistente pode ser usada para atender a várias solicitações simultâneas. No processo, o HTTP/2 lança vários recursos adicionais que melhoram a eficiência do HTTP na rede.
Uma conexão para várias solicitações
Cada conexão TCP exige uma viagem de ida e volta para configurar. Se você estiver usando criptografia, o handshake TLS levará mais 1-2 viagens de ida e volta. Tudo isso acontece antes que o primeiro byte da primeira resposta seja enviado. Ao reutilizar uma conexão existente, em vez de configurar uma nova, essa sobrecarga pode ser compartilhada por várias solicitações. O HTTP/2 reduz consideravelmente a necessidade de uma solicitação aguardar enquanto uma nova conexão é estabelecida ou esperar que uma conexão existente fique ociosa. Como uma única conexão é multiplexada entre várias solicitações, a solicitação geralmente pode ser enviada imediatamente sem esperar que outras solicitações sejam concluídas.
Compactação de cabeçalho com HPACK
O HTTP dá suporte à compactação de dados há muito tempo. Os cabeçalhos, no entanto, são enviados como texto não compactado, com muita redundância entre as solicitações. (Muitos dos cabeçalhos mais longos são enviados com exatamente o mesmo valor em cada solicitação!) O HTTP/2 lança o HPACK, um esquema de compactação para cabeçalhos HTTP que reduz a redundância entre solicitações.
A compactação ajuda na multiplexação, pois as solicitações ficam menores. Isso permite que os clientes façam várias solicitações nos seus primeiros pacotes em uma conexão, enquanto as janelas de controle de fluxo TCP ainda são pequenas.
Push do servidor
As solicitações são feitas em padrões. Se um cliente solicitar um recurso, o servidor geralmente poderá prever que precisará de outros recursos referenciados na página. No HTTP/1.1, o inlining foi usado para fornecer esses recursos aos clientes como parte da primeira resposta. O inlining tem suas desvantagens – sobretudo, que o recurso embutido não pode ser armazenado em cache para uso em outras páginas em que ele também pode ser referenciado.
O HTTP/2 lança o conceito de "push" – o servidor que responde às solicitações que o cliente ainda não fez, mas prevê que o cliente fará. Isso permite que os servidores continuem oferecendo os benefícios de latência do inlining, mas de uma forma que o cliente possa armazenar em cache e reutilizar em outras páginas.
Como usar o HTTP/2?
Você já deve estar usando! Uma vez que quase todos os navegadores já são compatíveis com o HTTP/2 na versão mais atual, e os dados atuais mostram que mais de 50% dos usuários já estão em navegadores compatíveis com o HTTP/2.
No servidor, o IIS em execução no Windows 10 ou no Windows Server 2016 é compatível com o HTTP/2.
No momento, o IIS é compatível com o HTTP/2 somente sobre TLS. Ao fazer uma conexão HTTPS com um servidor Web que executa o IIS no Windows 10, o HTTP/2 é usado se o cliente e o servidor forem compatíveis. No IIS, implementamos o HTTP/2 da forma mais transparente possível – você não precisa alterar nada no aplicativo para que o HTTP/2 funcione. Determinadas otimizações do HTTP/1.1 (fragmentação de domínio, inlining etc.) não são mais recomendadas no HTTP/2. Portanto, você deve planejar removê-las no futuro.
E o push?
Como o Server Push é um novo recurso no HTTP/2, há novas APIs que você precisa chamar para usufruir dele. Ao chamar a API PushPromise no ASP.NET ou a API HttpDeclarePush de um módulo nativo do IIS, você fornece a URL e os cabeçalhos de solicitação opcionais para a solicitação que você prevê que o cliente fará. Se o push for compatível com a conexão subjacente, duas coisas acontecem:
- Um PUSH_PROMISE é enviado ao cliente para que o cliente possa verificar se o recurso já existe no cache
- Uma nova solicitação é adicionada à fila de solicitações para o recurso enviado por push
Se a conexão subjacente não for compatível com push (push desabilitado pelo cliente ou cliente HTTP/1.1), a chamada não fará nada e retornará êxito, para que você possa chamar a API com segurança sem precisar se preocupar se o push é permitido.
Configurações do IIS
Não há novas configurações do IIS específicas para o HTTP/2.
No Windows Server 2016 Tech Preview, houve uma menção à configuração de uma chave do Registro 'DuoEnabled'. Isso não é mais necessário. Conforme mencionado acima, desde que a configuração do cliente e do servidor seja compatível com o HTTP/2, o IIS usará o HTTP/2 (ou fará fallback para o HTTP/1.1, se não for possível).
Versão do Protocolo de Log
O Log do IIS tem o campo 'Versão do protocolo', que está desativado por padrão. Habilitar este campo é útil se você quiser controlar quais solicitações estão indo via HTTP/2, HTTP/1.1 etc.
Na interface do usuário do Gerenciador de Serviços de Internet, esse campo pode ser encontrado no recurso Log em Selecionar Campos.
Depois de fazer as alterações, clique em Aplicar no painel Ações à direita.
Esta é a saída do arquivo de log de exemplo com o campo Versão do Protocolo habilitado:
#Software: Microsoft Internet Information Services 10.0
#Version: 1.0
#Date: 2015-08-13 18:46:11
#Fields: date time s-ip cs-method cs-uri-stem cs-uri-query s-port cs-username c-ip cs-version cs(User-Agent) cs(Referer) sc-status sc-substatus sc-win32-status time-taken
2015-08-13 18:46:11 ::1 GET / - 443 - ::1 HTTP/2.0 Mozilla/5.0+(Windows+NT+10.0;+WOW64;+Trident/7.0;+Touch;+rv:11.0)+like+Gecko - 200 0 0 391
2015-08-13 18:46:11 ::1 GET /iisstart.png - 443 - ::1 HTTP/2.0 Mozilla/5.0+(Windows+NT+10.0;+WOW64;+Trident/7.0;+Touch;+rv:11.0)+like+Gecko https://localhost/ 200 0 0 100
Passo a Passo de Demonstração do IIS com o HTTP/2
Se você estiver executando o Windows 10, isso pode ser encontrado em Programas e Recursos, Ativar ou desativar recursos do Windows e, em seguida, ativando a caixa de seleção Serviços de Informações da Internet. Se você estiver executando o Windows Server 2016, inicie o Gerenciador do Servidor, Adicionar funções e recursos no painel e selecione Servidor Web (IIS) na lista.
Após a conclusão da instalação, inicie o Gerenciador de Serviços de Internet e crie um certificado autoassinado selecionando a opção Certificados de Servidor na exibição Recursos do servidor. Observe que o uso de um certificado autoassinado neste exemplo é apenas para fins de demonstração/teste (não é recomendado para proteger os sites de produção).
Vá para o Site Padrão e, em Associações, crie uma nova associação TLS com o certificado autoassinado que você acabou de criar.
Inicie o navegador do computador Windows 10 ou Windows Server 2016 e acesse F12 (ou vá para Configurações e habilite Ferramentas para Desenvolvedores F12) e alterne para a guia de Rede. Navegue até
https://localhost
e pronto, você está no HTTP/2!
Quando o HTTP/2 não é compatível?
Em alguns casos, o HTTP/2 não pode ser usado em combinação com outros recursos. Nessas situações, o Windows retornará para o HTTP/1.1 e continuará a transação. Isso pode envolver negociar o HTTP/1.1 durante o handshake ou enviar um código de erro para o cliente instruindo-o a tentar novamente usando uma conexão HTTP/1.1.
- A autenticação do Windows (NTLM/Kerberos/Negotiate) não é compatível com o HTTP/2. Nesse caso, o IIS retornará para o HTTP/1.1.
- Texto não criptografado – conforme mencionado acima, no momento, o IIS só é compatível com o HTTP/2 sobre TLS. Novamente, o IIS retornará para o HTTP/1.1.
- Limitação de largura de banda – O IIS tem um recurso para limitar a largura de banda (no Inetmgr, selecione o site, 'Limites' em Configurar no painel Ação). Isso se aplica ao HTTP/1.1, mas não é imposto para HTTP/2 (continuará sem erros ou limitação de largura de banda).
Para obter mais informações
Confira a palestra Build 2015 sobre HTTP/2 no Windows 10: Navegador, Aplicativos e Servidor Web para obter uma discussão mais detalhada sobre o HTTP/2 e as implementações de cliente e servidor no Windows.
Autores: Mike Bishop, David So (com contribuições e agradecimentos a Rob Trace, Baris Caglar, Nazim Lala)