前言:

筆者最近閱讀大量網路原理相關書籍,因此總結出此文,讀完本文,讀者們應該要了解下面名詞:

瀏覽器、Web伺服器、網址(URL)、HTTP、HTML、協議、URI、請求消息、解析器、Socket庫、DNS伺服器、域名

生成HTTP請求消息

向DNS伺服器查詢Web伺服器的IP地址

DNS伺服器的互相配合(如何找出IP地址)

委託協議棧發送消息

生成HTTP請求消息

1、從網址開始

我們看NBA,要在瀏覽器輸入某個nba網址吧,沒錯。就是那串http://開頭的那串玩意兒, sports.qq.com/,如下圖,只不過瀏覽器把前面的http://隱藏而已,複製可以見到完整網址。

這串玩意兒叫網址,更準確的叫URL(統一資源定位符)

我們一般訪問的是Web伺服器,但實際上瀏覽器還有很多功能,FTP(文件傳輸協議)伺服器上下載和上傳文件,同時也具備電子郵件客戶端的功能。所以有各種不同的URL。訪問Web伺服器用「http」,而訪問FTP伺服器用「ftp」.下面圖一列舉了互聯網常見的幾種URL,不??喜歡看請忽略。

在此,請對域名,有個淺顯了解。往後會詳細介紹。

域名:像baidu.com這樣以句點(.)分隔的名稱。

URL開頭的文字,即 「http:」 「file:」 「mailto:」 這部分文字都表示文字都表示瀏覽器應當使用的訪問方法。比如訪問Web伺服器時應該使用HTTP協議,而訪問FTP伺服器則應該使用FTP協議。因為,我們可以把這部分理解為訪問時使用的協議類型

HTTP協議:超文本協議

2、HTTP的思路

HTTP協議定義了客戶端和服務端之間交互的消息內容和步驟。

首先,客戶端向伺服器發送請求消息,請求消息包含兩部分(「對什麼」和「進行怎樣的操作」)。「對什麼」是指訪問目標(URI),「進行怎樣的操作」則是指方法,也稱HTTP謂詞。收到請求消息後,Web 伺服器會對其中的內容進行解析,通過接收的URI和方法完成自己的工作,然後將結果存放在響應消息中,返回給客戶端。

3、生成HTTP請求消息

使用GET方法的情況下,僅憑方法和URI,Web 伺服器就能判斷需要進行怎樣的操作,因此消息體中不需要填寫任何數據。而POST則需要消息體。

4、返迴響應消息

我們把請求消息發送出去之後,Web伺服器會返迴響應消息。其中會有狀態碼和響應短語。

1條請求消息中只可以寫1個uRI,所以每次只能獲取1個文件。比如1個頁面中包含3張圖片,那麼獲取網頁加上獲取圖片,一共需要向Web伺服器發送4條請求。

向DNS伺服器查詢Web伺服器的IP地址

1、IP地址的基本知識

生成HTTP消息之後,我們需要委託操作系統將消息發送給Web伺服器。

因為瀏覽器只能解析網址並生成HTTP消息,但它本身不具將消息發送到網路中的功能,只能委託操作系統。操作系統發送消息,必須提供IP地址,而不是通信對象的域名(前面說過,類似baidu.com的一串玩意)。所以生成HTTP消息的下一個步驟就是根據根據域名查詢IP地址。

IP地址科普:

互聯網和公司內部的區域網都是基於TCP/IP的思路來設計,TCP/IP結構是由一些小的子網,通過路由器連接起來組成一個大網路。這裡的子網暫時可以理解為幾台計算機。

在網路中,所有的設備都會被分配一個地址。這個地址就相當於現實中某條路上的「xx號xx室」。其中「號」是分配給整個子網的,而「室」對應的號碼稱為網路號,「室」對應的號碼稱為主機號,這個地址的整體叫做IP地址。

