Aracılığıyla paylaş


.NET'te QUIC sorunlarını giderme

Bu makalede, .NET'te QUIC ile ilgili en yaygın sorunları tanılamayı öğreneceksiniz.

Kitaplık System.Net.Quic , açık kaynak QUIC uygulaması MsQuic'i temel alır. Bu nedenle, davranış, bazen tasarım gereği, sıradan soketlerden farklıdır. Ayrıca UDP protokollerini temel alır ve TCP ile tam olarak aynı deneyimi sağlamaz.

Dinleyici çalışıyor ancak veri almıyor

Bir dinleyici çalışıyorsa ancak hiçbir zaman veri almıyorsa, bunun nedeni aynı bağlantı noktasında dinleyen diğer işlemler olabilir. Hangi işlemin hangi bağlantı noktasını kullandığını doğrulamak için:

sudo ss -tulpw

Bu davranış, MsQuic'nin daha iyi performans elde etmek için SO_REUSEPORT'i kullanması tasarımı gereğidir. Daha fazla bilgi için bkz. ListenerStart belgeleri ve özgün sorun dotnet/runtime#59382.

Uyarı

Bu sorun, MsQuic'in bağlantı noktası rezervasyonu yapmayı deneyeceği Windows'ta oluşmaz. Bu, aynı bağlantı noktasında ikinci dinleyiciyi açmaya çalışan uygulamanın başlatılaamamasına neden olur.

QuicListener her zaman HERHANGİ bir adreste dinliyor

Özelliği aracılığıyla belirli bir adres sağlansa ListenEndpoint bile QuicListener çift yığınlı joker karakter yuvasını açmaya devam eder. Bu davranış, MsQuic tarafından bilerek tasarlanmıştır. MsQuic içinde filtreleme yapmak için dinleme IP adresi hala kullanılıyor. Daha fazla bilgi için listenerStart belgelerine ve özgün soruna [dotnet/runtime#92812] bakın.

İstemci beklenmeyen ALPN hatası alıyor

İstemci, sunucuyla aynı ALPN'yi kullanmasına rağmen bağlanmayı dener, ancak Application layer protocol negotiation error was encountered alır.

Dinleyici, uygulamanın ne belirttiğinden bağımsız olarak, her zaman çift modlu joker karakter adresine bağlanır. Ardından IP adresine ve ALPN'ye göre gelen bağlantılarla eşleşir. Eşleşme bulunmazsa, yukarıda belirtilen hatayı bildirir. Sonuç olarak, dinleme IP adresi ile bağlantı arasında uyuşmazlık ALPN hatasına neden olur.

Bu hatayı önlemek için dinleyicinin başlatıldığı adrese bağlandığınızdan emin olun. Örneğin, dinleyicinizin dinleme adresini yazdırın:

await using var listener = QuicListener.ListenAsync(new() /* appropriate options */);
Console.WriteLine(listener.LocalEndPoint);

Bu sorun, dotnet/runtime#85412 gibi çeşitli senaryolarda oluşabilir. Loopback adresi için sunucu başlatıldı ve aynı makinede çalıştırıldığında her şey düzgün çalıştı. Ancak istemci farklı bir adresten bağlanmaya çalıştığında, adres sunucu geri döngü adresiyle eşleşmiyor ve ALPN hatasıyla reddedildi.

Uyarı

Bu durum dinleyici MsQuic kullandığında , örneğin .NET QuicListeneraracılığıyla gerçekleşir.

Dinleyici, IPv6 devre dışı bırakılmış olsa da başlatmayı başarır.

IPv6 devre dışı bırakılsa da, QuicListener.ListenAsync bir IPv6 adresiyle başarılı olur. Joker karakter adresine bağlandığından ve bu şekilde başarılı olduğundan MsQuic, önceki sorunla ilgilidir. Sonuç olarak dinleyici başlatılır ancak bu dinleyiciyle bağlantı oluşturulamıyor. Bu, böyle bir durumda hata fırlatan soketlerden farklı bir davranıştır.

IPv6'nın etkinleştirilip etkinleştirilmediğini denetlemenin birçok yolu vardır, örneğin Linux'ta IPv6 modülünün durumunu denetleyin:

cat /sys/module/ipv6/parameters/disable

# 0 - IPv6 is enable
# 1 - IPv6 is disabled

Yukarıda belirtildiği gibi, Burada MsQuic davranışı kasıtlı olarak yapılır. Ancak bu sorun gelecekte .NET tarafında giderilebilir. Diğer ayrıntılar için bkz. dotnet/runtime#75343.

Dinleyici QUIC_STATUS_ADDRESS_IN_USE hatası nedeniyle başlayamıyor

Bu, Windows'a özgü bir sorundur. Dinleyici, belirli bir adres ve bağlantı noktası üzerinde çalışan başka bir işlem olmasa da hatayla QuicException atarQUIC_STATUS_ADDRESS_IN_USE. Hatanın nedeni dinleyicinin dinlemeye çalıştığı bağlantı noktası için tanımlanan bağlantı noktası dışlama aralığıdır. Dışlama aralıklarını denetlemek için şu komutu çalıştırın:

netsh.exe int ip show excludedportrange protocol=udp

Bir dışlanmış aralıktaki bağlantı noktasına bağlanmaya çalışırken hata alınması beklenen bir davranıştır. Bu nedenle, bunu düzeltmeye yönelik hemen bir plan yoktur. Diğer ayrıntılar dotnet/runtime#71518'de bulunabilir.

Ayrıca bakınız