移動場景下DNS解析開銷是整個網絡請求中不可忽略的一部分。在弱網環境下,基於UDP的LocalDNS解析很是容易出現解析超時的問題,而且即便解析成功會消耗數百毫秒乃至更甚,對咱們整個業務請求而言是很是不利的,它直接影響了客戶的體驗。php
對於一個比較大衆的應用而言,DNS的優化對整個應用的網絡優化所佔的權重是很大的。咱們接下來從如下幾個方面全面理解DNS,相信對咱們開發中的網絡優化會有不小的幫助。html
DNS(Domain Name System)是域名「系統」的英文縮寫,是一種組織成域層次結構的計算機和網絡服務命名系統,它用於TCP/IP網絡,它所提供的服務是用來將主機名和域名轉換爲IP地址的工做。ios
做爲網絡通訊的最靠前的一個環節,其在整個網絡通訊的過程當中的重要性不言而喻。git
ios10以後,apple提供的原生http請求方法能返回http請求各個階段的時間指標,其中就包含DNS解析時間。github
DNS是一種分層結構,在整個互聯網中組成一個樹狀系統,頂層是系統的根域名,下層爲TLD以及二級域名,葉子就構成了所謂的FQDN(Fully Qualified Domain Names),根域名一般使用"."來表示,其實際上也是由域名組成,全世界目前有13組域名根節點,由少數幾個國家進行管理,而國內僅有幾臺根節點鏡像。算法
權威DNS是通過上一級受權對域名進行解析的服務器,同時它能夠把解析受權轉授給其餘人,如COM頂級服務器能夠受權xxorg.com這個域名的的權威服務器爲NS.ABC.COM,同時NS.ABC.COM還能夠把受權轉授給NS.DDD.COM,這樣NS.DDD.COM就成了ABC.COM實際上的權威服務器了。平時咱們解析域名的結果都源自權威DNS。 eg: 阿里云云解析 [https://wanwang.aliyun.com/domain/dns](https://wanwang.aliyun.com/domain/dns)
複製代碼
遞歸DNS又稱爲Local DNS,它沒有域名解析結果的決定權,但代理了用戶向權威DNS獲取域名解析結果的過程。遞歸DNS上有緩存模塊,當目標域名存在緩存解析結果而且TTL未過時時(每一個域名都有TTL時間,即有效生存時間,若域名解析結果緩存的時間超過TTL,須要從新向權威DNS獲取解析結果),遞歸DNS會返回緩存結果,不然,遞歸DNS會一級一級地查詢各個層級域名的權威DNS直至獲取最終完整域名的解析結果。eg: 咱們本身的電腦,運營商提供的dns服務器等等。api
公共DNS是遞歸DNS的一種特例,它是一種全網開放的遞歸DNS服務,而傳統的遞歸DNS信息通常由運營商分發給用戶。瀏覽器
在 DNS 的解析過程當中,用戶向遞歸 DNS 發起請求,遞歸 DNS 向權威 DNS 請求解析結果,能夠說遞歸 DNS 起到一種轉發的做用。ISP DNS 就是遞歸 DNS;同時一些我的或互聯網服務提供商也會架設本身的遞歸 DNS 開放給全部人使用,稱爲公共 DNS。緩存
運營商 | anycast | 官網 | DNS |
---|---|---|---|
南京信風公共DNS | 南京、濟南、芝加哥 | www.114dns.com | 114.114.114..114 114.114.115.115 |
阿里雲公共DNS | 成都、深圳、杭州 | http://www.alidns.com | 233.5.5.5 233.6.6.6 |
Google Public DNS | Google 36個數據中心 | developers.google.com/speed/publi… | 8.8.8.8 8.8.4.4 |
全國DNS彙總: www.114dns.com/DNS_List.ht… ipip: tools.ipip.net/dns.php安全
能夠理解爲遞歸DNS和用戶之間的一箇中轉站,它不提供直接解析域名的服務,它將請求轉發給遞歸DNS,而後將遞歸DNS的結果轉發一下,也提供緩存做用。好比,平常家用的路由器,它的DNS服務器通常都是192.168.1.1,只是轉發給遞歸DNS。
域名解析記錄主要分爲A記錄、MIX記錄、CNAME記錄、NS記錄和TXT記錄:
如下是在終端中dig百度顯示的具體過程:
macdeiMac:~ ethan$ dig +trace www.baidu.com ; <<>> DiG 9.10.6 <<>> +trace www.baidu.com ;; global options: +cmd . 1615 IN NS a.root-servers.net. . 1615 IN NS g.root-servers.net. . 1615 IN NS f.root-servers.net. . 1615 IN NS l.root-servers.net. . 1615 IN NS m.root-servers.net. . 1615 IN NS j.root-servers.net. . 1615 IN NS k.root-servers.net. . 1615 IN NS c.root-servers.net. . 1615 IN NS b.root-servers.net. . 1615 IN NS d.root-servers.net. . 1615 IN NS i.root-servers.net. . 1615 IN NS e.root-servers.net. . 1615 IN NS h.root-servers.net. ;; Received 239 bytes from 114.114.114.114#53(114.114.114.114) in 10 ms com. 172800 IN NS a.gtld-servers.net. com. 172800 IN NS b.gtld-servers.net. com. 172800 IN NS c.gtld-servers.net. com. 172800 IN NS d.gtld-servers.net. com. 172800 IN NS e.gtld-servers.net. com. 172800 IN NS f.gtld-servers.net. com. 172800 IN NS g.gtld-servers.net. com. 172800 IN NS h.gtld-servers.net. com. 172800 IN NS i.gtld-servers.net. com. 172800 IN NS j.gtld-servers.net. com. 172800 IN NS k.gtld-servers.net. com. 172800 IN NS l.gtld-servers.net. com. 172800 IN NS m.gtld-servers.net. com. 86400 IN DS 30909 8 2 E2D3C916F6DEEAC73294E8268FB5885044A833FC5459588F4A9184CF C41A5766 com. 86400 IN RRSIG DS 8 1 86400 20191112050000 20191030040000 22545 . Sr1g7h+DSqi+ekBQQS2ZBc/jt0zL+IR+Od/R9TnMjcy8Mw9RxLrMY2pm 1VYNqL5cAME1stSAfRUKwjD/vixnCeVLoJ6idCFOZeB+t/tTFQF/jfk1 td66pW9V/WgLIvslAwEZjidVeUFYERc7hZXr10BgzryZthizHISimuiQ qBjoIQN/uYULTnmePkIW07mnJXc9/AVZrjeI1AmvYC7wE0uR7DWNg1Ig dL4DaLDOM30qN7FBAD7K091uEgctpdxd/8G5XoYclSqroN4G6RibvkWT /vPCFRUzoaxembT5tR7gIz7gxdhN1r8NBD468JTG180MNUvb16Z/87U6 7UkMrg== ;; Received 1173 bytes from 192.58.128.30#53(j.root-servers.net) in 77 ms baidu.com. 172800 IN NS ns2.baidu.com. baidu.com. 172800 IN NS ns3.baidu.com. baidu.com. 172800 IN NS ns4.baidu.com. baidu.com. 172800 IN NS ns1.baidu.com. baidu.com. 172800 IN NS ns7.baidu.com. CK0POJMG874LJREF7EFN8430QVIT8BSM.com. 86400 IN NSEC3 1 1 0 - CK0Q1GIN43N1ARRC9OSM6QPQR81H5M9A NS SOA RRSIG DNSKEY NSEC3PARAM CK0POJMG874LJREF7EFN8430QVIT8BSM.com. 86400 IN RRSIG NSEC3 8 2 86400 20191103044815 20191027033815 12163 com. U/FwNWeuKzR/uT2X/8Cf9TQmnaMdWf6XwBrFIIOCQ/kfKaOExEiT8LSQ 13OaEjtvFOOlIPK0XIbsL+dgGPYb/UV6sipBeQ1n8KuK18m3bYk47Ely oe+3VVp0zaiXt9DZrmRRenBB13o0DPqCbRHAHq1pj5zG5VkMufu9L/TT g80XlNukAMcu4GrV4VP8OimOQxz7HJbadci2oYn3beiHqQ== HPVV2B5N85O7HJJRB7690IB5UVF9O9UA.com. 86400 IN NSEC3 1 1 0 - HPVVN3Q5E5GOQP2QFE2LEM4SVB9C0SJ6 NS DS RRSIG HPVV2B5N85O7HJJRB7690IB5UVF9O9UA.com. 86400 IN RRSIG NSEC3 8 2 86400 20191105055359 20191029034359 12163 com. J5Dq0lGkcejjg1vPqWDBvNYaAhqFF3Ck8trKj4tgW5Z1bmoXsHGU6/Cl y3GlLfzb49xjiXzxVLCuAQJ9uLuKSX5cn+kesc8rwYqcVXU4nXbD5jzo u3CK2yHD3FqPDCOKlMSNy3KKkL03bB3DfmvAae/qQs7xSe6VTpCkR6v/ lo3UA/pMfTYBjSIOvR2KmpM9yFLmN5LXAQW3rNH8sW91BA== ;; Received 761 bytes from 192.26.92.30#53(c.gtld-servers.net) in 241 ms www.baidu.com. 1200 IN CNAME www.a.shifen.com. a.shifen.com. 1200 IN NS ns2.a.shifen.com. a.shifen.com. 1200 IN NS ns3.a.shifen.com. a.shifen.com. 1200 IN NS ns4.a.shifen.com. a.shifen.com. 1200 IN NS ns5.a.shifen.com. a.shifen.com. 1200 IN NS ns1.a.shifen.com. 複製代碼
;; Received 239 bytes from 180.76.76.92#53(ns7.baidu.com) in 10 ms
經過上面命令咱們能夠看到DNS解析的逐步過程,其中最後一步咱們能夠看到www.baidu.com 被CNAME到 www.a.shifen.com 因此咱們再查一下 www.a.shifen.com 便可看到其ip.
;; Received 215 bytes from 220.181.33.31#53(ns2.baidu.com) in 28 ms www.a.shifen.com. 300 IN A 180.101.49.12 www.a.shifen.com. 300 IN A 180.101.49.11 a.shifen.com. 1200 IN NS ns4.a.shifen.com. a.shifen.com. 1200 IN NS ns5.a.shifen.com. a.shifen.com. 1200 IN NS ns1.a.shifen.com. a.shifen.com. 1200 IN NS ns2.a.shifen.com. a.shifen.com. 1200 IN NS ns3.a.shifen.com. ;; Received 236 bytes from 180.76.76.95#53(ns5.a.shifen.com) in 9 ms 複製代碼
而後咱們再用nslookup命令查看一下百度的ip是否是上面顯示的兩個:
macdeiMac:~ ethan$ nslookup www.baidu.com Server: 114.114.114.114 Address: 114.114.114.114#53 Non-authoritative answer: www.baidu.com canonical name = www.a.shifen.com. Name: www.a.shifen.com Address: 180.101.49.11 Name: www.a.shifen.com Address: 180.101.49.12 複製代碼
圖示DNS解析baidu的過程:
GSLB是Global Server load Blance的縮寫,即全局負載均衡。目的是實現互聯網上不一樣地域的服務器間的流量調配,保證使用戶的請求能被離用戶最近或者服務質量更好的服務器來處理。從而確保服務質量。
能經過判斷服務器的負載,包括CPU佔用、帶寬佔用等數據,決定服務器的可用性,同時能判斷用戶(訪問者)與服務器間的鏈路情況,選擇鏈路情況最好的服務器。所以GSLB是對服務器和鏈路進行綜合判斷來決定由哪一個地點的服務器來提供服務,實現異地服務器羣服務質量的保證。
智能DNS是GSLB的一種應用。
有時候咱們在訪問百度或者在應用中發出一個http請求時,若是DNS解析被劫持,咱們可能最終訪問到的不是咱們想要訪問的服務器。
DNS劫持 就是經過劫持了 DNS 服務器,經過某些手段取得某域名的解析記錄控制權,進而修改此域名的解析結果,致使對該域名的訪問由原 IP 地址轉入到修改後的指定 IP,其結果就是對特定的網址不能訪問或訪問的是假網址,從而實現竊取資料或者破壞原有正常服務的目的。
咱們在開發中有時候會遇到這樣的狀況:你是一個聯通用戶,你在手機瀏覽器中輸入baidu.com,由一個LocalDNS服務器像百度權威服務器查應該訪問哪一臺服務器,權威把結果返回給LocalDNS服務器,localDNS服務器返回結果給用戶。
若是當LocalDNS緩存的有baidu.com對應的結果,那麼他就不會像百度的權威服務器查詢其對應的ip,而是直接返回緩存中的結果。若是此時權威服務器中的baidu.com對應的ip發生了變化,LocalDNS沒有及時更新,這樣會致使用戶訪問不到服務器。
你用手機訪問baidu.com時,會到當前運營商的DNS服務器查,而後運營商的DNS服務再去百度權威服務器去查,最終把權威服務器中的正確ip返回。
上面是正常的狀況,可是若是當前運營商(好比聯通)的LocalDNS不訪問百度權威DNS服務器,而是直接訪問了其它運營商(好比電信)的LocalDNS服務器,有些小的運營商就是經過這樣作來下降成本。若是電信的LocalDNS對非自家ip的訪問限了速那麼很明顯會影響你的DNS解析時間。若是你應用中的某些服務須要運營商信息isp(eg:只能dns, cdn等服務).
下面截圖是我手機的網路環境(NetPing開源地址:github.com/mediaios/ne…)
我直接ping百度的地址,而後用wireshark抓包結果,正常結果以下:
若是發生了轉發則邏輯以下:
HTTPDNS使用HTTP與DNS服務器交互,代替傳統的基於UDP的DNS協議,域名解析請求直接發送到HTTPDNS服務端,從而繞過運營商的Local DNS
因爲 HttpDns 是經過 IP 直接請求 HTTP 獲取服務器 A 記錄地址,不存在向本地運營商詢問 domain 解析過程,因此從根本避免了劫持問題。
HTTPDNS可以直接獲取到用戶的IP地址,從而實現精肯定位與導流
經過算法下降以往失敗率太高的服務器排序,經過時間近期訪問過的數據提升服務器排序,經過歷史訪問成功記錄提升服務器排序。
原來的請求地址爲 「apis.juhe.cn/simpleWeath…」,經過HTTPDNS替換域名後最終的結果以下:
發送HTTPS請求首先要進行SSL/TLS握手,握手過程大體以下:
上述過程當中,和HTTPDNS有關的是第3步,客戶端須要驗證服務端下發的證書,驗證過程有如下兩個要點:
若是上述兩點都校驗經過,就證實當前的服務端是可信任的,不然就是不可信任,應當中斷當前鏈接。
當客戶端使用HTTPDNS解析域名時,請求URL中的host會被替換成HTTPDNS解析出來的IP,因此在證書驗證的第2步,會出現domain不匹配的狀況,致使SSL/TLS握手不成功。
經過DHCP動態得到,或者手工配置的。
DHCP協議: DHCP(Dynamic Host Configuration Protocol,動態主機配置協議)一般被應用在大型的局域網絡環境中,主要做用是集中的管理、分配IP地址,使網絡環境中的主機動態的得到IP地址、Gateway地址、DNS服務器地址等信息,並可以提高地址的使用率。
TCP通訊過程太複雜而且開銷大,一次TCP交換須要9個包: 三個鏈接包,四個斷開包,一個request包,一個響應包。
UDP通訊過程簡單,只須要一個查詢包和一個響應包。