Menggunakan HTTP/3 dengan server web ASP.NET Core Kestrel

Catatan

Ini bukan versi terbaru dari artikel ini. Untuk rilis saat ini, lihat versi .NET 8 dari artikel ini.

Penting

Informasi ini berkaitan dengan produk pra-rilis yang mungkin dimodifikasi secara substansial sebelum dirilis secara komersial. Microsoft tidak memberikan jaminan, tersirat maupun tersurat, sehubungan dengan informasi yang diberikan di sini.

Untuk rilis saat ini, lihat versi .NET 8 dari artikel ini.

HTTP/3 adalah standar yang disetujui dan versi utama HTTP ketiga. Artikel ini membahas persyaratan untuk HTTP/3. HTTP/3 didukung penuh di ASP.NET Core 7.0 dan yang lebih baru.

Penting

Aplikasi yang dikonfigurasi untuk memanfaatkan HTTP/3 harus dirancang untuk juga mendukung HTTP/1.1 dan HTTP/2.

Persyaratan HTTP/3

HTTP/3 memiliki persyaratan yang berbeda tergantung pada sistem operasi. Jika platform yang Kestrel berjalan tidak memiliki semua persyaratan untuk HTTP/3, maka platform dinonaktifkan, dan Kestrel akan kembali ke protokol HTTP lainnya.

Windows

  • Windows 11 Build 22000 atau yang lebih baru ATAU Windows Server 2022.
  • Koneksi TLS 1.3 atau yang lebih baru.

Linux

  • libmsquic paket terinstal.

libmsquic diterbitkan melalui repositori paket Linux resmi Microsoft di packages.microsoft.com. Untuk menginstal paket ini:

  1. packages.microsoft.com Tambahkan repositori. Lihat Repositori Perangkat Lunak Linux untuk Produk Microsoft untuk petunjuknya.
  2. libmsquic Instal paket menggunakan manajer paket distro. Misalnya, apt install libmsquic=1.9* pada Ubuntu.

Catatan: .NET 6 hanya kompatibel dengan libmsquic versi 1.9.x. Libmsquic 2.x tidak kompatibel karena perubahan yang melanggar. Libmsquic menerima pembaruan ke 1.9.x saat diperlukan untuk menggabungkan perbaikan keamanan.

macOS

HTTP/3 saat ini tidak didukung di macOS dan mungkin tersedia dalam rilis mendatang.

Memulai

HTTP/3 tidak diaktifkan secara default. Tambahkan konfigurasi ke Program.cs untuk mengaktifkan HTTP/3.

var builder = WebApplication.CreateBuilder(args);

builder.WebHost.ConfigureKestrel((context, options) =>
{
    options.ListenAnyIP(5001, listenOptions =>
    {
        listenOptions.Protocols = HttpProtocols.Http1AndHttp2AndHttp3;
        listenOptions.UseHttps();
    });
});

Kode sebelumnya mengonfigurasi port 5001 untuk:

  • Gunakan HTTP/3 bersama HTTP/1.1 dan HTTP/2 dengan menentukan HttpProtocols.Http1AndHttp2AndHttp3.
  • Aktifkan HTTPS dengan UseHttps. HTTP/3 memerlukan HTTPS.

Karena tidak semua router, firewall, dan proksi mendukung HTTP/3 dengan benar, HTTP/3 harus dikonfigurasi bersama dengan HTTP/1.1 dan HTTP/2. Ini dapat dilakukan dengan menentukan HttpProtocols.Http1AndHttp2AndHttp3 sebagai protokol yang didukung titik akhir.

Untuk informasi selengkapnya, lihat Mengonfigurasi titik akhir untuk server web ASP.NET CoreKestrel.

Alt-svc

HTTP/3 ditemukan sebagai peningkatan dari HTTP/1.1 atau HTTP/2 melalui alt-svc header. Itu berarti permintaan pertama biasanya akan menggunakan HTTP/1.1 atau HTTP/2 sebelum beralih ke HTTP/3. Kestrel secara otomatis menambahkan alt-svc header jika HTTP/3 diaktifkan.

Pengujian localhost

Manfaat HTTP/3

HTTP/3 menggunakan semantik yang sama dengan HTTP/1.1 dan HTTP/2: metode permintaan, kode status, dan bidang pesan yang sama berlaku untuk semua versi. Perbedaannya ada di transportasi yang mendasar. HTTP/1.1 dan HTTP/2 menggunakan TCP sebagai transportasinya. HTTP/3 menggunakan teknologi transportasi baru yang dikembangkan bersama HTTP/3 yang disebut QUIC.

