Android ağ optimizasyonu DNS'yi optimize etmek için, prensipten OkHttp entegrasyonuna kadar HTTPDNS kullanın

I.Giriş

Optimizasyon söz konusu olduğunda, ilk adım, büyük bir işlevi daha küçük bağlantılara bölmek ve ardından ayrı ayrı optimize edilebilecek noktaları seçmek olmalıdır. Aynı şey, Uygulama ağ optimizasyonu için de geçerlidir.

Uygulama ağa eriştiğinde, DNS çözümlemesi ağ talebinin ilk adımıdır.Varsayılan olarak, operatörün LocalDNS hizmetini kullanırız. İstatistiklere göre bu 3G ağı altında 200 ~ 300ms, 4G ağı altında 100ms sürüyor.

Yavaş çözümleme, LocalDNS'nin en büyük sorunu değildir. Ayrıca, DNS korsanlığı, yanlış DNS zamanlaması (önbelleğe alma, yönlendirme, NAT) gibi performans düşüşüne yol açan, vb. Gibi bazı daha ciddi sorunları vardır. Bunlar, ağ optimizasyonu için en iyi çözümlerdir. Sorun.

DNS'i optimize etmek istiyorsanız, şimdi en basit ve en olgun çözüm HTTPDNS kullanmaktır.

DNS, HTTPDNS ve Android altında HTTPDNS'yi entegre etmek için OKHttp'nin nasıl kullanılacağı hakkında konuşalım.

2. DNS ve HTTPDNS

2.1 DNS nedir

HTTPDNS'den bahsetmeden önce, kısaca DNS'nin ne olduğunu anlayalım.

Ağ dünyasında, geçerli her alan adının arkasında, ona hizmet veren bir sunucu vardır ve ağ iletişimimizin ilk koşulu, sunucunun IP adresini bilmektir.

Ancak alan adını (URL) hatırlamak kesinlikle IP adresini hatırlamaktan daha kolaydır. Alan adı üzerinden hizmeti veren sunucunun IP adresini bulmanın bir yolu varsa çok uygun olacaktır. Burada DNS sunucusunu ve DNS çözümlemesini kullanmanız gerekir.

DNS (Etki Alanı Adı Sistemi), rolü etki alanı adına göre karşılık gelen IP adresini bulmaktır. , HTTP protokolünün dayanak noktasıdır. Yalnızca alan adı doğru bir şekilde bir IP adresine çözüldükten sonra, HTTP işlemi devam edebilir.

DNS sunucusunun gereksinimleri yüksek düzeyde erişilebilir, yüksek düzeyde eşzamanlı ve dağıtılmış bir sunucu olmalıdır. Birden çok hiyerarşiye bölünmüştür.

  • Kök DNS sunucusu: Üst düzey etki alanı DNS sunucusunun IP adresini döndürür.
  • Üst düzey etki alanı DNS sunucusu: Yetkili DNS sunucusunun IP adresini döndürür.
  • Yetkili DNS sunucusu: ilgili ana bilgisayarın IP adresini döndürür.

Bu üç tür DNS sunucusu, bir ağaç yapısına benzer ve hiyerarşik olarak bulunur.

DNS çözümlemesi başladığında, LocalDNS önbelleğe alınmamışsa, LocalDNS sunucusunu (genellikle operatör) isteyecektir. Hala yoksa, düzey düzey olacaktır. Kök etki alanı adından ve ardından üst düzey etki alanı adından ilgili üst düzey etki alanı adını kontrol edin. Etki alanı adı, yetkili etki alanı adı sunucusunu kontrol eder ve son olarak, yetkili etki alanı adı sunucusu aracılığıyla belirli etki alanı adına karşılık gelen IP adresini alır.

Alan adı ve IP adresi eşlemesi sağlama sürecinde, DNS aslında sunucu yük dengeleme gibi birçok alan tabanlı işlev sağlar, ancak bazı sorunları da beraberinde getirir.

2.2 DNS sorunları

