HTTP/3: Xu hướng mới trong .NET 6 hỗ trợ tốc độ truy cập nhanh hơn

.NET 6 đã bổ sung tính năng hỗ trợ xem trước cho HTTP/3:

  • Trong Kestrel, HTTP.Sys & IIS dùng cho ASP.NET cho các kịch bản máy chủ
  • Trong HttpClient để thực hiện các yêu cầu đi ra
  • Dùng cho gRPC

HTTP/3 là gì và tại sao hỗ trợ quan trọng?

HTTP từ phiên bản 1.1 trước đây chỉ là một giao thức đơn giản: mở kết nối TCP, gửi một tập hợp các tiêu đề qua văn bản rõ ràng và sau đó nhận phản hồi. Yêu cầu có thể được xếp hạng qua cùng một kết nối, nhưng mỗi yêu cầu phải được xử lý theo thứ tự. TLS thêm một số rắc rối bổ sung và một vài lượt tròn để khởi tạo kết nối, nhưng sau khi thiết lập, HTTP được sử dụng theo cùng một cách trên kênh bảo mật.

Khi nhiều trang web yêu cầu mã hóa TLS, và bạn chỉ có thể phục vụ một yêu cầu một lần trên mỗi kết nối với HTTP/1.1, hiệu suất của trang web thường yêu cầu tải xuống nhiều tài nguyên (script, hình ảnh, CSS, phông chữ, v.v.) đã bị hạn chế khi cần nhiều kết nối, mỗi kết nối này có chi phí thiết lập rất cao.

HTTP/2 đã giải quyết vấn đề này bằng cách chuyển sang giao thức nhị phân sử dụng khái niệm framing cho phép nhiều yêu cầu được xử lý cùng một lúc trên cùng một kết nối. Chi phí thiết lập cho TLS chỉ cần trả một lần, sau đó tất cả các yêu cầu có thể xen kẽ trên kết nối duy nhất đó.

Điều này đều tuyệt vời, trừ khi chúng ta đã di động và phần lớn truy cập hiện nay đến từ điện thoại và máy tính bảng sử dụng kết nối Wi-Fi và di động không đáng tin cậy. Mặc dù HTTP/2 cho phép nhiều luồng, tất cả các luồng đều thông qua một kết nối bảo mật TLS, vì vậy nếu một gói TCP bị mất, tất cả các luồng đều bị chặn cho đến khi dữ liệu được khôi phục. Điều này được gọi là vấn đề chặn hàng đầu của đường dẫn.

HTTP/3 giải quyết những vấn đề này bằng cách sử dụng một giao thức kết nối cơ bản mới được gọi là QUIC. QUIC sử dụng UDP và tích hợp TLS, vì vậy nó nhanh hơn trong việc thiết lập các kết nối khi bắt đầu, do thực hiện bắt tay TLS như là một phần của kết nối. Mỗi khung dữ liệu được mã hóa độc lập, vì vậy không còn vấn đề chặn hàng đầu trong trường hợp mất gói dữ liệu. Không giống như TCP, một kết nối QUIC không phụ thuộc vào địa chỉ IP, vì vậy các khách hàng di động có thể di chuyển giữa mạng Wi-Fi và di động, giữ kết nối logic như cũ, tiếp tục tải xuống lâu hơn, v.v.

Xem thêm   DigiFinTech

Trong số các chỉ số mà các trang web và dịch vụ sử dụng, việc theo dõi độ trễ của các kết nối xấu nhất sử dụng P90, P95 hoặc P99 là một điều phổ biến. HTTP/3 đã cho thấy tác động tích cực đối với những con số này, cải thiện trải nghiệm cho người dùng kết nối xấu nhất, ví dụ như Facebook, Snapchat và Google Cloud.

Hỗ trợ QUIC trong .NET

QUIC được thiết kế như một lớp cơ bản cho HTTP/3, nhưng nó cũng có thể được sử dụng bởi các giao thức khác. Nó được thiết kế để hoạt động tốt trên điện thoại di động với khả năng xử lý thay đổi mạng và khả năng khôi phục tốt nếu có mất gói.

.NET sử dụng thư viện MSQuic cho việc triển khai QUIC của nó. Đây là một thư viện mã nguồn mở, đa nền tảng của nhóm Windows networking. Vì lý do đóng gói, nó được bao gồm trong .NET 6 cho Windows, và là một gói riêng lẻ cho Linux.

Một điểm khác biệt quan trọng với QUIC là mã hóa TLS được tích hợp, nên quá trình thiết lập kết nối bao gồm bắt tay TLS. Điều này có nghĩa là thư viện TLS được sử dụng cần cung cấp các API để cho phép loại bắt tay như thế này. Đối với Windows, các API đã được bao gồm trong SChannel / Bcrypt.dll. Đối với Linux, việc này phức tạp hơn một chút – OpenSSL được sử dụng bởi .NET và hầu hết các phần mềm khác trên Linux hiện không bao gồm các API này trong phiên bản của nó. Nhóm OpenSSL đã làm việc chăm chỉ trên OpenSSL 3.0, có một hạn chế cứng để được nộp cho việc chứng nhận FIPS 140-2, vì vậy không thể thêm hỗ trợ trực tiếp cho nó trong OpenSSL 3.0.

Điều này đã tạo ra một vấn đề cho chúng tôi và nhiều người khác đang làm việc với QUIC và HTTP/3. Để cung cấp một giải pháp tạm thời cho đến khi OpenSSL có thể bao gồm hỗ trợ giao diện API cho bắt tay QUIC, Microsoft đã hợp tác với Akamai để tạo ra một nhánh của OpenSSL – QuicTLS – cung cấp các API để kích hoạt bắt tay QUIC. Không giống như các nhánh khác đã tách khỏi OpenSSL theo thời gian, QuicTLS chỉ tạo ra một sự khác biệt tối thiểu so với phiên bản chính của OpenSSL và được đồng bộ với upstream.

Xem thêm   9 tiền vệ hàng đầu trong FIFA Online 3

Gói MSQuic cho Linux được liên kết tĩnh với QuicTLS, vì vậy không cần tải xuống riêng lẻ và quản lý nhiều biến thể của thư viện OpenSSL. Điều này cũng có nghĩa là khi phiên bản chính của OpenSSL bao gồm các API QUIC, gói sẽ được cập nhật để sử dụng những API đó.

Trong .NET 6, chúng tôi không tiết lộ các API QUIC của .NET, mục tiêu là làm cho chúng công khai trong .NET 7. QUIC có thể được sử dụng giống như một socket TCP và không riêng biệt cho HTTP/3, cho nên chúng tôi mong đợi các giao thức khác được xây dựng trên QUIC trong tương lai, chẳng hạn như SMB qua QUIC.

Hỗ trợ HTTP/3 trong .NET 6

Tại thời điểm công bố bài viết này, RFC cho HTTP/3 vẫn chưa hoàn thành, do đó vẫn có thể thay đổi. Chúng tôi đã bao gồm HTTP/3 trong .NET 6 để khách hàng có thể bắt đầu thử nghiệm, nhưng đây là một tính năng xem trước cho .NET 6 – điều này vì nó không đáp ứng các tiêu chuẩn chất lượng của phần còn lại của .NET 6. Có thể có những góc cạnh xấu, và cần phải có sự kiểm tra rộng hơn với các máy chủ và khách hàng khác để đảm bảo khả năng tương thích, đặc biệt là trong các trường hợp cạnh.

Điều kiện tiên quyết

Để sử dụng HTTP/3, yêu cầu cài đặt các phiên bản tiên quyết của MSQuic và các phụ thuộc TLS của nó.

Windows

MsQuic được cài đặt như một phần của .NET 6, nhưng nó cần một phiên bản cập nhật của SSP Schannel cung cấp API TLS, điều này được cung cấp trong các phiên bản gần đây của hệ điều hành.

  • Windows 11 Build 22000 hoặc mới hơn, hoặc Server 2022 RTM

Các phiên bản Windows 11 hiện tại chỉ có sẵn cho Windows Insiders.

Linux

Trên Linux, libmsquic được xuất bản qua kho lưu trữ gói Linux chính thức của Microsoft packages.microsoft.com. Để sử dụng nó, nó phải được thêm vào thủ công. Xem Linux Software Repository for Microsoft Products để biết thêm thông tin về cách cấu hình feeds gói, nó có thể được cài đặt qua trình quản lý gói cho bản phân phối của bạn, ví dụ, trên Ubuntu:

sudo apt install libmsquic=1.9*

Cập nhật: .NET 6 chỉ tương thích với các phiên bản 1.9.x của libmsquic. Libmsquic 2.x không tương thích do các thay đổi phá vỡ. Libmsquic sẽ được cập nhật lên phiên bản 1.9.x khi cần thiết để tích hợp các bản vá bảo mật.

Máy chủ Kestrel

Hỗ trợ máy chủ được bao gồm trong Kestrel. Các tính năng xem trước cần được kích hoạt bằng thuộc tính dự án sau:

<PropertyGroup>
  <EnablePreviewFeatures>True</EnablePreviewFeatures>
</PropertyGroup>

Sau đó, đặt trong các tùy chọn nghe, ví dụ:

public static async Task Main(string[] args)
{
    var builder = WebApplication.CreateBuilder(args);
    builder.WebHost.ConfigureKestrel((context, options) =>
    {
        options.Listen(IPAddress.Any, 5001, listenOptions =>
        {
            // Use HTTP/3
            listenOptions.Protocols = HttpProtocols.Http1AndHttp2AndHttp3;
            listenOptions.UseHttps();
        });
    });
}

Để biết thêm thông tin, xem Use HTTP/3 with the ASP.NET Core Kestrel web server

Xem thêm   Xoilac TV Dev - Trang web xem bóng đá trực tiếp miễn phí

Khách hàng HTTP/3

HttpClient đã được cập nhật để bao gồm hỗ trợ HTTP/3, nhưng nó cần được kích hoạt bằng một cờ thời gian chạy. Bao gồm các dòng sau trong tệp dự án để bật HTTP/3 với HttpClient:

<ItemGroup>
  <RuntimeHostConfigurationOption Include="System.Net.SocketsHttpHandler.Http3Support" Value="true" />
</ItemGroup>

HTTP/3 cần được chỉ định là phiên bản cho yêu cầu:

// See https://aka.ms/new-console-template for more information
using System.Net;

var client = new HttpClient();
client.DefaultRequestVersion = HttpVersion.Version30;
client.DefaultVersionPolicy = HttpVersionPolicy.RequestVersionExact;

var resp = await client.GetAsync("https://localhost:5001/");
var body = await resp.Content.ReadAsStringAsync();
Console.WriteLine($"status: {resp.StatusCode}, version: {resp.Version}, body: {body.Substring(0, Math.Min(100, body.Length))}");

Hỗ trợ HTTP/3 thông qua HTTP.sys và IIS

Trên Windows Server 2022, Http.sys hỗ trợ HTTP/3 khi nó được kích hoạt bằng một khóa đăng ký, và TLS 1.3 phải được kích hoạt (mặc định). Điều này độc lập với việc hỗ trợ của ASP.NET cho HTTP/3, vì giao thức HTTP được xử lý bởi HTTP.sys trong cấu hình này – do đó nó áp dụng không chỉ cho ASP.NET mà còn cho bất kỳ nội dung hoặc dịch vụ nào được cung cấp bởi HTTP.sys. Xem bài viết này từ nhóm Windows networking để biết thêm thông tin.

gRPC với HTTP/3

gRPC là cơ chế RPC sử dụng định dạng tuần tự protobuf. gRPC thông thường sử dụng HTTP/2 làm giao vận. HTTP/3 sử dụng cùng cấu trúc ngữ nghĩa nên không cần thay đổi nhiều để làm việc. gRPC qua HTTP/3 chưa phải là tiêu chuẩn, và được đề xuất bởi nhóm .NET.

Mã sau đây dựa trên ví dụ greeter, với file proto hello world.

Hai dự án máy chủ và khách hàng đều yêu cầu việc kích hoạt tính năng xem trước tương ứng trong các dự án của họ như các ví dụ ở trên.

Máy chủ ASP.NET

var builder = WebApplication.CreateBuilder(args);

// Add services to the container.
builder.Services.AddGrpc();

builder.WebHost.ConfigureKestrel((context, options) =>
{
    options.Listen(IPAddress.Any, 5001, listenOptions =>
    {
        listenOptions.Protocols = HttpProtocols.Http3;
        listenOptions.UseHttps();
    });
});

var app = builder.Build();