HTTP/3 dan QUIC memiliki sejumlah manfaat dibandingkan dengan HTTP/1.1 dan HTTP/2:

  • Waktu respons yang lebih cepat dari permintaan pertama. QUIC dan HTTP/3 menegosiasikan koneksi dalam lebih sedikit perjalanan pulang-pergi antara klien dan server. Permintaan pertama mencapai server lebih cepat.
  • Pengalaman yang ditingkatkan ketika ada kehilangan paket koneksi. Multipleks HTTP/2 beberapa permintaan melalui satu koneksi TCP. Kehilangan paket pada koneksi memengaruhi semua permintaan. Masalah ini disebut "pemblokiran head-of-line". Karena QUIC menyediakan multiplexing asli, paket yang hilang hanya berdampak pada permintaan di mana data telah hilang.
  • Mendukung transisi antar jaringan. Fitur ini berguna untuk perangkat seluler di mana umumnya untuk beralih antara WIFI dan jaringan seluler sebagai lokasi perubahan perangkat seluler. Saat ini, koneksi HTTP/1.1 dan HTTP/2 gagal dengan kesalahan saat beralih jaringan. Aplikasi atau browser web harus mencoba kembali permintaan HTTP yang gagal. HTTP/3 memungkinkan aplikasi atau browser web untuk melanjutkan dengan mulus saat jaringan berubah. Kestrel tidak mendukung transisi jaringan di .NET 8. Ini mungkin tersedia dalam rilis mendatang.

HTTP/3 adalah standar yang diusulkan dan versi utama HTTP ketiga. Artikel ini membahas persyaratan untuk HTTP/3. HTTP/3 didukung penuh di ASP.NET Core 7.0 dan yang lebih baru.

Penting

Aplikasi yang dikonfigurasi untuk memanfaatkan HTTP/3 harus dirancang untuk juga mendukung HTTP/1.1 dan HTTP/2.

Persyaratan HTTP/3

HTTP/3 memiliki persyaratan yang berbeda tergantung pada sistem operasi. Jika platform yang Kestrel berjalan tidak memiliki semua persyaratan untuk HTTP/3 maka dinonaktifkan, dan Kestrel akan kembali ke protokol HTTP lainnya.

Windows

  • Windows 11 Build 22000 atau yang lebih baru ATAU Windows Server 2022.
  • Koneksi TLS 1.3 atau yang lebih baru.

Linux

  • libmsquic paket terinstal.

libmsquic diterbitkan melalui repositori paket Linux resmi Microsoft di packages.microsoft.com. Untuk menginstal paket ini:

  1. packages.microsoft.com Tambahkan repositori. Lihat Repositori Perangkat Lunak Linux untuk Produk Microsoft untuk petunjuknya.
  2. libmsquic Instal paket menggunakan manajer paket distro. Misalnya, apt install libmsquic=1.9* pada Ubuntu.

Catatan: .NET 6 hanya kompatibel dengan libmsquic versi 1.9.x. Libmsquic 2.x tidak kompatibel karena perubahan yang melanggar. Libmsquic menerima pembaruan ke 1.9.x saat diperlukan untuk menggabungkan perbaikan keamanan.

macOS

HTTP/3 saat ini tidak didukung di macOS dan mungkin tersedia dalam rilis mendatang.

Memulai

HTTP/3 tidak diaktifkan secara default. Tambahkan konfigurasi ke Program.cs untuk mengaktifkan HTTP/3.

var builder = WebApplication.CreateBuilder(args);

builder.WebHost.ConfigureKestrel((context, options) =>
{
    options.ListenAnyIP(5001, listenOptions =>
    {
        listenOptions.Protocols = HttpProtocols.Http1AndHttp2AndHttp3;
        listenOptions.UseHttps();
    });
});

Kode sebelumnya mengonfigurasi port 5001 untuk:

  • Gunakan HTTP/3 bersama HTTP/1.1 dan HTTP/2 dengan menentukan HttpProtocols.Http1AndHttp2AndHttp3.
  • Aktifkan HTTPS dengan UseHttps. HTTP/3 memerlukan HTTPS.

Karena tidak semua router, firewall, dan proksi mendukung HTTP/3 dengan benar, HTTP/3 harus dikonfigurasi bersama dengan HTTP/1.1 dan HTTP/2. Ini dapat dilakukan dengan menentukan HttpProtocols.Http1AndHttp2AndHttp3 sebagai protokol yang didukung titik akhir.

Untuk informasi selengkapnya, lihat Mengonfigurasi titik akhir untuk server web ASP.NET CoreKestrel.

Alt-svc

HTTP/3 ditemukan sebagai peningkatan dari HTTP/1.1 atau HTTP/2 melalui alt-svc header. Itu berarti permintaan pertama biasanya akan menggunakan HTTP/1.1 atau HTTP/2 sebelum beralih ke HTTP/3. Kestrel secara otomatis menambahkan alt-svc header jika HTTP/3 diaktifkan.

