- 深入分析Java Web技術(shù)內(nèi)幕
- 許令波
- 3255字
- 2018-12-30 19:21:14
1.4 DNS域名解析
我們知道互聯(lián)網(wǎng)都是通過(guò)URL來(lái)發(fā)布和請(qǐng)求資源的,而URL中的域名需要解析成IP地址才能與遠(yuǎn)程主機(jī)建立連接,如何將域名解析成IP地址就屬于DNS解析的工作范疇。
可以毫不夸張地說(shuō),雖然我們平時(shí)上網(wǎng)感覺(jué)不到DNS解析的存在,但是一旦DNS解析出錯(cuò),可能會(huì)導(dǎo)致非常嚴(yán)重的互聯(lián)網(wǎng)災(zāi)難。目前世界上的整個(gè)互聯(lián)網(wǎng)有幾個(gè)DNS根域名服務(wù)器,任何一臺(tái)根服務(wù)器壞掉后果都會(huì)非常嚴(yán)重。
1.4.1 DNS域名解析過(guò)程
圖1-10是DNS域名解析的主要請(qǐng)求過(guò)程實(shí)例圖。

圖1-10 DNS域名解析
如圖1-10所示,當(dāng)一個(gè)用戶在瀏覽器中輸入www.abc.com時(shí),DNS解析將會(huì)有將近10個(gè)步驟,這個(gè)過(guò)程大體描述如下。
當(dāng)用戶在瀏覽器中輸入域名并按下回車鍵后,第1步,瀏覽器會(huì)檢查緩存中有沒(méi)有這個(gè)域名對(duì)應(yīng)的解析過(guò)的IP地址,如果緩存中有,這個(gè)解析過(guò)程就將結(jié)束。瀏覽器緩存域名也是有限制的,不僅瀏覽器緩存大小有限制,而且緩存的時(shí)間也有限制,通常情況下為幾分鐘到幾小時(shí)不等,域名被緩存的時(shí)間限制可以通過(guò)TTL屬性來(lái)設(shè)置。這個(gè)緩存時(shí)間太長(zhǎng)和太短都不好,如果緩存時(shí)間太長(zhǎng),一旦域名被解析到的IP有變化,會(huì)導(dǎo)致被客戶端緩存的域名無(wú)法解析到變化后的IP地址,以致該域名不能正常解析,這段時(shí)間內(nèi)有可能會(huì)有一部分用戶無(wú)法訪問(wèn)網(wǎng)站。如果時(shí)間設(shè)置太短,會(huì)導(dǎo)致用戶每次訪問(wèn)網(wǎng)站都要重新解析一次域名。
第2步,如果用戶的瀏覽器緩存中沒(méi)有,瀏覽器會(huì)查找操作系統(tǒng)緩存中是否有這個(gè)域名對(duì)應(yīng)的DNS解析結(jié)果。其實(shí)操作系統(tǒng)也會(huì)有一個(gè)域名解析的過(guò)程,在Windows中可以通過(guò)C:\Windows\System32\drivers\etc\hosts文件來(lái)設(shè)置,你可以將任何域名解析到任何能夠訪問(wèn)的IP地址。如果你在這里指定了一個(gè)域名對(duì)應(yīng)的IP地址,那么瀏覽器會(huì)首先使用這個(gè)IP地址。例如,我們?cè)跍y(cè)試時(shí)可以將一個(gè)域名解析到一臺(tái)測(cè)試服務(wù)器上,這樣不用修改任何代碼就能測(cè)試到單獨(dú)服務(wù)器上的代碼的業(yè)務(wù)邏輯是否正確。正是因?yàn)橛羞@種本地DNS解析的規(guī)程,所以黑客就有可能通過(guò)修改你的域名解析來(lái)把特定的域名解析到它指定的IP地址上,導(dǎo)致這些域名被劫持。
這導(dǎo)致早期的Windows版本中出現(xiàn)過(guò)很嚴(yán)重的問(wèn)題,而且對(duì)于一般沒(méi)有太多電腦知識(shí)的用戶來(lái)說(shuō),出現(xiàn)問(wèn)題后很難發(fā)現(xiàn),即使發(fā)現(xiàn)也很難自己解決,所以Windows 7中將hosts文件設(shè)置成了只讀的,防止這個(gè)文件被輕易修改。
在Linux中這個(gè)配置文件是/etc/named.conf,修改這個(gè)文件可以達(dá)到同樣的目的,當(dāng)解析到這個(gè)配置文件中的某個(gè)域名時(shí),操作系統(tǒng)會(huì)在緩存中緩存這個(gè)解析結(jié)果,緩存的時(shí)間同樣是受這個(gè)域名的失效時(shí)間和緩存的空間大小控制的。
前面這兩個(gè)步驟都是在本機(jī)完成的,所以在圖1-10中沒(méi)有表示出來(lái)。到這里還沒(méi)有涉及真正的域名解析服務(wù)器,如果在本機(jī)中仍然無(wú)法完成域名的解析,就會(huì)真正請(qǐng)求域名服務(wù)器來(lái)解析這個(gè)域名了。
第3步,如何、怎么知道域名服務(wù)器呢?在我們的網(wǎng)絡(luò)配置中都會(huì)有“DNS服務(wù)器地址”這一項(xiàng),這個(gè)地址就用于解決前面所說(shuō)的如果兩個(gè)過(guò)程無(wú)法解析時(shí)要怎么辦,操作系統(tǒng)會(huì)把這個(gè)域名發(fā)送給這里設(shè)置的LDNS,也就是本地區(qū)的域名服務(wù)器。這個(gè)DNS通常都提供給你本地互聯(lián)網(wǎng)接入的一個(gè)DNS解析服務(wù),例如你是在學(xué)校接入互聯(lián)網(wǎng),那么你的DNS服務(wù)器肯定在你的學(xué)校,如果你是在一個(gè)小區(qū)接入互聯(lián)網(wǎng)的,那這個(gè)DNS就是提供給你接入互聯(lián)網(wǎng)的應(yīng)用提供商,即電信或者聯(lián)通,也就是通常所說(shuō)的SPA,那么這個(gè)DNS通常也會(huì)在你所在城市的某個(gè)角落,通常不會(huì)很遠(yuǎn)。在Windows下可以通過(guò)ipconfig查詢這個(gè)地址,如圖1-11所示。

