Derinlemesine yazılım eğitimleri için kanalımı takip edebilirsiniz...

.NET 6’da HTTP/3 Desteği

Merhaba,

Bu içeriğimizde .NET 6’da gelen HTTP/3 desteği üzerine bir incelemede bulunuyor olacağız.

.NET 6, HTTP/3 ile Asp.NET için Kestrel, HTTP.Sys ve IIS Sunucu Senaryolarına, HttpClient Request’lerine ve gRPC teknolojisine olmak üzere üç farklı noktada destek getirmiş bulunmaktadır. Herşeyden önce HTTP/3’ün ne olduğuna ve desteklenmesinin önemine temas ederek başlayalım.

HTTP/3 Nedir ve Neden Desteklenmelidir?

HTTP, 1.1 sürümünde nispeten basit ve senkron çalışan bir protokoldü. İstek(request) gönderilir ve sonuç üretildikten sonra cevap(response) alınırdı. HTTP/1.1’de request/response süreçleri tek bir seferlik bağlantı üzerinden gerçekleştirilmekteydi. Haliyle, bir web uygulamasına yapılan istek neticesinde bir çok kaynak dosyası(JavaScript kodları, resim ve css dosyaları, yazı tipleri vs.) için ayrı istekler yapılması gerekmekte ve böylece performans düşüklüğü yaşanmaktaydı.

HTTP/1.1’de ki bu handikaplara, HTTP/2 ile bir bağlantı üzerinden birden fazla isteğin aynı anda işlenebilirliği sağlanarak ikili protokole dönüşüm gerçekleştirilerek çözüm getirildi. Yani request/response sürecindeki bağlantı maliyeti tek seferlik ödenmekte ve ardından tüm request’ler bu tek bağlantı üzerinden işlenerek her birine karşı ayrı response’lar alınabilmektedir.

.NET 6'da HTTP/3 Desteği

HTTP/1.1 ile HTTP/2 arasındaki request/response süreçlerindeki davranış modeli…


.NET 6'da HTTP/3 Desteği

HTTP/1.1 ile HTTP/2 arasındaki performans farkı…

Bu harika gelişmeyi, günümüzde mobil cihazların kullanımının artması ve güvenilmez Wi-Fi bağlantıların kullanılması sayesinde yaşanan türlü problemler seyretti. HTTP/2, önceki sürümün birçok sorununu çözse de, esas olarak temeldeki TCP protokolünden kaynaklanan büyük bir sorunla baş edemedi.

HTTP/2, güvenli haberleşmeden sorumlu olan TLS(Transport Layer Security) protokolü üzerinde çalışan bir protokoldür. Haliyle HTTP/2, TCP protokolünü kullanarak veri iletimini gerçekleştirirken güvenlik amaçlı HTTPS kullanılıyorsa burada TLS protokolünün de kullanılması zorunluluğu mevcuttur. İşte bu durumda TCP’nin dışında TLS’de ayrı bir bağlantı gerektirdiği için belirli bir gecikme söz konusu olmaktadır. Bunların dışında olası paket kaybı durumlarında HTTP/2, HTTP/1 kadar iyi performans gösteremeyecektir.

Google tüm bu sorunlardan sıyrılmaya ve HTTPS protokolünü hızlandırmaya yönelik olarak UDP protokolüne dayalı QUIC(Quick UDP Internet Connections) protokolünü geliştirmiş bulunmaktadır..NET 6'da HTTP/3 Desteği
Yukarıdaki görselde görüldüğü üzere HTTP/3, TCP yerine UDP protokolü üzerinden çalışmaktadır. Ee böylece QUIC, UDP tabanlı olduğu için TCP tabanlı olan HTTP/2’ye nazaran bilgi aktarımını açık ara performans artışıyla birlikte sağlamaktadır. Lakin burada dikkat edilmesi gereken bir nokta vardır. UDP güvenilir iletişim sağlamamaktadır. Hal böyleyken QUIC, güvenilir veri iletimini sağlayabilmek için UDP’nin üzerine bir katman eklemekte ve TLS ile bu güvenliği sağlamaktadır.

.NET 6'da HTTP/3 Desteği

HTTP ile HTTP/3(Quic) arasındaki performans farkı…

.NET’te HTTP/3 Desteği

HTTP/3 için temel katman olarak tasarlanan QUIC protokolü artık .NET 6’dan itibaren desteklenmektedir. Bu gelişme neticesinde; .NET, ağ değişiklikleriyle başa çıkma ve bağlantı süreçlerinde olası paket kayıpları meydana geldiğinde iyi bir kurtarma sağlama yeteneği ile gücüne güç katmış bulunmaktadır.

GEREKSİNİMLER
HTTP/3’ü kullanabilmek için ilgili sunucuda MSQuic ve TLS‘in yüklü olması gerekmektedir. MSQuic, .NET 6’nın bir parçası olarak yüklenmektedir lakin TLS, Schannel SSP(Security Support Provider Interface)‘ye ihtiyaç duymaktadır. Haliyle bu işletim sisteminin son sürümleriyle sağlanmaktadır. Misal, Windows 11 😉 (ki ben deniz bu makaleyi klavyeye alırken Windows 11 üzerinden işlem yapıyorum…)

