解析URL獲得IP地址

導讀

上一篇總結中涉及到的是輸入URL的過程當中瀏覽器作出的一些反饋,這一篇將總結以後發生的事情。html

  • 瀏覽器判斷是URL仍是搜索關鍵字
  • 解析URL
  • DNS解析得到IP地址
  • 多IP域名DNS查詢解決方案
  • 什麼是域名(補充內容)

1.瀏覽器判斷是URL仍是搜索關鍵字

上一篇說到過瀏覽器有聯想查詢服務而且會根據輸入內容選擇搜索的方式。瀏覽器會去解析輸入的字符串,判斷是URL仍是搜索關鍵字,要是解析爲URL則開始尋求URL對應的IP地址,不然按照搜索關鍵字處理交給默認搜索引擎搜索。linux

2.解析URL

下面是參考百度百科-URL的定義給出的URL的解釋web

URL:(Uniform Resource Locator)統一資源定位符是對能夠從互聯網上獲得的資源的位置和訪問方法的一種簡潔的表示,是互聯網上標準資源的地址。互聯網上的每一個文件都有一個惟一的URL,它包含的信息指出文件的位置以及瀏覽器應該怎麼處理它。

通俗的解釋就是網絡資源的地址,全部你在瀏覽器上加載的內容都有一個地址,這個地址就是URL。經過瀏覽器的開發者工具能夠查看一次網頁加載的時候所請求的資源,這裏的每個連接都是一個URL。chrome

下面以一個去旅館裏找人的場景解釋什麼是URL。你要去旅館找一我的你必須知道他住在那個房間,這時候房間號就是你要找的人對應的地址,也就是這個場景下的URL數據庫

2.1常見URL格式

旅館的房間號有着特定的編碼方式,有的旅館爲了圖吉利會以8開頭進行編碼,好比1樓1號房間會以8101的形式編碼。URL編碼也是這樣有本身的編寫規則。windows

URL的語法隨訪問資源和服務的協議不一樣而不一樣。URL的最多見的格式以下:瀏覽器