通過IP地址,我們可以判斷出對象伺服器的位置,從而將消息發送到伺服器。實際的IP地址是一串32比特的數字,按照8比特(1位元組)為一組分成4組,分別用十進位表示,然後再用圓點隔開。eg:「10.11.12.13」、「202.96.128.86」

2、域名和IP地址並用的理由

TCP/IP網路是通過IP地址來確定通信對象,因此不知道IP地址就無法將消息發送給對方,這跟我們打電話需要知道對方的電話號碼一樣才可以。

可能有人會問,為什麼不直接用IP地址去訪問網址,確實,我們直接輸入IP地址是可以訪問的。但是IP地址那串數字,難以記住。比如百度的網址,不是「www.baidu.com」,而是「202.96.128.99」,你怎麼記住呢?

然後你可能又會問,幹麼不直接用域名去確定通信對象呢,其實,這是可以的,但是這會影響運行效率。

IP地址的長度為32比特(4位元組),而域名最短的也要幾十個位元組,最長甚至可以達到255位元組。位元組長而且長短不一,處理起來非常複雜,所以這影響了效率(增加路由器的負擔)。

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

DNS伺服器可以幫我們查詢到IP地址。

通過DNS伺服器發出查詢的操作成為域名解析。負責解析的這個操作就叫做解析器,解析器它是一段程序,包含在操作系統的Socket庫中(Socket庫包含很多發送和接受數據的程序組件,是網路開發的一種標準庫)。Socket庫是標準組件,我們從應用程序進行調用即可。如果,解析器的程序名稱為「getIPadressWithDN」,以及需要解析的域名為「www.baidu.com」,過程如下:

4、解析器的內部原理

解析器生成要給DNS伺服器的查詢消息,但是解析器本身也不具備使用網路收發數據的功能(之所以用「也」,是因為這一過程跟瀏覽器生成HTTP消息發送給Web伺服器類似),所以需要委託協議棧(操作系統內部的網路控制軟體,也叫「協議驅動」、「TCP/IP驅動」)執行操作,再通過網卡發給DNS伺服器。

網路程序調用解析器,程序的控制流程會發生轉移。那麼「控制流程轉移」指的是什麼呢?

一般來說,應用程序編寫的操作內容是從上往下按順序執行的,當到達需要調用解析器的部分時,對應的那一行程序就會執行,應用程序本身的工作就會暫停,然後,Socket庫的解析器開始運行,完成應用程序委託的操作。像這樣,由於調用其他的程序,原本運行的程序進入暫停狀態,而被調用程序的開始運行。這就是「控制流程轉移」。

DNS伺服器的互相配合

1、DNS伺服器的基本工作

DNS的基本工作就是接受來自客戶端查詢消息,然後根據消息的內容返迴響應。其中,客戶端的消息包含3中信息

1、域名:

伺服器、郵件伺服器(郵件地址中@後面的部分)的名稱2、Class:它的值永遠為「IN」3、記錄類型:表示域名對應何種類型的記錄。當類型為A(Address)時,表示域名對應的是IP地址;MX(Mail eXchange)時,則表示域名對應的是郵件服務。

一、查詢「www.baidu.com」IP地址:

域名=baidu.com、Class = IN、記錄類型=A

二、查詢「[email protected]」郵件伺服器:

域名=qq.com」、Class = IN、記錄類型=MX

2、域名的層次結構

互聯網中不計其數的伺服器,所以存儲他們信息的只用一台DNS伺服器是不可能的,需要將信息分布在多台DNS伺服器,然後它們相互接力配合,從而查找出要查的信息。DNS伺服器中所有信息都是按照域名以分層次的結構保存。類似公司中的事業集團、部門、科室結構。

DNS中的域名是用句點來分隔的,域名越靠右的位置表示層級越高。比如:「www.ituring.com.cn」域名,cn 是公司集團,com是研發部,ituring是後台小組,所以可以理解為某公司集團cn下的com 研發部的ituring後台小組的www。其中相當一個層級的部分稱為域,即com域的下一層級是ituring 域, 再下一層才是 www 這個名字

