Nguon: Microsoft Learn · .NET 8.0

Sử dụng HTTP/3 với máy chủ web Kestrel trong ASP.NET Core

Nguồn: Use HTTP/3 with the ASP.NET Core Kestrel web server

HTTP/3 là tiêu chuẩn được phê duyệt và là phiên bản chính thứ ba của HTTP. Bài viết này thảo luận về các yêu cầu cho HTTP/3. HTTP/3 được hỗ trợ đầy đủ trong .NET 7 trở lên.

Quan trọng: Các ứng dụng được cấu hình để tận dụng HTTP/3 cũng nên được thiết kế để hỗ trợ HTTP/1.1 và HTTP/2.

Lợi ích của HTTP/3

HTTP/3:

Tính năngHTTP/2HTTP/3
Giao thức vận chuyểnSử dụng TCPSử dụng QUIC
Thiết lập kết nốiChậm hơn do TCP + TLSKết hợp bắt tay vận chuyển và mã hóa
Head-of-Line Blocking (chặn đầu hàng)Bị ảnh hưởng ở cấp TCPĐược loại bỏ với QUIC stream multiplexing
Mã hóaTLS qua TCPTLS tích hợp trong QUIC

Những điểm khác biệt chính từ HTTP/2 đến HTTP/3:

Yêu cầu HTTP/3

HTTP/3 sử dụng QUIC làm giao thức vận chuyển. Việc triển khai HTTP/3 của ASP.NET Core phụ thuộc vào MsQuic để cung cấp chức năng QUIC. Do đó, hỗ trợ HTTP/3 của ASP.NET Core phụ thuộc vào các yêu cầu nền tảng của MsQuic. Nếu nền tảng mà Kestrel đang chạy không đáp ứng tất cả các yêu cầu cho HTTP/3, thì HTTP/3 sẽ bị tắt và Kestrel sẽ chuyển sang các giao thức HTTP khác.

Windows

Linux

libmsquic được xuất bản qua kho lưu trữ gói Linux chính thức của Microsoft tại packages.microsoft.com. Để cài đặt gói này:

  1. Thêm kho lưu trữ packages.microsoft.com. Xem Linux Software Repository for Microsoft Products để biết hướng dẫn.
  2. Cài đặt gói libmsquic bằng trình quản lý gói của bản phân phối. Ví dụ: apt install libmsquic=1.9* trên Ubuntu.

Lưu ý: .NET 6 chỉ tương thích với phiên bản 1.9.x của libmsquic. Libmsquic 2.x không tương thích do các thay đổi không tương thích ngược (breaking changes). Libmsquic nhận cập nhật cho 1.9.x khi cần thiết để tích hợp các bản vá bảo mật.

macOS

HTTP/3 hiện không được hỗ trợ trên macOS và có thể được hỗ trợ trong bản phát hành tương lai.

Bắt đầu

HTTP/3 không được bật theo mặc định. Thêm cấu hình vào Program.cs để bật HTTP/3.

csharp
var builder = WebApplication.CreateBuilder(args);

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

Đoạn mã trên cấu hình cổng 5001 để:

Vì không phải tất cả các router (bộ định tuyến), firewall (tường lửa) và proxy đều hỗ trợ đúng HTTP/3, hãy cấu hình HTTP/3 cùng với HTTP/1.1 và HTTP/2. Điều này có thể thực hiện bằng cách chỉ định HttpProtocols.Http1AndHttp2AndHttp3 là các protocol được hỗ trợ của endpoint (điểm cuối).

Để biết thêm thông tin, xem Configure endpoints for Kestrel web server.

Cấu hình QuicTransportOptions

Cấu hình tùy chọn QUIC transport (vận chuyển QUIC) bằng cách gọi phương thức extension (mở rộng) UseQuic trên IWebHostBuilder.

csharp
var builder = WebApplication.CreateBuilder(args);

builder.WebHost.UseQuic(options =>
{
#pragma warning disable CA2252 // Using preview features
    options.MaxBidirectionalStreamCount = 200;
#pragma warning restore CA2252
});

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

Bảng sau mô tả các QuicTransportOptions có sẵn:

Tùy chọnMặc địnhMô tả
MaxBidirectionalStreamCount100Số lượng tối đa các luồng hai chiều đồng thời trên mỗi kết nối.
MaxUnidirectionalStreamCount10Số lượng tối đa các luồng một chiều đầu vào đồng thời trên mỗi kết nối.
MaxReadBufferSize1024 * 1024 (1 MB)Kích thước bộ đệm đọc tối đa tính bằng byte.
MaxWriteBufferSize64 * 1024 (64 KB)Kích thước bộ đệm ghi tối đa tính bằng byte.
Backlog512Độ dài tối đa của hàng đợi kết nối đang chờ.
DefaultStreamErrorCode0x010c (H3_REQUEST_CANCELLED)Mã lỗi được sử dụng khi luồng nên hủy bỏ phía đọc hoặc ghi của luồng ở bên trong.
DefaultCloseErrorCode0x100 (H3_NO_ERROR)Mã lỗi được sử dụng khi một kết nối đang mở bị hủy.

Alt-svc

HTTP/3 được phát hiện như một nâng cấp từ HTTP/1.1 hoặc HTTP/2 thông qua header alt-svc. Điều này có nghĩa là yêu cầu đầu tiên thường sẽ sử dụng HTTP/1.1 hoặc HTTP/2 trước khi chuyển sang HTTP/3. Kestrel tự động thêm header alt-svc nếu HTTP/3 được bật.

Kiểm thử trên localhost

Để biết thêm thông tin về cách sử dụng HTTP/3 với HttpClient, xem HTTP/3 with .NET.

Lợi ích của HTTP/3 (so với HTTP/1.1 và HTTP/2)

HTTP/3 sử dụng các ngữ nghĩa giống như HTTP/1.1 và HTTP/2: cùng các phương thức yêu cầu, mã trạng thái và trường tin nhắn áp dụng cho tất cả các phiên bản. Sự khác biệt nằm ở giao thức vận chuyển cơ bản. Cả HTTP/1.1 và HTTP/2 đều sử dụng TCP làm giao thức vận chuyển. HTTP/3 sử dụng công nghệ vận chuyển mới được phát triển cùng với HTTP/3 gọi là QUIC.

HTTP/3 và QUIC có một số lợi ích so với HTTP/1.1 và HTTP/2: