عنوان:

‫نحوه فعال‌سازی و استفاده از HTTP/3 در HttpClient دات‌نت


نویسنده: وحید نصیری
تاریخ: ۱۴۰۴/۰۱/۳۱ ۱۴:۵۱
آدرس: www.dntips.ir
مقدمه
پروتکل HTTP/3 نسل سوم پروتکل انتقال ابرمتنی (Hypertext Transfer Protocol) است که با هدف بهبود عملکرد و کارایی ارتباطات وب طراحی شده است. برخلاف HTTP/1.1 و HTTP/2 که از TCP به‌عنوان پروتکل انتقال استفاده می‌کنند، HTTP/3 بر پایه QUIC عمل می‌کند، پروتکلی مبتنی بر UDP که ویژگی‌هایی مانند کاهش تأخیر، بهبود مدیریت از دست رفتن بسته‌ها (Packet Loss) و پشتیبانی از تغییر شبکه‌ها را ارائه می‌دهد. این قابلیت‌ها HTTP/3 را به گزینه‌ای جذاب برای توسعه‌دهندگان برنامه‌های مدرن تبدیل کرده است، به‌ویژه در سناریوهایی که سرعت و پایداری اتصال اهمیت دارد.
در اکوسیستم دات‌نت (.NET)، پشتیبانی از HTTP/3 از نسخه .NET 6 به‌صورت پیش‌نمایش (Preview) معرفی شد و در نسخه‌های بعدی مانند .NET 7 و .NET 8 به‌صورت کامل‌تر و پایدارتر در دسترس قرار گرفت.

HTTP/3 و QUIC: مفاهیم پایه
HTTP/3 از همان معناشناسی (Semantics) HTTP/1.1 و HTTP/2 استفاده می‌کند، یعنی روش‌های درخواست (Request Methods)، کدهای وضعیت (Status Codes) و فیلدهای پیام مشابه هستند. تفاوت اصلی در لایه انتقال است. QUIC، که توسط گوگل توسعه یافته و به‌عنوان استاندارد IETF پذیرفته شده، جایگزین TCP شده و ویژگی‌های زیر را ارائه می‌دهد:
  1. کاهش تأخیر: QUIC با ادغام TLS در فرآیند برقراری اتصال، تعداد رفت‌وبرگشت‌ها (Round-Trips) را کاهش می‌دهد، که منجر به پاسخ سریع‌تر برای درخواست اولیه می‌شود.
  2. مدیریت بهتر از دست رفتن بسته‌ها: برخلاف HTTP/2 که در آن از دست رفتن یک بسته تمام درخواست‌های چندگانه (Multiplexed) را تحت تأثیر قرار می‌دهد (مشکل معروف به Head-of-Line Blocking)، QUIC با چندگانه‌سازی بومی (Native Multiplexing) اطمینان می‌دهد که تنها درخواست‌های مرتبط با بسته‌های ازدست‌رفته تحت تأثیر قرار گیرند.
  3. پشتیبانی از تغییر شبکه: QUIC به دستگاه‌های موبایل اجازه می‌دهد تا در هنگام جابه‌جایی بین شبکه‌های Wi-Fi و Cellular، اتصال را حفظ کنند، در حالی که HTTP/1.1 و HTTP/2 در این سناریوها با خطا مواجه می‌شوند.

برای استفاده از HTTP/3 در دات‌نت، نیاز به نصب کتابخانه MsQuic است که قابلیت‌های QUIC را فراهم می‌کند. اگر پلتفرم مورد استفاده الزامات MsQUIC را برآورده نکند، HTTP/3 غیرفعال خواهد بود.

فعال‌سازی HTTP/3 در HttpClient
برای استفاده از HTTP/3 در HttpClient، باید تنظیمات خاصی در پروژه اعمال شود. در .NET 6، HTTP/3 به‌صورت پیش‌نمایش ارائه شده و نیاز به فعال‌سازی صریح دارد. این کار می‌تواند از طریق افزودن یک تنظیم در فایل پروژه یا استفاده از متغیر محیطی انجام شود.
1. فعال‌سازی از طریق فایل پروژه
برای فعال‌سازی HTTP/3، باید گزینه System.Net.SocketsHttpHandler.Http3Support را در فایل پروژه (.csproj) تنظیم کنید:
<ItemGroup>
  <RuntimeHostConfigurationOption Include="System.Net.SocketsHttpHandler.Http3Support" Value="true" />
</ItemGroup>
این تنظیم به HttpClient اجازه می‌دهد تا از HTTP/3 پشتیبانی کند، مشروط بر اینکه پلتفرم الزامات MsQuic را برآورده کند.

2. فعال‌سازی از طریق کد یا متغیر محیطی
به‌طور جایگزین، می‌توانید از System.AppContext.SetSwitch در کد استفاده کنید یا متغیر محیطی DOTNET_SYSTEM_NET_HTTP_SOCKETSHTTPHANDLER_HTTP3SUPPORT را روی true تنظیم کنید:
System.AppContext.SetSwitch("System.Net.SocketsHttpHandler.Http3Support", true);
یا از خط فرمان:
export DOTNET_SYSTEM_NET_HTTP_SOCKETSHTTPHANDLER_HTTP3SUPPORT=true
این روش‌ها انعطاف‌پذیری بیشتری برای سناریوهایی فراهم می‌کنند که نیاز به کنترل دینامیک دارند.

