前言
??本文開始介紹應用層,傳輸層為應用進程提供了端到端的通信服務,但不同的網絡應用的應用進程之間,還需要有不同的通信規則。因此在傳輸層協議之上,還需要有應用層協議。
??應用層重要協議有:DNS、HTTP、SMTP、POP3、DHCP(之前已介紹)、FTP。
1 應用層
??應用層對應用程序的通信提供服務。應用層協議具體應定義為:
??(1) 應用進程交換的報文類型,如請求報文和響應報文。
??(2) 各種報文類型的語法,如報文中的各個字段及其詳細描述。
??(3) 字段的語義,即包含在字段中信息的含義。
??(4) 進程何時、如果發送報文,以及對報文的響應的規則。
2 網絡應用模型
?? 現代網絡應用程序中所使用的兩種主流體系:客戶服務器模型和對等(P2P)模型。
2.1 客戶服務器模型
??客戶(client)和服務器(server)都是指通信中涉及的兩個應用進程。客戶服務器方式所描述的是進程之間服務和被服務的關系。這里最主要的特征就是:客戶是服務請求方,服務器是服務提供方。
??服務器是提供計算服務的設備。服務器有如下特點:
(1) 永久提供服務。
(2) 永久性訪問地址/域名——即服務器IP地址固定不變。
??客戶是請求計算服務的主機。客戶有如下特點:
(1) 與服務器通信,使用服務器提供的服務。
(2) 間歇性接入網絡。
(3) 可能使用動態的IP地址。
(4) 不與其他客戶直接通信。
2.2 對等模型
??對等模型的特點是:
(1) 不存在永遠在線的服務器。
(2) 每個主機既可以提供服務,也可以請求服務。
(3) 任意端系統/節點之間可以直接通訊。
(4) 節點間歇性接入網絡,并且可能改變IP地址。
(5) 自擴展性好。
3 域名系統DNS
??域名系統DNS(Domain Name System)是互聯網使用的命名系統,用來將域名解析成IP地址。
??用戶在與互聯網中的主機通信時,必須知道對方的IP地址,但是32位IP地址太長不便于,即使使用點分十進制的方式也不容易記憶,所以實際中都是使用域名來與對方通信,如訪問百度可以直接輸入www.baidu.com而不用使用百度服務器的IP地址。域名系統DNS就是把域名轉換為IP地址。
??3.1 域名
??任何一個連接在互聯網上的主機或路由器都有一個唯一的層次結構的名字,即域名。
??每個域名都由標號序列組成,而各標號之間用點隔開。
??如上圖所示的域名,它由三個標號組成,其中,com是頂級域名,baidu是二級域名,www是三級域名。域名其實還有一個根,不過根沒有名字,根下面才是頂級域名。
??DNS規定,標號都是由英文字母和數字組成,每一個標號不超過63個字符(但為了記憶,最好不超過12個字符),也不區分大小寫。標號中除了字符(-)外不能使用其他標點符號。級別最低的域名寫在最左邊,而級別最高的頂級域名寫在最右邊。由多個標號組成的完整域名總共不超過255個字符。
??下圖給出了頂級域名和二級域名的分類
cn,us,uk:中國、美國、英國。
com:公司企業。net:網絡服務器機構。org:非營利性組織。
int:國際組織。gov:政府部門。areo:航空運輸企業。
arap:反向域名。
ac:科研機構。edu:教育機構。mil:軍事機構。
bj:北京。js:江蘇。
??上面的二級域名和頂級域名有重復。如當頂級域名使用國家域名時,二級域名就可以使用和頂級域名的重復的那些域名。
??DNS中使用的所有名稱集合構成了DNS名稱空間。這個名稱空間是分層的,當前的DNS名稱空間是一棵域名樹。如下圖所示
??
??
??
??
??
??3.2 域名服務器
??一個服務器所負責的管轄的(或所有權限的)范圍叫做區。各單位根據具體情況來劃分自己管轄范圍的區。但在一個區中的所有節點必須是能夠連通的。每個區設置相應的權限域名服務器,用來保存該區中的所有主機域名到IP地址的映射。
??上圖表示DNS域名服務器的樹狀結構圖,每一個域名服務器都能夠進行部分域名到IP地址的解析。DNS域名服務器是按層次安排的,每個域名服務器都只對域名體系中的一部分進行管轄。根據域名服務器所起的作用,可以把域名服務器分為以下四種類型:
??(1) 本地域名服務器(local name server):又稱默認域名服務器,本地域名服務器不屬于上圖的域名服務器層次結構,但它對域名系統非常重要。當一臺主機發出DNS查詢請求時,這個查詢報文就發給本地域名服務器。
本地域名服務器離用戶比較近,一般不超過幾個路由器的距離,當所要查詢的主機也屬于同一個互聯網服務提供者ISP,該本地域名服務器立即就能將所查詢的主機名轉換為它的IP地址,而不需要再去查詢其他的域名服務器。
??所以,本地域名服務器的存在,就會使得DNS查詢的過程更加快速和便捷。
??(2) 根域名服務器(root name server):根域名服務器是最高層次、最重要的域名服務器。所有的根域名服務器都知道所有的頂級域名服務器的域名和IP地址。不管哪一個本地域名服務器,如果要對互聯網上任何一個域名進行解析(即轉換為IP地址),只要自己無法解析,就首先求助于根域名服務器。如果所有的根域名服務器都癱瘓了,那么整個互聯網中的DNS系統就無法工作。
??通常情況下,根域名服務器并不直接把待查詢的域名直接轉換為IP地址(根域名服務器也沒有存放這種信息),而是告訴本地域名服務器下一步應當找哪一個頂級域名服務器進行查詢(下面域名解析過程中會詳細介紹)。
如上圖,假如要訪問www.baidu.com,主機首先向本地域名服務器發送一個DNS查詢請求,如果本地域名服務器緩存中沒有這個域名對應的IP地址,那么本地域名服務器首先就求助于根域名服務器,而根域名服務器知道所有頂級域名服務器的IP地址,所以根域名服務器首先查看域名的頂級域名,頂級域名是com,所以根域名服務器就要將com域名服務器的IP地址即101告知給本地域名服務器。
??(3) 頂級域名服務器(TLD服務器):頂級域名服務器負責管理在該頂級域名服務器注冊的所有二級域名。當收到DNS查詢請求時,就會給出相應的回答(可能是最后的結果,也可能是下一步應當找的域名服務器的IP地址)。
還是上例,訪問www.baidu.com,根域名服務器告知了本地域名服務器com域名服務器的IP地址,本地域名服務器就求助于com域名服務器,com域名服務器中存放了對應不同二級域名的域名服務器的IP地址,如com域名服務器知道jianshu.com、baidu.com等所有xxx.com的對應域名服務的IP地址。com域名服務器就將baidu.com所對應的下一步的域名服務器告知給本地服務器。
??(4) 權限域名服務器:這就是前面說的權限域名服務器,它負責一個區,當權限域名服務器還不能給出最終的查詢回答時,就會告訴發出查詢請求的DNS客戶,下一步應到找哪一個域名服務器。
??為了提供域名服務器的可靠性,DNS域名服務器都把數據復制到幾個域名服務器來保存,其中的一個是主域名服務器(master name server),其他的是輔助域名服務器(secondary name server)。當主域名服務器出現故障時,輔助域名服務器可以保證DNS的查詢工作不會中斷。
4 域名解析過程
??第一,主機向本地域名服務器的查詢一般都是采用遞歸查詢(recursive query)。所謂的遞歸查詢就是:如果主機所詢問的本地域名服務器不知道被查詢域名的IP地址,那么本地域名服務器就以DNS客戶的身份,向其他根域名服務器繼續發出查詢請求報文(即替該主機繼續查詢),而不是讓該主機自己進行下一步查詢。因此,遞歸查詢返回的查詢結果或者所要查詢的IP地址,或者是報錯,表示無法查詢到所需的IP地址。
??第二,本地域名服務器向根域名服務器的查詢通常都是迭代查詢(interative query)。迭代查詢的特點是:當根域名服務器收到本地域名服務器發出的迭代查詢請求報文時,要么給出所要查詢的IP地址,要么告訴本地域名服務器下一步需要查詢的域名服務器,然后讓本地服務器進行后續的查詢而不是替本地域名服務器進行后續的查詢。根域名服務器通常是把自己知道的頂級域名服務器IP地址告訴本地域名服務器,讓本地域名服務器再向對應的頂級域名服務器查詢。頂級域名服務器在收到本地域名服務器的查詢請求后,要么給出所要查詢的IP地址,要么告訴本地域名服務器下一步應當向哪個權限域名服務器進行查詢,本地域名服務器就這樣進行迭代查詢。最后,知道了所要解析的域名的IP地址嗎,然后把這個結果返回給發起查詢的主機。當然,本地域名服務器也可以采用遞歸查詢,這取決于最初的查詢請求報文的設置是要求使用哪一種查詢方式。
對本地服務器來說,遞歸查詢靠別人,迭代查詢靠自己。
??舉個例子說明一下兩種查詢的區別,假定域名為m.xyz.com的主機想要知道另一臺主機(域名為www.baidu.com)的IP地址,下圖表示幾個查詢的步驟:
??(1) 主機m.xyz.com先向其本地域名服務器dns.xyz.com進行遞歸查詢。
??(2) 本地域名服務器采用迭代查詢。它向一個根域名服務器查詢。
??(3) 根域名服務器告訴本地域名服務器,下一次應查詢的頂級域名服務器dns.com的IP地址。
??(4) 本地域名服務器向頂級域名服務器dns.com進行查詢。
??(5 頂級域名服務器dns.com告訴本地域名服務器,下一次查詢的權限域名服務器的dns.baidu.com的IP地址。
??(6) 本地域名服務器向權限域名服務器dns.baidu.com進行查詢。
??(7) 權限域名服務器dns.baidu.com告訴本地域名服務器,所查詢的主機的IP地址。
??(8) 本地域名服務器dns.xyz.com最后把查詢結果告知主機m.xyz.com。
這8個步驟共要使用8個UDP用戶數據報(使用UDP是為了減少開銷)的報文。本地域名服務器經過三次迭代查詢后,從權限域名服務器dns.baidu.com得到了主機www.baidu.com的IP地址。
??而對于本地域名服務器使用遞歸查詢的情況下,本地域名服務器只需要向根域名服務器查詢一次,后面的幾次查詢都是在其他域名服務器之間的進行的,即遞歸靠別人,同樣,整個過程共使用了8個UDP報文。
??為了提高DNS查詢效率,并減輕根域名服務器的負荷和減少互聯網上的DNS查詢報文數量,在域名服務器中廣泛使用了高速緩存(DNS緩存)。高速緩存用來存放最近查詢過的域名以及從何處獲得域名映射信息的記錄。
例如,對于上例,如果在不久前已經有用戶出查詢過域名為www.baidu.com的IP地址,那么本地域名服務器就不必向根域名服務器重新查詢www.baidu.com的IP地址,而是直接把高速緩存中存放的上次查詢結果告訴用戶。
假如本地域名服務器的緩存中沒有www.baidu.com的IP地址,而是存放著頂級域名服務器dns.com的IP地址,那么本地域名服務器也可以不向根域名服務器進行查詢,而是直接向com頂級域名服務器發送查詢請求報文。
??高速緩存不僅可以大大減少根域名服務器的負荷,而且也能使互聯網的DNS查詢請求和回答報文數量的大大減少。
??由于名字到地址的綁定并不經常改變,為保持高速緩存中的內容正確,域名服務器應為每項內容設置計時器并處理超過合理時間的項(例如,每個項目只存方兩天)。當域名服務器已從緩存中刪去某項信息后又被請求查詢該項信息,就必須重新到授權管理該項的域名服務器去綁定信息。當權限域名服務器回答一個查詢請求時,在響應中都指明綁定的有效存在時間值。增加此時間值可減少網絡開銷,而減少此時間值可提高域名轉換的準確性。
??不但在本地域名服務器中需要高速緩存,在主機中也很需要。許多主機在啟動時從本地域名服務器下載名字和地址的全部數據庫,維護存放自己最近使用的域名的高速緩存,并且只在緩存中找不到名字時才使用本地域名服務器。維護本地域名服務器數據庫的主機自然應該定期檢查域名服務器以獲取新的映射信息,而且主機必須從緩存中刪除無效的項。由于域名改動并不頻繁,大多數網點不需要花太多精力就能維護數據庫的一致性。