HTTP/2 on IIS (HTTP/2 in IIS)

di David So

Compatibilità

Versione Note
IIS 10.0 Il supporto HTTP/2 è stato introdotto in IIS 10.0
IIS 8.5 e versioni precedenti HTTP/2 non è stato supportato prima di IIS 10.0

Che cos'è HTTP/2?

HTTP/2 è una rielaborazione della modalità di flusso della semantica HTTP sulle connessioni TCP e il supporto HTTP/2 è presente in Windows 10 e Windows Server 2016. HTTP/2 è un aggiornamento principale dopo quasi due decenni di utilizzo HTTP/1.1 e riduce l'impatto della latenza e del carico di connessione nei server Web.

L'avanzamento principale di HTTP/1.1 è stato l'uso di connessioni persistenti per il servizio di più richieste in una riga. In HTTP/2 è possibile usare una connessione persistente per il servizio di più richieste simultanee. Nel processo HTTP/2 introduce diverse funzionalità aggiuntive che migliorano l'efficienza di HTTP sulla rete.

Una connessione per più richieste

Ogni connessione TCP richiede un round trip per configurare. Se si usa la crittografia, l'handshake TLS accetta un altro round trip da 1 a 2. Tutto ciò avviene prima che sia possibile inviare il primo byte della prima risposta. Riutilizzando una connessione esistente invece di configurare una nuova, questo sovraccarico può essere condiviso da molte richieste. HTTP/2 riduce notevolmente la necessità di attendere una richiesta mentre viene stabilita una nuova connessione o attendere che una connessione esistente diventi inattiva. Poiché una singola connessione è multiplexed tra molte richieste, la richiesta può in genere essere inviata immediatamente senza attendere il completamento di altre richieste.

Compressione dell'intestazione con HPACK

HTTP ha supportato la compressione dei dati per età. Le intestazioni, tuttavia, vengono inviate come testo non compresso, con molta ridondanza tra le richieste. (Molte delle intestazioni più lunghe vengono inviate esattamente con lo stesso valore in ogni richiesta!) HTTP/2 introduce HPACK, uno schema di compressione per le intestazioni HTTP che riduce la ridondanza tra le richieste.

La compressione consente il multiplexing, perché le richieste sono più piccole. Ciò consente ai client di effettuare molte richieste nei primi pacchetti in una connessione, mentre le finestre di controllo del flusso TCP sono ancora piccole.

Push del server

Le richieste vengono fornite in modelli. Se un client chiede una risorsa, il server può spesso prevedere che sarà necessario fare riferimento ad altre risorse nella pagina. In HTTP/1.1, l'inlining è stato usato per distribuire queste risorse ai client come parte della prima risposta. Inlining presenta gli svantaggi, in particolare, che la risorsa inlined non può essere memorizzata nella cache per l'uso in altre pagine in cui può essere fatto riferimento anche.

HTTP/2 introduce il concetto di "push" : il server che risponde alle richieste che il client non ha ancora effettuato, ma prevede che il client verrà previsto. Ciò consente ai server di continuare a offrire i vantaggi della latenza dell'inlining, ma in un formato che il client può memorizzare nella cache e riutilizzare in altre pagine.

Ricerca per categorie usare HTTP/2?

Potresti essere già! Poiché quasi tutti i browser supportano già HTTP/2 nella versione più recente e i dati correnti mostrano che oltre il 50% degli utenti sono già in browser compatibili con HTTP/2.

Nel server IIS in esecuzione in Windows 10 o Windows Server 2016 supporta HTTP/2.

IIS supporta attualmente SOLO HTTP/2 tramite TLS. Quando si effettua una connessione HTTPS a un server Web che esegue IIS in Windows 10, HTTP/2 viene usato se il client e il server supportano entrambi. In IIS è stato implementato HTTP/2 in modo trasparente: non è necessario modificare nulla nell'applicazione per il funzionamento di HTTP/2. Alcune ottimizzazioni HTTP/1.1 (partizionamento del dominio, inlining e così via) non sono più consigliate in HTTP/2, quindi è consigliabile rimuoverle in futuro.

Che cos'è il push?

Poiché il push del server è una nuova funzionalità in HTTP/2, sono disponibili nuove API che è necessario chiamare per sfruttarla. Quando si chiama l'API PushPromise in ASP.NET o l'API HttpDeclarePush da un modulo nativo IIS, specificare l'URL e le intestazioni di richiesta facoltative per la richiesta che si prevede l'esecuzione del client. Se il push è supportato dalla connessione sottostante, si verificano due cose:

  • Un PUSH_PROMISE viene inviato al client, in modo che il client possa verificare se la risorsa esiste già nella cache
  • Una nuova richiesta viene aggiunta alla coda di richieste per la risorsa push