3. فعال‌سازی در .NET 8
در .NET 8، پشتیبانی از HTTP/3 به‌صورت پیش‌فرض بهبود یافته است. می‌توانید با تنظیم ویژگی Http3Enabled در SocketsHttpHandler، HTTP/3 را فعال کنید:
var handler = new SocketsHttpHandler { Http3Enabled = true };
var httpClient = new HttpClient(handler);
این روش ساده‌تر است و نیازی به تنظیمات اضافی در فایل پروژه ندارد.

پیکربندی HttpClient برای استفاده از HTTP/3
پس از فعال‌سازی HTTP/3، باید HttpClient را به‌گونه‌ای پیکربندی کنید که به‌صورت صریح از نسخه HTTP/3 استفاده کند. این کار با تنظیم ویژگی‌های DefaultRequestVersion و DefaultVersionPolicy انجام می‌شود:
using System.Net;

using var client = new HttpClient
{
    DefaultRequestVersion = HttpVersion.Version30,
    DefaultVersionPolicy = HttpVersionPolicy.RequestVersionExact
};

Console.WriteLine("--- localhost:5001 ---");
HttpResponseMessage resp = await client.GetAsync("https://localhost:5001/");
string body = await resp.Content.ReadAsStringAsync();
Console.WriteLine($"status: {resp.StatusCode}, version: {resp.Version}, body: {body.Substring(0, Math.Min(100, body.Length))}");
در این مثال:
  • DefaultRequestVersion روی HttpVersion.Version30 تنظیم شده تا درخواست‌ها به‌صورت پیش‌فرض از HTTP/3 استفاده کنند.
  • DefaultVersionPolicy روی RequestVersionExact تنظیم شده تا اطمینان حاصل شود که فقط HTTP/3 استفاده می‌شود و در صورت عدم پشتیبانی، درخواست با خطا مواجه خواهد شد.

پیکربندی سرور برای پشتیبانی از HTTP/3
برای آزمایش کامل HTTP/3، سرور نیز باید از این پروتکل پشتیبانی کند. در دات‌نت، سرور Kestrel از HTTP/3 پشتیبانی می‌کند. در ادامه، مثالی از پیکربندی Kestrel برای پشتیبانی از HTTP/3 ارائه شده است:
using Microsoft.AspNetCore.Server.Kestrel.Core;
using System.Net;

var builder = WebApplication.CreateBuilder(args);

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

var app = builder.Build();

app.MapGet("/", () => $"The time on the server is {DateTime.Now}");

app.Run();
در این کد:
  • Kestrel برای گوش دادن به پورت 5001 پیکربندی شده و از پروتکل‌های HTTP/2 و HTTP/3 پشتیبانی می‌کند.
  • UseHttps اطمینان می‌دهد که اتصال امن است، زیرا HTTP/3 به TLS نیاز دارد.

ملاحظات و بهترین شیوه‌ها
  1. پشتیبانی پلتفرم: اطمینان حاصل کنید که پلتفرم شما (مانند Windows Server 2022 یا توزیع‌های لینوکس پشتیبانی‌شده) الزامات MsQuic را برآورده می‌کند. برای اطلاعات بیشتر، به مستندات QUIC Platform Dependencies مراجعه کنید.
  2. پشتیبانی از پروتکل‌های قدیمی: از آنجا که همه سرورها و کلاینت‌ها از HTTP/3 پشتیبانی نمی‌کنند، برنامه‌ها باید به‌گونه‌ای طراحی شوند که در صورت عدم دسترسی به HTTP/3، به HTTP/2 یا HTTP/1.1 بازگردند.
  3. آزمایش و اشکال‌زدایی: برای آزمایش HTTP/3، می‌توانید از سرورهای عمومی مانند https://cloudflare-quic.com استفاده کنید. ابزارهایی مانند Wireshark نیز برای تحلیل ترافیک QUIC مفید هستند.
  4. محدودیت‌ها: در .NET 7، قابلیت تغییر شبکه (Network Transition) پشتیبانی نمی‌شود.

مزایای استفاده از HTTP/3 در HttpClient
استفاده از HTTP/3 در HttpClient مزایای زیر را برای برنامه‌های دات‌نت به همراه دارد:
  • عملکرد بهتر: کاهش تأخیر در درخواست‌های اولیه و مدیریت کارآمدتر بسته‌های ازدست‌رفته.
  • انعطاف‌پذیری در سناریوهای موبایل: حفظ اتصال در هنگام تغییر شبکه‌ها.
  • امنیت بهبودیافته: ادغام TLS در QUIC، امنیت را بدون کاهش عملکرد تضمین می‌کند.

نتیجه‌گیری
HTTP/3 با استفاده از QUIC، تحول مهمی در پروتکل‌های وب ایجاد کرده است که توسعه‌دهندگان دات‌نت می‌توانند از آن برای ساخت برنامه‌های سریع‌تر و پایدارتر بهره ببرند. فعال‌سازی و استفاده از HTTP/3 در HttpClient نیازمند درک مفاهیم پایه، پیکربندی صحیح کلاینت و سرور، و توجه به ملاحظات پلتفرم است. با دنبال کردن مراحل شرح داده‌شده در این مقاله، از جمله تنظیم فایل پروژه، پیکربندی HttpClient، و استفاده از Kestrel برای سرور، می‌توانید به‌راحتی HTTP/3 را در پروژه‌های خود پیاده‌سازی کنید.


مشاهده مطلب اصلی