DNS ile ilgili pek çok detay var, bu yüzden bu yazıda detaya girmeyeceğim Özetle, birkaç problem var.

1. Kararsız

DNS korsanlığı veya hatası, hizmetlerin kullanılamamasına neden olur.

2. Yanlış

YerelDNS planlaması mutlaka yakınlık ilkesi değildir , Bazı küçük operatörlerin bir DNS sunucusu yoktur, diğer operatörlerin DNS sunucularını doğrudan ararlar ve son olarak doğrudan ağ üzerinden aktarırlar. Örneğin, kullanıcı tarafı bir mobil operatördür ve telekom IP'si gönderilir, bu da yavaş erişim ve hatta sınırlı erişim gibi sorunlara neden olur.

3. Zamanında değil

Operatör, DNS TTL'yi (Yaşam Süresi, DNS önbellek süresi) değiştirerek, DNS değişikliklerinin gecikmeli olarak yürürlüğe girmesine neden olabilir.

Ağdaki kullanıcıların erişim kalitesini sağlamak ve ağlar arası yerleşimi azaltmak için operatörler, ağda içerik önbellek sunucuları oluşturacaklar ve alan adını zorla içerik önbellek sunucusunun adresine yönlendirerek yerel ağ trafiği tamamen yerel olarak tutulabilir. Amacı.

Farklı operatörler ve hatta uygulamalar bununla tutarsız, ki bu bizim için kara kutu.

HTTPDNS, DNS ile ilgili çeşitli problemlerden dolayı ortaya çıkar.

2.3 HTTPDNS çözümü

DNS yalnızca UDP'yi desteklemekle kalmaz, aynı zamanda TCP'yi de destekler, ancak çoğu standart DNS, DNS sunucusunun 53 numaralı bağlantı noktasıyla etkileşim kurmak için UDP'ye dayanır.

HTTPDNS farklıdır Adından da anlaşılacağı gibi, DNS sunucusunun 80 numaralı bağlantı noktası ile etkileşim kurmak için HTTP protokolünü kullanır. Geleneksel DNS çözümlemesi yerine, operatörün LocalDNS sunucusunu atlayarak alan adının ele geçirilmesini etkili bir şekilde önler ve alan adı çözümlemesinin verimliliğini artırır.

Bu, her şirketin HTTP protokolüne dayalı bir dizi alan adı çözümlemesi uygulaması ve aynı adres defterini (DNS sunucusu) kullanmak yerine alan adları ve IP'lerden oluşan bir adres defteri tutması ile eşdeğerdir.

WeChat'in kendi NETDNS dağıtımına sahip olduğu ve büyük bulut hizmeti sağlayıcıları olan Alibaba Cloud ve Tencent Cloud'un da kendi HTTPDNS hizmetlerini sağladığı söyleniyor.Sıradan geliştiricilerimiz için, HTTPDNS'yi destekleyen bir istemciyi cep telefonuna yerleştirmek için yalnızca küçük bir ücret ödememiz gerekiyor. SDK, kullanıma hazır.

Üç, OKHttp HTTPDNS erişimi

Artık HTTPDNS'nin önemini anladığınıza göre, HTTPDNS'nin OkHttp'ye nasıl entegre edileceğine bir göz atalım.

OkHttp, ağ isteklerini işleyen ve Android tarafındaki en popüler hafif ağ çerçevesi olan açık kaynaklı bir projedir. OkHttp'de varsayılan, etki alanı adı çözümlemesi için sistemin DNS hizmeti InetAddress'i kullanmaktır.

InetAddress ip2 = InetAddress.getByName ("www.cxmydev.com"); System.out.println (ip2.getHostAddress ()); System.out.println (ip2.getHostName ());

OkHttp'de HTTPDNS kullanmanın iki yolu vardır.

1. Engelleyici aracılığıyla, isteği göndermeden önce alan adını IP adresiyle değiştirin.

2. OkHttp tarafından sağlanan .dns () arabirimi aracılığıyla HTTPDNS'yi yapılandırın.

