1.2向DNS服務器查詢Web服務器的IP地址
~~~
生成HTTP消息之后,接下來我們需要委托操作系統(tǒng)將消息發(fā)送給Web服務器。盡管瀏覽器能夠解析網(wǎng)址并生成HTTP消息骡技,但它本身并不具備將消息發(fā)送到網(wǎng)絡中的功能慢哈,因此這一功能需要委托操作系統(tǒng)來實現(xiàn)酌予。
發(fā)送消息的功能對于所有的應用程序來說都是通用的,因此讓操作系統(tǒng)來實現(xiàn)這一功能冰单,其他應用程序委托操作系統(tǒng)來進行操作幌缝,這是一個比較合理的做法。
網(wǎng)絡號和主機號
在網(wǎng)絡中诫欠,所有的設備都會被分配一個地址涵卵。這個地址就相當于現(xiàn)實中某條路上的“××號××室”。其中“號”對應的號碼是分配給整個子網(wǎng)的荒叼,而“室”對應的號碼是分配給子網(wǎng)中的計算機的轿偎,這就是網(wǎng)絡中的地址”焕“號”對應的號碼稱為網(wǎng)絡號坏晦,“室”對應的號碼稱為主機號,這個地址的整體稱為IP地址嫁乘。
實際的IP地址是一串32比特的數(shù)字昆婿,按照8比特(1字節(jié))為一組分成4組,分別用十進制表示然后再用圓點隔開蜓斧。
在IP地址的規(guī)則中仓蛆,網(wǎng)絡號和主機號連起來總共是32比特,但這兩部分的具體結構是不固定的挎春。在組建網(wǎng)絡時看疙,用戶可以自行決定它們之間的分配關系豆拨,因此,我們還需要另外的附加信息來表示IP地址的內(nèi)部結構能庆。
子網(wǎng)掩碼為1的部分表示網(wǎng)絡號施禾,子網(wǎng)掩碼為0的部分表示主機號。
IP地址的主機號
全0:表示整個子網(wǎng)
全1:表示向子網(wǎng)上所有設備發(fā)送包搁胆,即“廣播”
現(xiàn)在我們使用的方案是讓人來使用名稱弥搞,讓路由器來使用IP地址。為了填補兩者之間的障礙丰涉,需要有一個機制能夠通過名稱來查詢IP地址拓巧,或者通過IP地址來查詢名稱,這樣就能夠在人和機器雙方都不做出犧牲的前提下完美地解決問題一死。這個機制就是DNS肛度。(IP地址效率高,域名方便使用)
Socket庫提供查詢IP地址的功能
通過DNS查詢IP地址的操作稱為域名解析投慈,因此負責執(zhí)行解析(resolution)這一操作的就叫解析器(resolver)了承耿。解析器實際上是一段程序,它包含在操作系統(tǒng)的Socket庫中伪煤。庫就是一堆通用程序組件的集合加袋,其他的應用程序都需要使用其中的組件。
Socket庫也是一種庫抱既,其中包含的程序組件可以讓其他的應用程序調(diào)用操作系統(tǒng)的網(wǎng)絡功能职烧,而解析器就是這個庫中的其中一種程序組件。Socket庫中包含很多用于發(fā)送和接收數(shù)據(jù)的程序組件防泵。socket 庫適用于調(diào)用網(wǎng)絡功能程序組件的集合蚀之。
通過解析器向DNS服務器發(fā)出查詢
根據(jù)域名查詢IP時,瀏覽器會使用 socket 庫中的解析器捷泞。
調(diào)用解析器后足删,解析器會向DNS服務器發(fā)送查詢消息,然后DNS服務器會返回響應消息锁右。響應消息中包含查詢到的IP地址失受,解析器會取出IP地址,并將其寫入瀏覽器指定的內(nèi)存地址中咏瑟。
解析器的內(nèi)部原理
網(wǎng)絡應用程序(在我們的場景中就是指瀏覽器)調(diào)用解析器時拂到,程序的控制流程就會轉(zhuǎn)移到解析器的內(nèi)部。
由于調(diào)用了其他程序码泞,原本運行的程序進入暫停狀態(tài)兄旬,而被調(diào)用的程序開始運行,這就是“控制流程轉(zhuǎn)移”浦夷。
當控制流程轉(zhuǎn)移到解析器后辖试,解析器會生成要發(fā)送給DNS服務器的查詢消息。
發(fā)送消息這個操作并不是由解析器自身來執(zhí)行劈狐,而是要委托給操作系統(tǒng)內(nèi)部的協(xié)議棧來執(zhí)行罐孝。這是因為和瀏覽器一樣,解析器本身也不具備使用網(wǎng)絡收發(fā)數(shù)據(jù)的功能肥缔。解析器調(diào)用協(xié)議棧后莲兢,控制流程會再次轉(zhuǎn)移,協(xié)議棧會執(zhí)行發(fā)送消息的操作续膳,然后通過網(wǎng)卡將消息發(fā)送給DNS服務器改艇。
向DNS服務器發(fā)送消息時,我們當然也需要知道DNS服務器的IP地址坟岔。只不過這個IP地址是作為TCP/IP的一個設置項目事先設置好的谒兄,不需要再去查詢了。