Pengujian localhost

Manfaat HTTP/3

HTTP/3 menggunakan semantik yang sama dengan HTTP/1.1 dan HTTP/2: metode permintaan, kode status, dan bidang pesan yang sama berlaku untuk semua versi. Perbedaannya ada di transportasi yang mendasar. HTTP/1.1 dan HTTP/2 menggunakan TCP sebagai transportasinya. HTTP/3 menggunakan teknologi transportasi baru yang dikembangkan bersama HTTP/3 yang disebut QUIC.

HTTP/3 dan QUIC memiliki sejumlah manfaat dibandingkan dengan HTTP/1.1 dan HTTP/2:

  • Waktu respons yang lebih cepat dari permintaan pertama. QUIC dan HTTP/3 menegosiasikan koneksi dalam lebih sedikit perjalanan pulang-pergi antara klien dan server. Permintaan pertama mencapai server lebih cepat.
  • Pengalaman yang ditingkatkan ketika ada kehilangan paket koneksi. Multipleks HTTP/2 beberapa permintaan melalui satu koneksi TCP. Kehilangan paket pada koneksi memengaruhi semua permintaan. Masalah ini disebut "pemblokiran head-of-line". Karena QUIC menyediakan multiplexing asli, paket yang hilang hanya berdampak pada permintaan di mana data telah hilang.
  • Mendukung transisi antar jaringan. Fitur ini berguna untuk perangkat seluler di mana umumnya untuk beralih antara WIFI dan jaringan seluler sebagai lokasi perubahan perangkat seluler. Saat ini koneksi HTTP/1.1 dan HTTP/2 gagal dengan kesalahan saat beralih jaringan. Aplikasi atau browser web harus mencoba kembali permintaan HTTP yang gagal. HTTP/3 memungkinkan aplikasi atau browser web untuk melanjutkan dengan mulus saat jaringan berubah. Kestrel tidak mendukung transisi jaringan di .NET 6. Ini mungkin tersedia dalam rilis mendatang.

HTTP/3 adalah versi utama HTTP ketiga dan yang akan datang. Artikel ini membahas persyaratan untuk HTTP/3 dan cara mengonfigurasi Kestrel untuk menggunakannya.

Penting

HTTP/3 tersedia di .NET 6 sebagai fitur pratinjau. Spesifikasi HTTP/3 tidak diselesaikan dan masalah perilaku atau performa mungkin ada di HTTP/3 dengan .NET 6.

Untuk informasi selengkapnya tentang dukungan fitur pratinjau, lihat bagian pratinjau fitur yang didukung.

Aplikasi yang dikonfigurasi untuk memanfaatkan HTTP/3 harus dirancang untuk juga mendukung HTTP/1.1 dan HTTP/2. Jika masalah diidentifikasi dalam HTTP/3, sebaiknya nonaktifkan HTTP/3 hingga masalah diselesaikan dalam rilis ASP.NET Core di masa mendatang. Masalah signifikan dilaporkan di repositori GitHub Pengumuman.

Persyaratan HTTP/3

HTTP/3 memiliki persyaratan yang berbeda tergantung pada sistem operasi. Jika platform yang Kestrel berjalan tidak memiliki semua persyaratan untuk HTTP/3 maka dinonaktifkan, dan Kestrel akan kembali ke protokol HTTP lainnya.

Windows

  • Windows 11 Build 22000 atau yang lebih baru ATAU Windows Server 2022.
  • Koneksi TLS 1.3 atau yang lebih baru.

Linux

  • libmsquic paket terinstal.

libmsquic diterbitkan melalui repositori paket Linux resmi Microsoft di packages.microsoft.com. Untuk menginstal paket ini:

  1. packages.microsoft.com Tambahkan repositori. Lihat Repositori Perangkat Lunak Linux untuk Produk Microsoft untuk petunjuknya.
  2. libmsquic Instal paket menggunakan manajer paket distro. Misalnya, apt install libmsquic=1.9* pada Ubuntu.

Catatan: .NET 6 hanya kompatibel dengan libmsquic versi 1.9.x. Libmsquic 2.x tidak kompatibel karena perubahan yang melanggar. Libmsquic menerima pembaruan ke 1.9.x saat diperlukan untuk menggabungkan perbaikan keamanan.

macOS

HTTP/3 saat ini tidak didukung di macOS dan mungkin tersedia dalam rilis mendatang.

Memulai

HTTP/3 tidak diaktifkan secara default. Tambahkan konfigurasi ke Program.cs untuk mengaktifkan HTTP/3.