cn是國家頂級域名,中國是cn,美國是us,日本是jp,表示工商企業的.com,表示網路提供商的.net,表示非盈利組織的.org等

有時我們會看到類似這種「sports.qq.com」、「finance.qq.com 」,這兩者有什麼關聯嗎?

這兩者其實就是某訊旗下的體育和金融版本,「qq.com」是他的公司域,因為不可能說一個公司的不同板塊(或者說不同的事業集團),我給你公司多個DNS伺服器,一個域是不可分割的。解決辦法是建立子域。例如某訊就是在公司域「qq.com」的下面建立子域「sports.qq.com」、「finance.qq.com

尋找相應的DNS伺服器並找到IP地址

找到DNS伺服器中存放的信息,關鍵是找到信息歸哪台DNS伺服器管。

互聯網有無數台DNS伺服器,不可能一台一台挨個找。所以採取以下方法。首先,將負責管理下級域的DNS伺服器的IP地址註冊到他們的上級DNS伺服器中,然後上級DNS伺服器的IP地址再註冊到更高一級的DNS伺服器中,以此類推。

在互聯網中,比com和cn更高一級,稱為根域。根域在域名的最後加上一個點,如「www.baidu.com.」最後的那個句點代表根域名,但是那個句點經常被省略,根域的DNS伺服器保管著com、cn等DNS伺服器的信息。由於上級DNS伺服器保管著所有下級DNS伺服器的信息,所以我們可從根域開始一路往下順藤摸瓜找到任意一個域的DNS伺服器。

另外,根域的DNS伺服器信息存在互聯網中所有的DNS伺服器中。分配給根域DNS伺服器的IP地址只有13個。

下面以「www.gov.cn」和「sports.qq.com」舉例說明DNS伺服器查找流程

客戶端首先會訪問最近的一台DNS伺服器(也就是客戶端的TCP/IP設置中填寫的DNS伺服器地址),假設我們要查找「sports.qq.com」這台Web伺服器相關信息,但由於最近的DNS伺服器沒有存放「sports.qq.com」這一域名對應的信息,所以從該伺服器獲取根域的地址,把查詢消息轉發給根域,繼續從根域查找,根域沒有該域名信息,繼續往下找,去到com域找,com域沒有「sports.qq.com」的信息,所以返回他下一級的「qq.com」域的DNS伺服器IP地址,繼續往下找…

通過緩存加快DNS伺服器的響應

有時候不需要從最上級的根域開始查找,因為DNS伺服器有一個緩存功能,可以記住之前的域名。如果要查詢的域名和相關信息已經在緩存中,那麼可以直接從緩存處得到所需信息,然後從緩存位置開始向下查找。這樣對比與從根域開始,減少了查詢時間。

當查詢的域名不存在時,緩存也會存儲起來,下次查詢時,直接快速反應。如果信息被緩存了,原本的註冊信息可能會發生改變,那麼緩存中的信息就可能不正確了,因此,DNS伺服器中保存的信息設置一個有效期,當緩存中的信息超過有效期後,數據就會從緩存中刪除。

委託協議棧發送消息

數據收發操作

獲悉ip之後,就可以委託操作系統內部的協議棧發送消息到目標IP地址,也就是發送到Web伺服器,發送給Web伺服器的HTTP消息是一種數字消息。

簡單來說,整體思路就是收發數據的兩台計算機之間連接了一個數據通道,數據沿著這個通道流動,最終到達目的地,會在目的地的那一端被取出。數據流動是雙向的,可以從任何一個端流入。

實際過程,可把收發數據總結為四步:

1、創建套接字(創建套接字階段)

2、將管道連接到伺服器端的套接字上(連接階段)

3、收發數據(通信階段)

4、斷開管道並刪除套接字(斷開階段)

註:本文轉載自程序員大咖秀微信公眾號;文內觀點僅供參考。

推薦閱讀:

相关文章