圖1-11 在Windows中查詢DNS Server
在Linux下可以通過(guò)如下方式查詢配置的DNS Server,如圖1-12所示。

圖1-12 在Linux中下查詢DNS Server
這個(gè)專門的域名解析服務(wù)器性能都會(huì)很好,它們一般都會(huì)緩存域名解析結(jié)果,當(dāng)然緩存時(shí)間是受域名的失效時(shí)間控制的,一般緩存空間不是影響域名失效的主要因素。大約80%的域名解析都到這里就已經(jīng)完成了,所以LDNS主要承擔(dān)了域名的解析工作。
第4步,如果LDNS仍然沒(méi)有命中,就直接到Root Server域名服務(wù)器請(qǐng)求解析。
第5步,根域名服務(wù)器返回給本地域名服務(wù)器一個(gè)所查詢域的主域名服務(wù)器(gTLD Server)地址。gTLD是國(guó)際頂級(jí)域名服務(wù)器,如.com、.cn、.org等,全球只有13臺(tái)左右。
第6步,本地域名服務(wù)器(Local DNS Server)再向上一步返回的gTLD服務(wù)器發(fā)送請(qǐng)求。
第7步,接受請(qǐng)求的gTLD服務(wù)器查找并返回此域名對(duì)應(yīng)的Name Server域名服務(wù)器的地址,這個(gè)Name Server通常就是你注冊(cè)的域名服務(wù)器,例如你在某個(gè)域名服務(wù)提供商申請(qǐng)的域名,那么這個(gè)域名解析任務(wù)就由這個(gè)域名提供商的服務(wù)器來(lái)完成。
第8步,Name Server域名服務(wù)器會(huì)查詢存儲(chǔ)的域名和IP的映射關(guān)系表,正常情況下都根據(jù)域名得到目標(biāo)IP記錄,連同一個(gè)TTL值返回給DNS Server域名服務(wù)器。
第9步,返回該域名對(duì)應(yīng)的IP和TTL值,Local DNS Server會(huì)緩存這個(gè)域名和IP的對(duì)應(yīng)關(guān)系,緩存的時(shí)間由TTL值控制。
第10步,把解析的結(jié)果返回給用戶,用戶根據(jù)TTL值緩存在本地系統(tǒng)緩存中,域名解析過(guò)程結(jié)束。
在實(shí)際的DNS解析過(guò)程中,可能還不止這10個(gè)步驟,如Name Server也可能有多級(jí),或者有一個(gè)GTM來(lái)負(fù)載均衡控制,這都有可能會(huì)影響域名解析的過(guò)程。
1.4.2 跟蹤域名解析過(guò)程
在Linux和Windows下都可以用nslookup命令來(lái)查詢域名的解析結(jié)果,如圖1-13所示。

