天天看點

探索浏覽器内部——向DNS伺服器查詢Web伺服器的IP位址1、IP位址的基本知識:2、域名和IP位址并用的理由:3、Socket庫提供查詢IP位址的功能:4、通過解析器向DNS伺服器發出查詢:5、解析器的内部原理:

1、IP位址的基本知識:

上一篇文章從宏觀上講解了在浏覽器輸入URL或者通過點選超級連結等方式之後,浏覽器所做的工作(解析URL和生成HTTP消息),那麼在生成HTTP消息之後,我們就需要委托作業系統将消息發送給Web伺服器。沒錯,浏覽本身并不具備将消息發送到網絡的功能。

但是在委托作業系統發送消息之前,還需要查詢網址中伺服器域名對應的IP位址。接下來,先簡單了解一下IP位址。

在網絡中,所有裝置都會被配置設定一個位址,這與現實中的所謂的位址類似。例如“xx号xx室”,“号”相當于是配置設定給整個子網的,“室”是配置設定給子網中的計算機的,它們分别對應的是IP位址中的網絡号和主機号。那麼,什麼稱為子網呢?基本上可以了解為是多個單一的網絡裝置或者多個已經成組的網絡裝置組合而成的。以TCP/IP思路為例,下圖很形象的描述了子網的概念:

探索浏覽器内部——向DNS伺服器查詢Web伺服器的IP位址1、IP位址的基本知識:2、域名和IP位址并用的理由:3、Socket庫提供查詢IP位址的功能:4、通過解析器向DNS伺服器發出查詢:5、解析器的内部原理:

消息先經過子網中的集線器,轉發到距離發送者最近的路由器上,接下來,路由器會根據消息的目的地判斷下一個路由器的位置,然後不斷的重複,最終消息到達目的地。

在了解了TCP/IP的基本思路之後,反過來再看IP位址,目前的大環境下我們使用的還是IPv4,是以我們現在的IP位址是一串32比特的數字,按照8比特(一位元組)為一組分四組。常用的IP表示法如下:

(a)IP位址主體的表示方法

10.11.12.13

(b)采用與IP位址主體相同的格式表示子網路遮罩的方法

10.11.12.13(IP位址主體)/255.255.255.0(子網路遮罩)

(c)采用網絡号比特數來表示子網路遮罩的方法

10.11.12.13(IP位址主體)/24(子網路遮罩)

(d)表示子網的位址

10.11.12.0(主機号部分的比特全部為0,這個位址表示的不是單獨一台計算機,而是代表整個子網)/24

(e)表示子網内廣播的位址

10.11.12.255(主機号部分的比特數全為1,這個位址表示對整個子網進行廣播)/24

大家可能對子網路遮罩比較好奇,其實這隻是一種表示方式,我們隻要記住子網路遮罩中為1部分對應的IP位址主體代表網絡号,為0部分對應的IP位址主體代表主機号就可以了。

2、域名和IP位址并用的理由:

正如前面所述,我們需要通過域名得知IP位址之後才能夠将消息發送給對應的目标,那麼,理所當然的,如果将URL中域名部分改為對應的IP位址同樣也是可以發送成功的,隻是這樣不友善我們記憶和操作,是以一般不這麼做。

3、Socket庫提供查詢IP位址的功能:

查詢IP位址隻要詢問最近的DNS(Dimain Name System 域名服務系統)伺服器就可以了。向DNS伺服器發出查詢,也就是向DNS伺服器發送查詢消息,并收到伺服器傳回的響應消息,那麼我們的計算機上就必須有相應的DNS用戶端,一般我們稱DNS用戶端為DNS解析器,而通過DNS查詢IP位址的操作稱為域名解析。

解析器其實就是一段程式,它包含在作業系統的Socket庫(是在加州大學伯克利分校開發的UNIX系作業系統BSD中開發的C語言庫,網際網路中所使用的大多數功能都是基于Socket庫來開發的)中的,其它應用程式可以通過Socket庫調用系統的網絡功能。

4、通過解析器向DNS伺服器發出查詢:

前面講了解析器其實就是一段程式,那麼下面以C語言為例,簡單描述應用程式調用解析器的過程(其中gethostbyname為解析器的程式名):

<應用程式名> (參數)
{
    ...
    ...
    <記憶體位址> = gethostbyname("www.lab.glasscom.com");
    ...
    ...
    <發送HTTP消息>
    ...
}
           

5、解析器的内部原理:

當程式運作到 <記憶體位址> = gethostbyname("www.lab.glasscom.com");這行代碼的時候,程式的控制流程就會轉移到解析器的内部,也就是說,此時應用程式會暫停,控制流程會進入到Socket庫中的gethostbyname(...)方法并生成将要發送給DNS伺服器的查詢消息。當然了解析器并不會親自發送查詢消息,同樣的而是委托給了作業系統内的協定棧(作業系統内部的網絡控制軟體,也叫“協定驅動”或者“TCP/IP驅動”等)來執行。那麼控制流程會進入協定棧并最後通過網卡将消息發送給DNS伺服器。DNS伺服器在接收到請求消息之後會進過一個複雜的查詢(先不在這裡詳述)将對應的IP位址放入響應消息并傳回,最終以發送消息相反的形式從協定棧再一步步回到應用程式。

其實,當目前為止還有一個我們忽略的前提,那就是在進行DNS解析之前,我們需要事先知道DNS伺服器的IP位址,但是一般這個IP位址不用我們親自設定,作業系統會預設設定。

繼續閱讀