// Configure the HTTP request pipeline.
if (app.Environment.IsDevelopment())
{
    app.UseDeveloperExceptionPage();
}

app.MapGrpcService<GreeterService>();

app.MapGet("/", () =>
{
    return "Communication with gRPC endpoints must be made through a gRPC client. " +
        "To learn how to create a client, visit: https://go.microsoft.com/fwlink/?linkid=2086909";
});

app.Run();

Khách hàng

using Grpc.Net.Client;
using GrpcService1;
using System.Net;

var httpClient = new HttpClient();
httpClient.DefaultRequestVersion = HttpVersion.Version30;
httpClient.DefaultVersionPolicy = HttpVersionPolicy.RequestVersionExact;

var channel = GrpcChannel.ForAddress("https://localhost:5001", new GrpcChannelOptions()
{
    HttpClient = httpClient
});

var client = new Greeter.GreeterClient(channel);
var response = await client.SayHelloAsync(new HelloRequest { Name = "World" });
Console.WriteLine(response.Message);

Hỗ trợ trên macOS

.NET 6 không bao gồm hỗ trợ cho HTTP/3 trên macOS, chủ yếu là do thiếu giao diện API TLS tương thích với QUIC. .NET sử dụng SecureTransport trên macOS cho việc triển khai TLS của nó, mà hiện chưa bao gồm các giao diện TLS để hỗ trợ bắt tay QUIC. Trong khi chúng tôi có thể sử dụng OpenSSL, chúng tôi cho rằng tốt hơn để không đưa ra một phụ thuộc thêm không được tích hợp với quản lý chứng chỉ của hệ điều hành.

Tiến lên phía trước

Chúng tôi sẽ đầu tư sâu hơn vào QUIC và HTTP/3 trong .NET 7, vì vậy hãy mong đợi thấy các tính năng cập nhật trong các bản xem trước.

Related Posts

Captain America tiết lộ là Hydra: điều gì đã xảy ra?

Captain America tiết lộ là Hydra: điều gì đã xảy ra?

Những cú sốc trong truyện tranh Captain America: Steve Rogers Đọc tin tức này, chắc hẳn bạn cũng sẽ ngạc nhiên và không thể tin được. Trong…

FO4VN ─ Dr. Araujo: Cố vấn khoa học của Hiệp hội Nha khoa Hoa Kỳ

FO4VN ─ Dr. Araujo: Cố vấn khoa học của Hiệp hội Nha khoa Hoa Kỳ

Với sự chào đón nồng ấm, Hiệp hội Nha khoa Hoa Kỳ (ADA) đã chào đón bác sĩ Marcelo W.B. Araujo, DDS, MS, PhD với vai trò…

Chè Đậu Đen - Món tráng miệng Đậu Đen thơm ngon của Việt Nam

Chè Đậu Đen – Món tráng miệng Đậu Đen thơm ngon của Việt Nam

Chè Đậu Đen – một món tráng miệng rất phổ biến với đậu đen tại Việt Nam. Bạn có thể thưởng thức nó nóng trong những ngày…

MAD Lions KOI - Đội tuyển Tây Ban Nha gây sốt trong thế giới Game LMHT

MAD Lions KOI – Đội tuyển Tây Ban Nha gây sốt trong thế giới Game LMHT

MAD Lions KOI là một nhóm LMHT Tây Ban Nha thành lập vào năm 2017 bởi Jorge Schnura và Marcos Eguillor. Đội này đã được OverActive Media…

Dplus ─ Nhà tài trợ đội eSports hàng đầu Hàn Quốc

Dplus ─ Nhà tài trợ đội eSports hàng đầu Hàn Quốc

Dplus (trước đây được biết đến với tên gọi DWG KIA và DAMWON Gaming) là một tổ chức eSports Hàn Quốc. Hiện nay, họ đang thi đấu…

Vững bước hành trình...chàng trung vệ Per Mertesacker vượt qua khó khăn để trở thành nhà vô địch World Cup

Vững bước hành trình…chàng trung vệ Per Mertesacker vượt qua khó khăn để trở thành nhà vô địch World Cup

Đánh giá sách bởi ERIC BROWN Per Mertesacker đã từng được cha mình bác bỏ cơ hội trở thành một cầu thủ bóng đá chuyên nghiệp khi…