圖1-13 用nslookup查詢域名解析結(jié)果
在Linux系統(tǒng)中還可以使用dig命名來(lái)查詢DNS的解析過(guò)程,如下所示:
[junshan@v101055.sqa.cm4 admin]$ dig www.taobao.com ; <<>> DiG 9.3.6-P1-RedHat-9.3.6-4.P1.el5 <<>> www.taobao.com ;; global options: printcmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 16903 ;; flags: qr rd ra; QUERY: 1, ANSWER: 3, AUTHORITY: 3, ADDITIONAL: 3 ;; QUESTION SECTION: ;www.taobao.com. IN A ;; ANSWER SECTION: www.taobao.com. 1542 IN CNAME www.gslb.taobao.com. www.gslb.taobao.com. 130 IN A 115.238.23.251 www.gslb.taobao.com. 130 IN A 115.238.23.241 ;; AUTHORITY SECTION: gslb.taobao.com. 70371 IN NS gslbns3.taobao.com. gslb.taobao.com. 70371 IN NS gslbns1.taobao.com. gslb.taobao.com. 70371 IN NS gslbns2.taobao.com. ;; ADDITIONAL SECTION: gslbns1.taobao.com. 452 IN A 121.0.23.218 gslbns2.taobao.com. 452 IN A 115.124.17.70 gslbns3.taobao.com. 452 IN A 110.75.3.193 ;; Query time: 5 msec ;; SERVER: 10.232.2.254#53(10.232.2.254) ;; WHEN: Sun Feb 12 19:19:052012 ;; MSG SIZE rcvd: 201
結(jié)果的第1行輸出了當(dāng)前Linux的版本號(hào),第2行說(shuō)明可以增加可選參數(shù)printcmd,如果加上printcmd,打印出來(lái)的結(jié)果如下:
;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NXDOMAIN, id: 58602 ;; flags: qr rd ra; QUERY: 1, ANSWER: 0, AUTHORITY: 1, ADDITIONAL: 0 ;; QUESTION SECTION: ;printcmd. IN A ;; AUTHORITY SECTION: . 10800 IN SOA a.root-servers.net. nstld. verisign-grs.com. 20120212001800900 60480086400 ;; Query time: 208 msec ;; SERVER: 10.232.2.254#53(10.232.2.254) ;; WHEN: Sun Feb 12 19:20:592012 ;; MSG SIZE rcvd: 101
“QUESTION SECTION”部分表示當(dāng)前查詢的域名是一個(gè)A記錄,“ANSWER SECTION”部分返回了這個(gè)域名由CNAME到www.gslb.taobao.com,返回了這個(gè)域名對(duì)應(yīng)的IP地址。
還可通過(guò)增加+trace參數(shù)跟蹤這個(gè)域名的解析過(guò)程,如下所示:
[junshan@v101055.sqa.cm4 admin]$ dig www.taobao.com +trace ; <<>> DiG 9.3.6-P1-RedHat-9.3.6-4.P1.el5 <<>> www.taobao.com +trace ;; global options: printcmd . 449398 IN NS k.root-servers.net. . 449398 IN NS l.root-servers.net. . 449398 IN NS m.root-servers.net. . 449398 IN NS a.root-servers.net. . 449398 IN NS b.root-servers.net. . 449398 IN NS c.root-servers.net. . 449398 IN NS d.root-servers.net. . 449398 IN NS e.root-servers.net. . 449398 IN NS f.root-servers.net. . 449398 IN NS g.root-servers.net. . 449398 IN NS h.root-servers.net. . 449398 IN NS i.root-servers.net. . 449398 IN NS j.root-servers.net. ;; Received 272 bytes from 10.232.2.254#53(10.232.2.254) in 0 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. ;; Received 492 bytes from 193.0.14.129#53(k.root-servers.net) in 607 ms taobao.com. 172800 IN NS ns1.taobao.com. taobao.com. 172800 IN NS ns2.taobao.com. taobao.com. 172800 IN NS ns3.taobao.com. ;; Received 134 bytes from 192.5.6.30#53(a.gtld-servers.net) in 250 ms www.taobao.com. 1800 IN CNAME www.gslb.taobao.com. gslb.taobao.com. 86400 IN NS gslbns2.taobao.com. gslb.taobao.com. 86400 IN NS gslbns3.taobao.com. gslb.taobao.com. 86400 IN NS gslbns1.taobao.com. ;; Received 169 bytes from 110.75.1.19#53(ns1.taobao.com) in 0 ms
上面清楚地顯示了整個(gè)域名是如何發(fā)起和解析的,從根域名(.)到gTLD Server(.com.)再到Name Server(taobao.com.)的整個(gè)過(guò)程都顯示出來(lái)了。還可以看出DNS的服務(wù)器有多個(gè)備份,可以從任何一臺(tái)查詢到解析結(jié)果。
1.4.3 清除緩存的域名
我們知道DNS域名解析后會(huì)緩存解析結(jié)果,其中主要在兩個(gè)地方緩存結(jié)果,一個(gè)是Local DNS Server,另外一個(gè)是用戶的本地機(jī)器。這兩個(gè)緩存都是TTL值和本機(jī)緩存大小控制的,但是最大緩存時(shí)間是TTL值,基本上Local DNS Server的緩存時(shí)間就是TTL控制的,很難人工介入,但是我們的本機(jī)緩存可以通過(guò)如下方式清除。
在Windows下可以在命令行模式下執(zhí)行ipconfig /flushdns命令來(lái)刷新緩存,如圖1-14所示。