Eğer Linux’da çalışıyorsanız libmsquic paketinin yüklenmesi gerekmektedir. Misal Ubuntu’da sudo apt install libmsquic komutu eşliğinde ilgili paket yüklenebilmektedir.

Kestrel Server’da HTTP/3 Konfigürasyonu

Kestrel sunucusunda HTTP/3 desteğini sağlayabilmek için aşağıdaki gibi konfigürasyonun yapılması gerekmektedir;

var builder = WebApplication.CreateBuilder(args);
builder.WebHost.ConfigureKestrel((context, options) =>
{
    options.Listen(IPAddress.Any, 7154, listenOptions =>
    {
        //listenOptions.Protocols = HttpProtocols.Http1AndHttp2AndHttp3;
        listenOptions.Protocols = HttpProtocols.Http3;
        listenOptions.UseHttps();
    });
});

Yukarıdaki kod bloğunu yazdığınız anda aşağıdaki görseldeki gibi Using ‘Http3’ requires opting into preview features. See https://aka.ms/dotnet-warnings/preview-features for more information. hatasını alıyorsanız eğer bunun sebebi mevzu bahis konunun bir önizleme çalışması olmasıdır.
.NET 6'da HTTP/3 DesteğiHaliyle bu hatanın kalkması için Asp.NET Core uygulamanızın .csproj dosyasına gelerek ‘PropertyGroup’ tanımlaması içerisinde <EnablePreviewFeatures>True</EnablePreviewFeatures> komutu eşliğinde ‘EnablePreviewFeatures’ özelliğinin etkinleştirilmesi gerekmektedir..NET 6'da HTTP/3 Desteği

Şimdi yazılan örnek koda tekrar geri dönersek eğer ‘7154’ portuna herhangi bir adresten gelecek olan tüm isteklerin, 7. satırda yazılan listenOptions.Protocols = HttpProtocols.Http3 komutu sayesinde HTTP/3 protokolünü kullanması gerektiğini bildirmiş bulunuyoruz. Burada HTTP/3’e olan zorunluluk yerine, 6. satırda ifade edildiği gibi listenOptions.Protocols = HttpProtocols.Http1AndHttp2AndHttp3 komutu sayesinde tüm HTTP sürümlerinden istek gelebileceğini de ifade edebiliriz.

Client’da HTTP/3 Konfigürasyonu

C#’da HttpClient sınıfı, HTTP/3 protokolünü destekleyecek şekilde tekrar güncellenmiştir. Bu güncel halini kullanabilmek için ilgili client uygulamasının .csproj dosyasında System.Net.SocketsHttpHandler.Http3Support kütüphanesinin item olarak eklenmesi gerekmektedir..NET 6'da HTTP/3 DesteğiBu işlemden sonra client’ın aşağıdaki gibi geliştirilmesi yeterlidir.

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

using HttpResponseMessage response = await client.GetAsync("https://localhost:7154");
string responseContent = await response.Content.ReadAsStringAsync();

Console.WriteLine(responseContent);
gRPC’de HTTP/3 Konfigürasyonu

Özü itibariyle HTTP/2 protokolünü kullanan gRPC kütüphanesinde HTTP/3 protokolünü kullanabilmek için hasbel kader yukarıdaki gibi basit bir değişikliğin yapılması yeterlidir.

using GrpcService2.Services;
using Microsoft.AspNetCore.Server.Kestrel.Core;
using System.Net;

var builder = WebApplication.CreateBuilder(args);

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

var app = builder.Build();

// Configure the HTTP request pipeline.
app.MapGrpcService<GreeterService>();
app.MapGet("/", () => "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();

Görüldüğü üzere, 8 ile 15. satır aralığında yapılan konfigürasyon gRPC kütüphanesinin HTTP/3 protokolü eşliğinde çalışmasını sağlamaktadır. Tabi burada ilgili uygulamanın .csproj dosyasında <EnablePreviewFeatures>True</EnablePreviewFeatures> komutu eşliğinde EnablePreviewFeatures özelliğinin aktifleştirilmesi gerekmektedir.

GRPC Client
gRPC client’ı da aşağıdaki gibi HTTP/3 protokolü üzerinden istekte bulunabilmektedir.

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

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

var greetClient = new Greeter.GreeterClient(channel);

HelloReply response = await greetClient.SayHelloAsync(new HelloRequest { Name = "Gençay" });
Console.WriteLine($"Gelen cevap : {response.Message}");

İlgilenenlerin faydalanması dileğiyle…
Sonraki yazılarımda görüşmek üzere…
İyi çalışmalar…

Bunlar da hoşunuza gidebilir...

Bir cevap yazın

E-posta hesabınız yayımlanmayacak.