protocol://hostname[:port]path search hash
  • protocol(協議)表示訪問資源和服務的協議。例如http,ftp,mailto和file等。
  • hostname(主機名)表示資源所在主機的徹底限定域名,例如www.baidu.com。
  • port(端口)表示協議使用的TCP端口號,具體的端口號是可選的,省略端口號時前面的冒號也要省略,即表示採用"最著名的端口"。HTTP協議的經常使用端口爲80,通常採用默認省略的模式。
  • path(路徑)表示資源的目錄/文件路徑名。
  • search查找元素表示URL中傳遞的查詢字符串。
  • hash散列符元素表示指定的文件偏移量,包括散列符(#)加上該文件偏移量相關的位置點名。

一個URL由不一樣的部分組成,其中一些是必須的,而另外一些是可選的。讓咱們如下面這個URL爲例看看其中最重要的部分:緩存

http://www.example.com:80/path/to/myfile.html?key1=value1&key2=value2#SomewhereInTheDocument
  • http:// 是協議。它代表了瀏覽器必須使用何種協議。它一般都是HTTP協議或是HTTP協議的安全版,即HTTPS。Web須要它們兩者之一,但瀏覽器也知道如何處理其餘協議,好比mailto:(打開郵件客戶端)或者 ftp`:(處理文件傳輸)。安全

  • www.example.com 是域名。 它代表正在請求哪一個Web服務器。或者,能夠直接使用IP地址, 可是由於它不太方便,因此它不常常在網絡上使用。.服務器

  • :80 是端口。 它表示用於訪問Web服務器上的資源的技術「門」。若是Web服務器使用HTTP協議的標準端口(HTTP爲80,HTTPS爲443)來授予其資源的訪問權限,則一般會被忽略。不然是強制性的。下面章節會有對端口號知識的補充。

  • /path/to/myfile.html 是網絡服務器上資源的路徑。在Web的早期階段,像這樣的路徑表示Web服務器上的物理文件位置。現在,它主要是由沒有任何物理現實的Web服務器處理的抽象。

  • ?key1=value1&key2=value2 是提供給網絡服務器的額外參數。 這些參數是用 & 符號分隔的鍵/值對列表。在返回資源以前,Web服務器可使用這些參數來執行額外的操做。每一個Web服務器都有本身關於參數的規則,惟一可靠的方式來知道特定Web服務器是否處理參數是經過詢問Web服務器全部者。

  • #SomewhereInTheDocument 是資源自己的另外一部分的錨點. 錨點表示資源中的一種「書籤」,給瀏覽器顯示位於該「加書籤」位置的內容的方向。例如,在HTML文檔上,瀏覽器將滾動到定義錨點的位置;在視頻或音頻文檔上,瀏覽器將嘗試轉到錨表明的時間。值得注意的是,#後面的部分(也稱爲片斷標識符)歷來沒有發送到請求的服務器。

2.2 端口號知識小補充

一臺服務器爲何能夠同時是Web服務器,也能夠是FTP服務器,還能夠是郵件服務器等,其中一個很重要的緣由是各類服務採用不一樣的端口分別提供不一樣的服務,好比:一般TCP/IP協議規定Web採用80號端口,FTP採用21號端口等,而郵件服務器是採用25號端口。這樣,經過不一樣端口,計算機就能夠與外界進行互不干擾的通訊。服務器端口數最大能夠有65535個,可是實際上經常使用的端口才幾十個。

根據端口號的性質劃分,能夠分爲3類

  • 公認端口:這類端口也常稱之爲"經常使用端口"。這類端口的端口號從0到1023,它們緊密綁定於一些特定的服務。

    • HTTP:80
    • FTP:21
    • Telent:23
    • SMTP:25
    • POP3:110
  • 註冊端口:端口號從1024到49151。它們鬆散地綁定於一些服務。好比Express啓動web服務器的時候佔用3000端口。
  • 動態和/或私有端口:端口號從49152到65535。理論上,不該把經常使用服務分配在這些端口上。實際上,有些較爲特殊的程序,特別是一些木馬程序就很是喜歡用這些端口,由於這些端口經常不被引發注意,容易隱蔽。

2.3 URL編碼

一般若是同樣東西須要編碼,說明這樣東西並不適合傳輸。緣由多種多樣,如Size過大,包含隱私數據,對於Url來講,之因此要進行編碼,是由於Url中有些字符會引發歧義。Url的編碼格式採用的是ASCII碼,而不是Unicode,這也就是說你不能在Url中包含任何非ASCII字符,例如中文。不然若是客戶端瀏覽器和服務端瀏覽器支持的字符集不一樣的狀況下,中文可能會形成問題。因此須要對非ASCII碼進行編碼,這也便於後續的DNS查詢。

網址URL中常見特殊字符轉義編碼

字符 - URL編碼值

空格 - %20

" - %22

# - %23

% - %25

& - %26

( - %28

) - %29

+ - %2B

, - %2C

/ - %2F

: - %3A

; - %3B

< - %3C

= - %3D

> - %3E

? - %3F

@ - %40

- %5C

| - %7C

URL特殊字符轉義,URL中一些字符的特殊含義,基本編碼規則以下:

一、空格換成加號(+)
二、正斜槓(/)分隔目錄和子目錄
三、問號(?)分隔URL和查詢
四、百分號(%)制定特殊字符
五、#號指定書籤
六、&號分隔參數

若是須要在URL中用到,須要將這些特殊字符換成相應的十六進制的值
+ %2B
/ %2F
? %3F
% %25
# %23
& %26

3. DNS解析得到IP地址

通過以前的URL解析以後,可以知道咱們要訪問的主機名,端口號以及請求資源的路徑等信息,可是還有一個問題沒有解決,就是去哪獲取這些資源(資源的真正地址)。

舉個例子,就比如你的朋友請你吃黃燜雞米飯(URL),你知道本身的目的地是一家叫黃燜雞米飯的店,可是你會發如今你的附近有N多家黃燜雞米飯,你想要再具體一點,好比說「青島市黃島區長江西路66號中國石油大學對面的黃燜雞大樓(IP)」。有了這個地址你能夠很輕鬆的找到目的地。

那爲何搞那麼複雜,不直接使用IP地址要先搞個URL而後去進行域名解析呢?主要是IP地址在網絡上用起來不方便,難於記憶,用域名(別稱)方便一些。你可能記不住百度的IP地址,可是你能記住www.baidu.com。從URL中解析出IP地址的過程就是DNS解析。

3.1什麼是DNS

DNS具備兩層含義

  • 一個由分層的DNS服務器實現的分佈式數據庫;
  • 一個容許主機查詢分佈式數據庫的應用層協議。

有三種類型的DNS服務器:根DNS服務器、頂級DNS服務器和權威DNS服務器。這些服務器如下圖的層次結構組織起來。

除此以外,還有一類重要的DNS,稱爲本地DNS服務器。嚴格來講本地DNS服務器並不屬於DNS服務器的層次結構,但它在整個查詢的過程當中卻扮演着重要的角色。

3.2解析IP地址查找的順序

(1)首先查找的是瀏覽器的DNS緩存

瀏覽器會緩存DNS記錄一段時間。因此瀏覽器會先去查本身的緩存,要是域名在緩存中有記錄則使用緩存中的IP進行下一步處理。要是沒有則進行下一步查找。對於chrome可使用chrome://net-internals/#dns查看當前緩存的DNS,不一樣瀏覽器保存的時間長短不一。

(2)查詢系統緩存

若是瀏覽器緩存中沒有,瀏覽器會去查找系統中記錄的DNS信息。首先檢查域名是否在本地 hosts 裏,再查系統本地緩存的其餘DNS 記錄。

hosts是一個沒有擴展名的系統文件,其基本做用就是將一些經常使用的網址域名與其對應的 IP 地址創建一個關聯「 數據庫 」。

查看windows的dns緩存的命令ipconfig /displaydns,linux若是啓用了nscd 服務,纔有dns 緩存,不然是沒有dns緩存的

(3)查路由器緩存

若是在系統緩存裏面仍是沒找到對應的IP,那麼接着會發送一個請求到路由器上,而後路由器在本身的路由器緩存上查找記錄,路由器通常也存有DNS信息(緩存你上過的網站,因此有時路由器須要進行DNS刷新)

(4) ISP DNS緩存

若是本地路由器仍是沒有,這個請求就會被髮送到ISP(注:Internet Service Provider,互聯網服務提供商,所謂的電信網,聯通網和移動網),ISP也會有相應的ISP DNS服務器。

會跑到這裏進行查詢是由於你沒有改動過」網絡中心」的」ipv4」的DNS地址,萬惡的運營商能夠改動這個DNS服務器,換句話說他們可讓你的瀏覽器跳轉到他們設定的頁面上,這也就是人盡皆知的DNS和HTTP劫持。咱們也能夠自行修改DNS服務器來防止DNS被ISP污染。

這裏也分享一個小技巧,在校園網環境下更改ipv6的DNS能夠輕鬆的瀏覽YouTube等網站,傳送門

PS:這裏經過發送DNS查詢報文給ISP也是頗有深度的,首先你要知道ISP的IP地址。若是 DNS 服務器和咱們的主機在同一個子網內,須要對 DNS 服務器進行 ARP查詢;若是 DNS 服務器和咱們的主機在不一樣的子網,則會對默認網關進行查詢。ARP請求部分以後再詳細的補充。

(5)遞歸DNS查詢

若是在ISP DNS服務器尚未查到的話,那麼就要進行DNS遞歸查詢了。假設我須要www.baidu.com的IP

首先,瀏覽器所在的主機向本地DNS服務器發送一個含有百度域名的DNS查詢報文。本地DNS服務器把查詢報文轉發到根DNS服務器,該根DNS服務器注意到其com後綴並向本地DNS服務器返回com的頂級域名服務器的IP地址。該本地DNS服務器再次向comDNS服務器發送查詢請求,comDNS服務器注意到其www.baidu.com後綴並用負責該域名的權威DNS服務器的IP地址做爲迴應。最後,本地域名服務器將含有www.baidu.com的IP地址的響應報文發送給客戶端主機。

www.baidu.com在本地域名服務器上找不到

  1. 這時候本地域名服務器就會到根域名服務器查找,根域名服務器說這個是一個.com域名。
  2. 而後本地域名服務器就跑到管理.com域名的服務器上進行進一步查詢,頂級域名服務器說是 .baidu二級域名。
  3. 最後本地域名服務器再跑到管理 .baidu這個二級域名所在的權限域名服務器,去查詢 www這個三級域名的ip 地址。

因此域名結構爲:三級域名.二級域名.一級域名。

這裏的查詢過程是包含遞歸查詢和迭代查詢的,客戶端主機發送給本地服務器的查詢是遞歸查詢,然後面的三個查詢是迭代查詢。

不是全部域名都可以查到IP的,什麼緣由你懂得

4.多IP域名DNS查詢解決方案

並非一個域名只能對應到一個IP地址的,IP地址是鏈接互聯網主機的一個身份證,通常一臺主機只有一個IP地址,像一些大型的網站怎麼可能只有一臺主機,因此多個IP是必然的。經過查詢有一下幾種方式來解決這個問題,本身的理解有限,只列出不深究。

  1. 循環DNS —— 單個域名、多個IP列表循環應對DNS查詢
  2. 負載均衡器 —— 一個特定IP的負載均衡服務器(例如:反向代理服務器)負責監聽請求並轉發給後面的多個服務器集羣的某一個,實現多個服務器負載均衡。 並且如今不少雲服務都有提供負載均衡服務,好比AWS 的 ELB。
  3. 地理DNS —— 根據用戶所處地理位置,返回不一樣的IP(應用:CDN)
  4. anycast —— 一個IP地址映射多個物理主機的路由技術

5.什麼域名(補充內容)

5.1域名的組成

.分隔的字符串,每一部分有特定的含義。查看域名的時候習慣是從左往右讀,可是應該從右往左理解,能夠參考上邊www.baidu.com的解析過程。

主要能夠分類兩個部分TLD和標籤

  • TLD(Top-Level Domain,頂級域名)

頂級域名提供了最多的信息。頂級域名告訴用戶通用服務背後的域名。最通用的頂級域名(.com, .org, .net)不須要web服務器知足嚴格的標準,但一些頂級域名則執行更嚴格的政策。好比本地的頂級域名,如.us.fr,或.sh,能夠要求必須提供給定語言的服務器或者託管在指定國家。

  • 標籤 (或者說是組件)

標籤都是跟隨着TLD的。一個標籤能夠是任何東西,從一個字母到一個句子。恰好位於TLD前面的標籤也被稱爲二級域名 (SLD)。一個域名能夠有多個標籤(或者說是組件),沒有強制規定必需要3個標籤來構成域名。例如,www.ecnu.edu.cn是一個正確的域名。當擁有了「上級」部分(例如qq.com),你還能夠建立另外的域名 (有時被稱爲 "子域名") (例如 mail.qq.com).

在Linux中可使用whois命令查看域名信息

Reference

相關文章
相關標籤/搜索