Sử dụng HTTP/3 với máy chủ web Kestrel trong ASP.NET Core
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:
- Là phiên bản mới nhất của Giao thức Truyền tải Siêu văn bản (Hypertext Transfer Protocol).
- Xây dựng dựa trên điểm mạnh của
HTTP/2trong khi giải quyết một số hạn chế của nó, đặc biệt về hiệu suất (performance), độ trễ (latency), độ tin cậy (reliability) và bảo mật (security).
| Tính năng | HTTP/2 | HTTP/3 |
|---|---|---|
| Giao thức vận chuyển | Sử dụng TCP | Sử dụng QUIC |
| Thiết lập kết nối | Chậm hơn do TCP + TLS | Kế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óa | TLS qua TCP | TLS tích hợp trong QUIC |
Những điểm khác biệt chính từ HTTP/2 đến HTTP/3:
- Giao thức vận chuyển:
HTTP/3sử dụng QUIC thay vì TCP. QUIC cung cấp hiệu suất cải thiện, độ trễ thấp hơn, và độ tin cậy tốt hơn, đặc biệt trên mạng di động và mạng hay mất gói tin. - Head-of-Line Blocking:
HTTP/2có thể gặp phải head-of-line blocking ở cấp TCP, khi độ trễ trong một luồng (stream) có thể ảnh hưởng đến các luồng khác.HTTP/3với QUIC cung cấp các luồng độc lập, vì vậy mất gói tin trong một luồng không làm ngưng trệ các luồng khác. - Thiết lập kết nối:
HTTP/3với QUIC có thể thiết lập kết nối nhanh hơn vì nó kết hợp quá trình bắt tay vận chuyển và mã hóa. - Mã hóa:
HTTP/3yêu cầu mã hóa TLS 1.3, cung cấp bảo mật nâng cao theo mặc định, trong khi đây là tùy chọn trongHTTP/2. - Multiplexing (ghép kênh): Trong khi cả hai đều hỗ trợ multiplexing, việc triển khai của
HTTP/3với QUIC hiệu quả hơn và tránh được các vấn đề head-of-line blocking ở cấp TCP. - Di chuyển kết nối: QUIC trong
HTTP/3cho phép kết nối tồn tại ngay cả khi địa chỉ IP của client thay đổi (như chuyển từ Wi-Fi sang mạng di động), cải thiện trải nghiệm người dùng trên thiết bị di động.
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
- Windows 11 Build 22000 trở lên HOẶC Windows Server 2022.
- Kết nối TLS 1.3 trở lên.
Linux
- Gói
libmsquicđã được cài đặt.
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:
- Thêm kho lưu trữ
packages.microsoft.com. Xem Linux Software Repository for Microsoft Products để biết hướng dẫn. - Cài đặt gói
libmsquicbằ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.
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 để:
- Sử dụng HTTP/3 cùng với HTTP/1.1 và HTTP/2 bằng cách chỉ định
HttpProtocols.Http1AndHttp2AndHttp3. - Bật HTTPS bằng
UseHttps. HTTP/3 yêu cầu HTTPS.
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.
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ọn | Mặc định | Mô tả |
|---|---|---|
MaxBidirectionalStreamCount | 100 | Số lượng tối đa các luồng hai chiều đồng thời trên mỗi kết nối. |
MaxUnidirectionalStreamCount | 10 | Số 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. |
MaxReadBufferSize | 1024 * 1024 (1 MB) | Kích thước bộ đệm đọc tối đa tính bằng byte. |
MaxWriteBufferSize | 64 * 1024 (64 KB) | Kích thước bộ đệm ghi tối đa tính bằng byte. |
Backlog | 512 | Độ dài tối đa của hàng đợi kết nối đang chờ. |
DefaultStreamErrorCode | 0x010c (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. |
DefaultCloseErrorCode | 0x100 (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
- Trình duyệt không hỗ trợ self-signed certificate (chứng chỉ tự ký) trên HTTP/3, chẳng hạn như Kestrel development certificate (chứng chỉ phát triển).
- Sử dụng
HttpClientđể kiểm thử trên localhost/loopback trong .NET 6 trở lên. Cần thêm cấu hình khi sử dụngHttpClientđể tạo yêu cầu HTTP/3: - Đặt
HttpRequestMessage.Versionthành 3.0, hoặc - Đặt
HttpRequestMessage.VersionPolicythànhHttpVersionPolicy.RequestVersionOrHigher.
Để 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:
- Thời gian phản hồi nhanh hơn cho yêu cầu đầu tiên. QUIC và HTTP/3 thương lượng kết nối trong ít lần round-trip (khứ hồi) hơn giữa client và server. Yêu cầu đầu tiên đến server nhanh hơn.
- Trải nghiệm cải thiện khi có mất gói tin kết nối. HTTP/2 ghép kênh nhiều yêu cầu qua một kết nối TCP. Mất gói tin trên kết nối ảnh hưởng đến tất cả các yêu cầu. Vấn đề này được gọi là "head-of-line blocking". Vì QUIC cung cấp multiplexing (ghép kênh) gốc, các gói tin bị mất chỉ ảnh hưởng đến các yêu cầu có dữ liệu bị mất.
- Hỗ trợ chuyển đổi giữa các mạng. Tính năng này hữu ích cho thiết bị di động, nơi thường xuyên chuyển đổi giữa mạng WIFI và mạng di động khi thiết bị di chuyển. Hiện tại các kết nối HTTP/1.1 và HTTP/2 bị lỗi khi chuyển đổi mạng. HTTP/3 cho phép ứng dụng hoặc trình duyệt web tiếp tục liền mạch khi mạng thay đổi.