圖1-14 在Windows下刷新DNS緩存
在Linux下可以通過(guò)/etc/init.d/nscd restart來(lái)清除緩存,如圖1-15所示。

圖1-15 在Linux下清除DNS緩存
重啟依然是解決很多問(wèn)題的第一選擇。
在Java應(yīng)用中JVM也會(huì)緩存DNS的解析結(jié)果,這個(gè)緩存是在InetAddress類中完成的,而且這個(gè)緩存時(shí)間還比較特殊,它有兩種緩存策略:一種是正確解析結(jié)果緩存,另一種是失敗的解析結(jié)果緩存。這兩個(gè)緩存時(shí)間由兩個(gè)配置項(xiàng)控制,配置項(xiàng)是在 %JAVA_HOME%\lib\security\java.security文件中配置的。兩個(gè)配置項(xiàng)分別是networkaddress.cache. ttl和networkaddress.cache.negative.ttl,它們的默認(rèn)值分別是-1(永不失效)和10(緩存10秒)。
要修改這兩個(gè)值同樣有幾種方式,分別是:直接修改java.security文件中的默認(rèn)值、在Java的啟動(dòng)參數(shù)中增加-Dsun.net.inetaddr.ttl=xxx來(lái)修改默認(rèn)值、通過(guò)InetAddress類動(dòng)態(tài)修改。
在這里還要特別強(qiáng)調(diào)一下,如果我們需要用InetAddress類解析域名時(shí),一定要是單例模式,不然會(huì)有嚴(yán)重的性能問(wèn)題,如果每次都創(chuàng)建InetAddress實(shí)例,每次都要進(jìn)行一次完整的域名解析,非常耗時(shí),這點(diǎn)要特別注意。
1.4.4 幾種域名解析方式
域名解析記錄主要分為A記錄、MX記錄、CNAME記錄、NS記錄和TXT記錄。
◎ A記錄,A代表的是Address,用來(lái)指定域名對(duì)應(yīng)的IP地址,如將item.taobao.com指定到115.238.23.241,將switch.taobao.com指定到121.14.24.241。A記錄可以將多個(gè)域名解析到一個(gè)IP地址,但是不能將一個(gè)域名解析到多個(gè)IP地址。
◎ MX記錄,表示的是Mail Exchange,就是可以將某個(gè)域名下的郵件服務(wù)器指向自己的,如taobao.com域名的A記錄IP地址是115.238.25.245,如果MX記錄設(shè)置為115.238.25.246,是xxx@taobao.com的郵件路由,DNS會(huì)將郵件發(fā)送到115.238.25.246所在的服務(wù)器,而正常通過(guò)Web請(qǐng)求的話仍然解析到A記錄的IP地址。Mail Server
◎ CNAME記錄,全稱是Canonical Name(別名解析)。所謂的別名解析就是可以為一個(gè)域名設(shè)置一個(gè)或者多個(gè)別名。如將taobao.com解析到xulingbo.net,將srcfan.com也解析到xulingbo.net。其中xulingbo.net分別是taobao.com和srcfan.com的別名。前面的跟蹤域名解析中的“www.taobao.com. 1542 IN CNAME www.gslb.taobao.com”就是CNAME解析。
◎ NS記錄,為某個(gè)域名指定DNS解析服務(wù)器,也就是這個(gè)域名有指定的IP地址的DNS服務(wù)器去解析,前面的“gslb.taobao.com. 86400 IN NS gslbns2.taobao. com.”就是NS解析。
◎ TXT記錄,為某個(gè)主機(jī)名或域名設(shè)置說(shuō)明,如可以為xulingbo.net設(shè)置TXT記錄為“君山的博客|許令波”這樣的說(shuō)明。
- Java EE 6 企業(yè)級(jí)應(yīng)用開發(fā)教程
- 算法大爆炸:面試通關(guān)步步為營(yíng)
- Python程序設(shè)計(jì)案例教程
- Redis Essentials
- Hands-On Automation Testing with Java for Beginners
- Android Wear Projects
- Unity 3D/2D移動(dòng)開發(fā)實(shí)戰(zhàn)教程
- Statistical Application Development with R and Python(Second Edition)
- Android嵌入式系統(tǒng)程序開發(fā):基于Cortex-A8(第2版)
- ASP.NET Web API Security Essentials
- 計(jì)算機(jī)應(yīng)用基礎(chǔ)(第二版)
- Java Hibernate Cookbook
- Java程序設(shè)計(jì)基礎(chǔ)教程
- Delphi Cookbook
- C++程序設(shè)計(jì)基礎(chǔ)(下)