Bu iki yöntem için elbette standart API'lerin kullanılması önerilir. Durdurucu yönteminin de anlaşılması tavsiye edilir, uygulaması çok basittir, ancak çukurlar vardır.

3.1 Durdurucu erişim yöntemi

1. Durdurucu erişimi

Interceptor, OkHttp'de çok güçlü bir mekanizmadır ve istek ve yanıt arasında özelleştirilmiş işlemlerimizden bazılarını gerçekleştirebilir.

OkHttp'de, Interceptor arayüzünü uygulayarak bir durdurucuyu özelleştirebilirsiniz. Kullanırken, bu engelleyiciyi kaydetmek için OkHttpClient.Builder'da addInterceptor () yöntemini çağırmanız yeterlidir.

OkHttp'nin önleyicisi bu makalenin odak noktası değil. HTTPDNS'yi uygulamak için durdurucular konusuna dönelim. Durdurucuların söyleyecek hiçbir şeyi yok, sadece ilgili koda gidin.

class HTTPDNSInterceptor: Interceptor { eğlenceli engellemeyi geçersiz kılma (chain: Interceptor.Chain): Response { val originRequest = chain.request () val httpUrl = originRequest.url () val url = httpUrl.toString () val ana bilgisayar = httpUrl.host () val hostIP = HttpDNS.getIpByHost (ana bilgisayar) val oluşturucu = originRequest.newBuilder () eğer (hostIP! = null) { builder.url (HttpDNS.getIpUrl (url, host, hostIP)) builder.header ("ana bilgisayar", ana bilgisayarIP) } val newRequest = builder.build () val newResponse = chain.proceed (newRequest) newResponse döndür } }

Önleyicide, Ana Bilgisayarı getIpByHost () aracılığıyla karşılık gelen IP'ye dönüştürmek için yardımcı sınıf HttpDNS'yi kullanın.

Paketi yakalamak için bir paket yakalama aracı kullanırsanız, benzeri orijinal isteğin ile değiştirildiğini göreceksiniz.

2. Önleyici erişiminin dezavantajları

Talep gönderilmeden önce, doğrudan DNS adımlarını atlayarak bir durdurucu kullanarak, Ana Bilgisayar, karşılık gelen IP adresiyle değiştirilir.

Bu tür bir şema, herhangi bir teknik sorun olmaksızın, süreçte çok açıktır. Ancak bu çözümde HTTPS altında doğrudan IP bağlantısının sertifika sorunu, proxy sorunu, çerez sorunu vb. Gibi bazı sorunları vardır.

En ciddi sorun, bu şema (durdurucu + HTTPDNS) https ile karşılaştığında, birden fazla alan adını destekleyen bir sunucu varsa, sertifikanın eşleşememesi sorununa neden olabilmesidir.

Bu konudan bahsetmeden önce, öncelikle HTTPS ve SNI'yi anlamalıyız.