Se la connessione sottostante non supporta il push (client disabilitato push o client HTTP/1.1), la chiamata non esegue alcuna operazione e restituisce esito positivo, quindi è possibile chiamare in modo sicuro l'API senza dover preoccuparsi di se è consentito il push.

Impostazioni di IIS

Non sono presenti nuove impostazioni di configurazione IIS specifiche per HTTP/2.

In Windows Server 2016 Tech Preview, c'è stata una menzione dell'impostazione di una chiave del Registro di sistema "DuoEnabled". Non è più necessario. Come accennato in precedenza, se non è possibile, la configurazione client e server supporta HTTP/2, IIS userà HTTP/2 (o fallback su HTTP/1.1).

Versione del protocollo di registrazione

La registrazione IIS ha un campo 'Versione protocollo' disattivata per impostazione predefinita. L'abilitazione di questo campo è utile se si desidera tenere traccia delle richieste tramite HTTP/2, HTTP/1.1 e così via.

Nell'interfaccia utente di Internet Services Manager, questa funzionalità è disponibile nella funzionalità Registrazione tramite Seleziona campi.

Immagine della pagina Di registrazione IO S che visualizza l'elenco a discesa Seleziona campi con il trattino Versione C S del protocollo selezionato dal menu Campi di registrazione W 3 C.

Dopo aver apportato le modifiche, fare clic su Applica nel riquadro Azioni a destra.

Ecco l'output del file di log di esempio con il campo Versione protocollo abilitato:

#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

Procedura dettagliata su IIS con HTTP/2 Demo

  1. Se si esegue Windows 10, è possibile trovare questa opzione tramite Programmi e funzionalità, quindi attivare o disattivare le funzionalità di Windows, quindi abilitare la casella di controllo Internet Information Services. Se si esegue Windows Server 2016, avviare Server Manager, quindi aggiungere ruoli e funzionalità nel dashboard e quindi selezionare Server Web (IIS) dall'elenco.

    Immagine di Attivare o disattivare le funzionalità di Windows con Internet Information Services selezionata e evidenziata.

  2. Al termine dell'installazione, avviare Internet Services Manager e creare un certificato autofirmato selezionando l'opzione Certificati server nella visualizzazione Funzionalità del server. Si noti che l'uso di un certificato autofirmato in questo esempio è solo per scopo demo/test (non consigliato per proteggere i siti di produzione).

    Immagine della visualizzazione Funzionalità server nella pagina Service Manager Internet con certificati server evidenziati.

    Immagine della finestra di dialogo per la visualizzazione del nome del certificato autofirmato con l'opzione Crea certificato autofirmato evidenziata.

  3. Passare al sito Web predefinito e in Associazioni creare un nuovo binding TLS con il certificato autofirmato appena creato.

    Screenshot della finestra di dialogo per Aggiungere associazione sito con tipo di indirizzo I P evidenziato e I server I S locale selezionato dall'elenco a discesa.

  4. Avviare il browser dal computer Windows 10 o Windows Server 2016 e premere F12 (o passare a Impostazioni e abilitare Strumenti per sviluppatori F12) e quindi passare alla scheda Rete. Passare a https://localhost e voila, si è in HTTP/2!

    Screenshot del trattino host locale F 12 Developer Tools con scheda Rete visualizzata e H T T P 2 selezionata.

Quando HTTP/2 non è supportato?

In alcuni casi, HTTP/2 non può essere usato in combinazione con altre funzionalità. In queste situazioni, Windows tornerà a HTTP/1.1 e continuerà la transazione. Ciò può comportare la negoziazione HTTP/1.1 durante l'handshake o l'invio di un codice di errore al client che lo indica di riprovare su una connessione HTTP/1.1.

  • autenticazione di Windows (NTLM/Kerberos/Negotiate) non è supportato con HTTP/2. In questo caso IIS verrà restituito a HTTP/1.1.
  • Cancella testo: come indicato in precedenza, IIS supporta attualmente solo HTTP/2 su TLS. Di nuovo, IIS verrà restituito a HTTP/1.1.
  • Limitazione della larghezza di banda: IIS dispone di una funzionalità per limitare la larghezza di banda (in Inetmgr, selezionare il sito , "Limiti" in Configura del riquadro Azioni). Ciò si applica a HTTP/1.1 ma non viene applicato per HTTP/2 (procederà senza errori o limitazione della larghezza di banda).

Ulteriori informazioni

Vedere l'articolo Build 2015 talk HTTP/2 in Windows 10: Browser, Apps e Web Server per una discussione più approfondita sulle implementazioni HTTP/2 e client e server in Windows.

Autori: Mike Vescovo, David So (con contributi da e riconoscimenti a Rob Trace, Baris Caglar, Nazim Lala)