筆者最近閱讀大量網絡原理相關書籍,所以總結出此文,讀完本文,讀者們應該要了解下面名詞:瀏覽器
瀏覽器、Web服務器、網址(URL)、HTTP、HTML、協議、URI、請求消息、解析器、Socket庫、DNS服務器、域名緩存
網絡原理系列文章:服務器
1、五分鐘瞭解網絡鏈接(已完成)網絡
2、收發數據的原理(上)(已完成)post
3、收發數據的原理(下)(已完成)操作系統
4、收發數據的番外篇(未完成).net
咱們看NBA,要在瀏覽器輸入某個nba網址吧,沒錯。就是那串http://開頭的那串玩意兒, sports.qq.com/,以下圖,只不過瀏覽器把前面的http://隱藏而已,複製能夠見到完整網址。 設計
這串玩意兒叫網址,更準確的叫URL(統一資源定位符)咱們通常訪問的是Web服務器,但實際上瀏覽器還有不少功能,FTP(文件傳輸協議)服務器上下載和上傳文件,同時也具有電子郵件客戶端的功能。因此有各類不一樣的URL。訪問Web服務器用「http」,而訪問FTP服務器用「ftp」.下面圖一列舉了互聯網常見的幾種URL,不喜歡看請忽略。 在此,請對域名,有個淺顯瞭解。日後會詳細介紹。3d
域名:像www.baidu.com這樣以句點(.)分隔的名稱。cdn
URL開頭的文字,即 「http:」 「file:」 「mailto:」 這部分文字都表示文字都表示瀏覽器應當使用的訪問方法。好比訪問Web服務器時應該使用HTTP協議,而訪問FTP服務器則應該使用FTP協議。由於,咱們能夠把這部分理解爲訪問時使用的協議類型
HTTP協議:超文本協議
首先,客戶端向服務器發送請求消息,請求消息包含兩部分(「對什麼」和「進行怎樣的操做」)。「對什麼」是指訪問目標(URI),「進行怎樣的操做」則是指方法,也稱HTTP謂詞。收到請求消息後,Web 服務器會對其中的內容進行解析,經過接收的URI和方法完成本身的工做,而後將結果存放在響應消息中,返回給客戶端。
筆者認爲,URI強調的是給資源標記命名,URL強調的是給資源定位,URL顯然比URI包含信息更多,舉個例子,我是小肥仔,我是來自廣東深圳市光明區某路某小區201號房的小肥仔彭友。若是URI爲前者,則URL爲後者。
使用GET方法的狀況下,僅憑方法和URI,Web 服務器就能判斷須要進行怎樣的操做,所以消息體中不須要填寫任何數據。而POST則須要消息體。
咱們把請求消息發送出去以後,Web服務器會返回響應消息。其中會有狀態碼和響應短語。
1條請求消息中只能夠寫1個uRI,因此每次只能獲取1個文件。好比1個頁面中包含3張圖片,那麼獲取網頁加上獲取圖片,一共須要向Web服務器發送4條請求。
生成HTTP消息以後,咱們須要委託操做系統將消息發送給Web服務器。
由於瀏覽器只能解析網址並生成HTTP消息,但它自己不具將消息發送到網絡中的功能,只能委託操做系統。操做系統發送消息,必須提供IP地址,而不是通訊對象的域名(前面說過,相似www.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」
TCP/IP網絡是經過IP地址來肯定通訊對象,所以不知道IP地址就沒法將消息發送給對方,這跟咱們打電話須要知道對方的電話號碼同樣才能夠。
可能有人會問,爲何不直接用IP地址去訪問網址,確實,咱們直接輸入IP地址是能夠訪問的。可是IP地址那串數字,難以記住。好比百度的網址,不是「www.baidu.com」,而是「202.96.128.99」,你怎麼記住呢?
而後你可能又會問,幹麼不直接用域名去肯定通訊對象呢,其實,這是能夠的,可是這會影響運行效率。
IP地址的長度爲32比特(4字節),而域名最短的也要幾十個字節,最長甚至能夠達到255字節。字節長並且長短不一,處理起來很是複雜,因此這影響了效率(增長路由器的負擔)。
DNS服務器能夠幫咱們查詢到IP地址。
經過DNS服務器發出查詢的操做成爲域名解析。負責解析的這個操做就叫作解析器,解析器它是一段程序,包含在操做系統的Socket庫中(Socket庫包含不少發送和接受數據的程序組件,是網絡開發的一種標準庫)。Socket庫是標準組件,咱們從應用程序進行調用便可。若是,解析器的程序名稱爲「getIPadressWithDN」,以及須要解析的域名爲「www.baidu.com」,過程以下:
解析器生成要給DNS服務器的查詢消息,可是解析器自己也不具有使用網絡收發數據的功能(之因此用「也」,是由於這一過程跟瀏覽器生成HTTP消息發送給Web服務器相似),因此須要委託協議棧(操做系統內部的網絡控制軟件,也叫「協議驅動」、「TCP/IP驅動」)執行操做,再經過網卡發給DNS服務器。
網絡程序調用解析器,程序的控制流程會發生轉移。那麼「控制流程轉移」指的是什麼呢? 通常來講,應用程序編寫的操做內容是從上往下按順序執行的,當到達須要調用解析器的部分時,對應的那一行程序就會執行,應用程序自己的工做就會暫停,而後,Socket庫的解析器開始運行,完成應用程序委託的操做。像這樣,因爲調用其餘的程序,本來運行的程序進入暫停狀態,而被調用程序的開始運行。這就是「控制流程轉移」。
DNS的基本工做就是接受來自客戶端查詢消息,而後根據消息的內容返回響應。其中,客戶端的消息包含3中信息
一、域名: 服務器、郵件服務器(郵件地址中@後面的部分)的名稱 二、Class:它的值永遠爲「IN」 三、記錄類型: 表示域名對應何種類型的記錄。當類型爲A(Address)時,表示域名對應的是IP地址;MX(Mail eXchange)時,則表示域名對應的是郵件服務。
1、查詢「www.baidu.com」IP地址:
域名=www.baidu.com、Class = IN、記錄類型=A
2、查詢「dwyane@qq.com」郵件服務器:
域名=qq.com」、Class = IN、記錄類型=MX
互聯網中不可勝數的服務器,因此存儲他們信息的只用一臺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服務器中存放的信息,關鍵是找到信息歸哪臺DNS服務器管。
HTTP的三次握手、四次揮手 blog.csdn.net/AI_Gentlema…
互聯網有無數臺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服務器中保存的信息設置一個有效期,當緩存中的信息超過有效期後,數據就會從緩存中刪除。
獲悉ip以後,就能夠委託操做系統內部的協議棧發送消息到目標IP地址,也就是發送到Web服務器,發送給Web服務器的HTTP消息是一種數字消息。
簡單來講,總體思路就是收發數據的兩臺計算機之間鏈接了一個數據通道,數據沿着這個通道流動,最終到達目的地,會在目的地的那一端被取出。數據流動是雙向的,能夠從任何一個端流入。
實際過程,可把收發數據總結爲四步:
參考文獻: 域名知識百科
網絡是怎樣鏈接的