var builder = WebApplication.CreateBuilder(args);

builder.WebHost.ConfigureKestrel((context, options) =>
{
    options.ListenAnyIP(5001, listenOptions =>
    {
        listenOptions.Protocols = HttpProtocols.Http1AndHttp2AndHttp3;
        listenOptions.UseHttps();
    });
});

Kode sebelumnya mengonfigurasi port 5001 untuk:

  • Gunakan HTTP/3 bersama HTTP/1.1 dan HTTP/2 dengan menentukan HttpProtocols.Http1AndHttp2AndHttp3.
  • Aktifkan HTTPS dengan UseHttps. HTTP/3 memerlukan HTTPS.

Karena tidak semua router, firewall, dan proksi mendukung HTTP/3 dengan benar, HTTP/3 harus dikonfigurasi bersama dengan HTTP/1.1 dan HTTP/2. Ini dapat dilakukan dengan menentukan HttpProtocols.Http1AndHttp2AndHttp3 sebagai protokol yang didukung titik akhir.

Untuk informasi selengkapnya, lihat Mengonfigurasi titik akhir untuk server web ASP.NET CoreKestrel.

Alt-svc

HTTP/3 ditemukan sebagai peningkatan dari HTTP/1.1 atau HTTP/2 melalui alt-svc header. Itu berarti permintaan pertama biasanya akan menggunakan HTTP/1.1 atau HTTP/2 sebelum beralih ke HTTP/3. Kestrel secara otomatis menambahkan alt-svc header jika HTTP/3 diaktifkan.

Pengujian localhost

  • Browser tidak mengizinkan sertifikat yang ditandatangani sendiri pada HTTP/3 seperti Kestrel sertifikat pengembangan.

  • HttpClient dapat digunakan untuk pengujian localhost/loopback di .NET 6 atau yang lebih baru. Konfigurasi tambahan diperlukan saat menggunakan HttpClient untuk membuat permintaan HTTP/3:

    • Atur HttpRequestMessage.Version ke 3.0, atau
    • Atur HttpRequestMessage.VersionPolicy ke HttpVersionPolicy.RequestVersionOrHigher.

Batasan

Beberapa skenario HTTPS belum didukung untuk HTTP/3 di Kestrel. Saat memanggil Microsoft.AspNetCore.Hosting.ListenOptionsHttpsExtensions.UseHttps dengan HttpsConnectionAdapterOptions saat menggunakan HTTP/3, atur opsi berikut pada HttpsConnectionAdapterOptions adalah no-op (tidak melakukan apa pun):

Memanggil implementasi Microsoft.AspNetCore.Hosting.ListenOptionsHttpsExtensions.UseHttps kesalahan saat menggunakan HTTP/3 berikut:

Manfaat HTTP/3

HTTP/3 menggunakan semantik yang sama dengan HTTP/1.1 dan HTTP/2: metode permintaan, kode status, dan bidang pesan yang sama berlaku untuk semua versi. Perbedaannya ada di transportasi yang mendasar. HTTP/1.1 dan HTTP/2 menggunakan TCP sebagai transportasinya. HTTP/3 menggunakan teknologi transportasi baru yang dikembangkan bersama HTTP/3 yang disebut QUIC.

HTTP/3 dan QUIC memiliki sejumlah manfaat dibandingkan dengan HTTP/1.1 dan HTTP/2:

  • Waktu respons yang lebih cepat dari permintaan pertama. QUIC dan HTTP/3 menegosiasikan koneksi dalam lebih sedikit perjalanan pulang-pergi antara klien dan server. Permintaan pertama mencapai server lebih cepat.
  • Pengalaman yang ditingkatkan ketika ada kehilangan paket koneksi. Multipleks HTTP/2 beberapa permintaan melalui satu koneksi TCP. Kehilangan paket pada koneksi memengaruhi semua permintaan. Masalah ini disebut "pemblokiran head-of-line". Karena QUIC menyediakan multiplexing asli, paket yang hilang hanya berdampak pada permintaan di mana data telah hilang.
  • Mendukung transisi antar jaringan. Fitur ini berguna untuk perangkat seluler di mana umumnya untuk beralih antara WIFI dan jaringan seluler sebagai lokasi perubahan perangkat seluler. Saat ini koneksi HTTP/1.1 dan HTTP/2 gagal dengan kesalahan saat beralih jaringan. Aplikasi atau browser web harus mencoba kembali permintaan HTTP yang gagal. HTTP/3 memungkinkan aplikasi atau browser web untuk melanjutkan dengan mulus saat jaringan berubah. Kestrel tidak mendukung transisi jaringan di .NET 6. Ini mungkin tersedia dalam rilis mendatang.