HTTPS, güvenliği sağlamak içindir. Bir HTTPS isteği göndermeden önce, bir SSL / TLS anlaşmasının gerçekleştirilmesi gerekir. El sıkışmanın genel süreci şu şekildedir:

  • İstemci, rastgele bir sayı ve desteklenen algoritmaların bir listesi gibi parametreleri taşıyan bir el sıkışma isteği başlatır.
  • Sunucu, isteğe göre uygun algoritmayı seçer ve genel anahtar sertifikası ve rastgele sayı verir.
  • İstemci, sunucu sertifikasını doğrular ve bir genel anahtarla şifrelenmiş rastgele bir numara mesajı gönderir.
  • Sunucu, rasgele sayı bilgisini özel anahtar aracılığıyla alır.
  • Yukarıda alınıp verilen bilgilere dayanarak, her iki taraf da bağlantının sonraki veri iletimi için bir şifreleme anahtarı olarak kullanılan bir Oturum Bileti oluşturur.
  • Bu süreçte, istemcinin sunucu tarafından verilen sertifikayı doğrulaması gerekir. Öncelikle, sertifikanın güvenilir olduğunu onaylamak için sertifika zincirini çözmek için yerel olarak kaydedilmiş kök sertifikayı kullanın ve ardından istemcinin, istenen HOST'u içerip içermediğini görmek için sertifikanın etki alanını ve genişletilmiş etki alanlarını da kontrol etmesi gerekir.

    Bu adımda bir sorun var. Durdurucu kullanıldığında, istenen URL'deki HOST, HTTPDNS tarafından çözülen IP ile değiştirilecektir. Sunucunun birden fazla alan adı ve sertifikası olduğunda, sunucu, SSL / TLS anlaşması kurulurken hangi sertifikanın döndürülmesi gerektiğini ayırt edemez. Şu anda, politika varsayılan sertifikayı döndürebilir veya geri dönmeyebilir ve bu da istemcinin sertifikayı doğrulamasına neden olabilir Etki alanında, sonunda SSL / TLS el sıkışmasının başarısız olmasına neden olan bir uyumsuzluk vardır.

    Bu, SNI çözümüne yol açar, SNI (Sunucu Adı Göstergesi), birden çok alan adı ve sertifika kullanarak bir sunucunun SSL / TLS uzantısını çözmektir.

    SNI'nin çalışma prensibi, SSL bağlantısı kurmak için sunucuya bağlanmadan önce öncelikle ziyaret edilecek sitenin alan adını (hostname) gönderir ve sunucu bu alan adına göre doğru sertifikayı döndürür. Artık çoğu işletim sistemi ve tarayıcı zaten SNI uzantılarını iyi desteklemektedir.

    3. Interceptor + HTTPDNS çözümü

    Aslında bu sorunun çözümleri var İşte kısa bir giriş.

    "Etki alanı uyuşmazlığı" sorunu için, IP'yi doğrudan orijinal etki alanı adıyla değiştirmek için kanca sertifikası doğrulama işleminin ikinci adımını kullanabilir ve ardından sertifika doğrulaması gerçekleştirebilirsiniz.

    Ancak, HttpURLConnect, değişimi tamamlamak için uygulanabilen bir HostnameVerifier arabirimi sağlar.

    genel arayüz HostnameVerifier { genel boole doğrulaması (Dize ana bilgisayar adı, SSLSession oturumu); }

    OkHttp kullanıyorsanız, değiştirme için OkHostnameVerifier (kaynak: //src/main/java/okhttp3/internal/tls/OkHostnameVerifier.java) uygulamasına başvurabilirsiniz.

    OkHttp, HTTPDNS'yi desteklemek için durdurucuların kullanılmasını önermiyor, bu yüzden burada tartışmayacağım. Sadece burada çözümler öneriyorum. İlgileniyorsanız, kaynak kodunu inceleyebilirsiniz.

    3.2 OKHttp standart API erişimi

    Aslında, OkHttp kendisi bir Dns arabirimini açığa çıkarmıştır.Varsayılan uygulama, DNS çözümlemesi için UDP istekleri göndermek için sistemin InetAddress sınıfını kullanmaktır.

    OkHttp'nin Dns arayüzünü HTTPDNS desteği almak için uygulamamız yeterlidir.

    Gerçekleştirdiğimiz Dns arabirim uygulama sınıfında, DNS çözümleme yolu HTTPDNS ile değiştirilir ve çözüm sonucu döndürülür.

    class HttpDns: Dns { eğlenceli aramayı geçersiz kılma (ana bilgisayar adı: Dize): Liste < InetAddress > { val ip = HttpDnsHelper.getIpByHost (ana bilgisayar adı) if (TextUtils.isEmpty (ip)) { // Kendi kendinize çözdüğünüz adresler listesine geri dönün InetAddress.getAllByName (ip) .toList () döndür } Başka { // ayrıştırma başarısız oldu, sistem analizi kullan Dns.SYSTEM.lookup (ana bilgisayar adı) döndür } } }

    Ayrıca kullanımı çok basittir OkHttp.build () olduğunda, onu dns () yöntemi ile yapılandırın.

    mOkHttpClient = httpBuilder .dns (HttpDns ()) .inşa etmek();

    Bunun avantajları:

    1. Etki alanı adı hala erişim için kullanılmaktadır, ancak çözümlenen IP adresinin beklentileri karşıladığından emin olmak için temeldeki DNS çözümlemesi HTTPDNS ile değiştirilir.

    2. HTTPS altındaki sorun da çözüldü ve sertifika hala doğrulama için alan adını kullanıyor.

    OkHttp, dns arayüzünü ortaya çıkardığı için, onu olabildiğince kullanmaya çalışıyoruz.

    Dördüncü, özet an

    Artık herkes, Uygulama ağ optimizasyonu yaparken ilk adımın DNS'yi optimize etmek için HTTPDNS kullanmak olduğunu biliyor.

    Tüm optimizasyonlar elbette nihai etkiyi hedefliyor. İşte iki büyük üretici tarafından yayınlanan veriler. Tencent'in ürünleri için, HTTPDNS'ye eriştikten sonra, ortalama kullanıcı gecikmesi% 10'dan fazla ve erişim hatası oranı beşte birinden fazla düştü. Baidu App'in feed işinde, Android kaçırma oranı% 0,25'ten% 0,05'e düşürüldü.

    Bu optimizasyon çözümü, büyük ölçüde HTTPDNS sunucularına dayanmaktadır, bu nedenle Alibaba Cloud ve Tencent Cloud gibi nispeten istikrarlı bulut hizmeti sağlayıcılarının kullanılması önerilir.

    Son olarak, buradaki editör, Android öğrenme zihin haritasını ve kendi derlediğim mimari verilerini koyuyor.

    Bilgi koleksiyonu

    İzle + özel mesajı ücretsiz "Android verileri" yanıtlayın!

    Önceki Android gelişmiş mimari malzemelerini, kaynak kodunu, notlarını ve videolarını almak için grup ekleyin. Gelişmiş kullanıcı arayüzü, performans optimizasyonu, mimar kursları, NDK, hibrit geliştirme (ReactNative + Weex) WeChat uygulamaları, Flutter'ın çok yönlü Android gelişmiş uygulama teknolojisi ve grupta sorunları birlikte tartışmak ve çözmek için teknik uzmanlar var.

    Model oyun kontrolü: Temel Düello Gundam
    önceki
    "Star Wars" dan önce, bilim kurgu filmlerinin dünyada hiçbir varoluş hissi yoktu, bilim kurgu filmlerinde bir kilometre taşı
    Sonraki
    Tüketici teknolojisi çağı geldi, Titanium Medianın "Tech Life Festivali" yüz milyonlarca teknolojik inovasyon meraklısı için bir harita çiziyor
    Model oyun kontrolü: boyama işleri, "YUZHIBOJUN" Ramba komuta ekibi Zhagutou sahnesi
    Zhang Yimou'nun filmi "The Great Wall" Matt Damon zirveden sorumlu .. Lu Han ve Wang Junkai gişelerden sorumlu mu?
    "The 25th Hour" neredeyse yeniden derecelendirilmiş bir film
    Model oyun kontrolü: FA-78-1B FA GUNDAM TYPE B
    "Avenger 4" Kuzey Amerika ön satışı bir dizi tarihi rekora imza attı ve ayrıca büyük biletleme web sitelerinin çökmesine neden oldu
    Jackie Chan, Oscar Jet Li'nin emekli olmasını sağlıyor 53 yaşındaki Donnie Yen, dövüş sanatlarına hâkim olmaya devam edebilir mi?
    "Final Fantasy 15" sanat albümü ön siparişleri kabul ediyor
    Model oyun kontrolü: Gundam BF Pioneer Gundam Final
    "Prenses Lanling" iki yıl ertelendi ama arkasında yürek burkan bir hikaye var
    Ustalaşmanız gereken Android soğuk başlatma optimizasyonu
    Peki "Hannah" nın drama versiyonunun son performansı nedir?
    To Top