瀏覽器發(fā)送HTTP請求過程與DNS解析

一、 生成HTTP請求消息


  • 1.1 各種各樣的URL

    瀏覽器是一個具備多種客戶端功能的綜合性客戶端軟件,會根據(jù)URL(Unfiorm Resource Locator块饺,統(tǒng)一資源定位符)的不同奕枝,來使用不同的協(xié)議來訪問對應的服務器。

  • 用HTTP協(xié)議訪問Web服務器時:
    http://user:passwoard@www.glasscom.com:80/dir/file.html
  • 用FTP協(xié)議下載和上傳文件時:
    ftp://user:password@ftp.glasscom.com:21/dir/file/html
  • 讀取計算機本地文件時:
    file://localhost/c:/path/file.zip
  • 發(fā)送電子郵件時:
    mailto:617223700@qq.com
  • 閱讀新聞組的文章時:
    news:com.protocols.tcp-ip

  • 1.2 URL解析規(guī)則

  • URL示例:
    http://user:passwoard@www.glasscom.com:80/dir/file.html
    user,password,80:分別為用戶名岸夯,密碼麻献,端口號都可省略。
    http:URL開頭表示訪問數(shù)據(jù)源的協(xié)議猜扮。
    //.../:中間表示W(wǎng)eb服務器的名稱勉吻。
    / + 目錄名 + / ... + 文件名:表示文件的路徑名。
  • http://www.baidu.com/dir/
    表示dir/后面的文件名被省略了旅赢,服務器已經(jīng)事先設置好了省略時訪問的默認文件名齿桃,這個設置不一定都相同,不過大多是index.html或default.html鲜漩,所以上面這種情況可能就是訪問/dir/index.html源譬。
  • http://www.baidu.com/ or http://www.baidu.com
    表示訪問"/"目錄也就是根目錄(目錄層級中最頂層)下的默認文件如index.html或default.html,即/index.html孕似。
  • http://www.baidu.com/this
    首先如果Web服務器上存在this的文件踩娘,則將this作為文件名處理,其次如果存在名為this的目錄,則將this作為目錄名處理养渴。

  • 1.3 生成HTTP請求消息

解析完URL之后雷绢,瀏覽器會使用HTTP協(xié)議訪問Web服務器。HTTP協(xié)議定義了客戶端和服務器之間交互的消息內(nèi)容和步驟理卑。

  • 1.3.1 客戶端會向服務器發(fā)送請求消息翘紊。

      請求消息包含:"對什么" 和 "進行怎樣的操作" 兩個部分。
    

** "對什么" 部分為URI (Uniform Resource Identifier藐唠,統(tǒng)一資源標識符)帆疟。**URI內(nèi)容是一個存放網(wǎng)頁數(shù)據(jù)的文件名或者是一個CGI程序(對Web服務器程序調(diào)用其他程序的規(guī)則所做的定義就是CGI,而按照CGI規(guī)范來工作的程序就稱為CGI程序宇立。)的文件名踪宠。比如:"/dir/fiel.html","/dir/program.cgi"等妈嘹,其實URI文件未必在Web服務器上真實存在柳琢,可以是Web服務器通過重寫規(guī)則對虛擬URI進行映射。
"進行怎樣的操作"就是方法也叫HTTP謂詞润脸。包括讀取URI表示的數(shù)據(jù)(GET)柬脸,將客戶端輸入的數(shù)據(jù)發(fā)送給URI表示的程序(POST)等。
GET:獲取URI指定信息毙驯。如果URI指定的是文件倒堕,返回文件內(nèi)容。如果指定的是CGI程序爆价,則返回該程序輸出數(shù)據(jù)涩馆。大概過程是:在請求消息中寫上GET方法,然后在URI中寫上存放網(wǎng)頁數(shù)據(jù)的文件名"/dir/file.html"允坚,當Web服務器收到消息后,會打開/dir/file.html文件讀取里面數(shù)據(jù)蛾号,然后將讀出的數(shù)據(jù)存放到響應消息返會給客戶端稠项。
POST:從客戶端向服務器發(fā)送數(shù)據(jù)。一般用于發(fā)送表單中填寫的數(shù)據(jù)等情況鲜结。使用POST時展运,URI會指向Web服務器中運行的一個應用程序的文件名,如:"index.cgi"精刷,"index.php"等拗胜,在請求消息中,除了URI和方法怒允,還要加上傳遞給應用程序和腳本數(shù)據(jù)也就是表單內(nèi)容埂软。Web服務器會把請求信息中的數(shù)據(jù)發(fā)給URI指定應用程序,并從應用程序接收輸出的結(jié)果放到響應消息返回給客戶端纫事。
HEAD:和GET基本相同勘畔,不過只返回HTTP的消息頭所灸,不返回數(shù)據(jù)內(nèi)容。
PUT:替換URI指定服務器上的文件炫七,沒有則創(chuàng)建爬立。
...

  • 1.3.2 請求消息構(gòu)成:

請求消息第一行為** 請求行。格式:
<方法><空格><URI><空格><HTTP版本>
GET www.baidu.com HTTP/1.1
請求消息第二行開始為
消息頭**万哪,包括:日期侠驯,客戶端支持數(shù)據(jù)類型,數(shù)據(jù)有效期等等一系列詳細細節(jié)奕巍。

屏幕快照 2017-05-21 下午11.06.30.png

寫完消息頭后吟策,還需要添加一個空行,然后寫上** 消息體**伍绳,就是需要發(fā)送的數(shù)據(jù)踊挠。GET方法時,不需要在消息體填寫任何數(shù)據(jù)冲杀,Web服務器能憑借URI和方法做相應操作效床。


  • 1.4 響應消息

響應消息的格式以及基本思路和請求消息大致相同,差別只在第一行权谁,第一行為狀態(tài)碼和響應短語剩檀,用來表示請求的執(zhí)行結(jié)果成功還是出錯。

  • 1.4.1 狀態(tài)碼概要:

1xx : 告知請求的處理進度和情況旺芽。
2xx : 成功沪猴。
3xx :表示需要進一步操作。
4xx : 客戶端錯誤采章。
5xx : 服務器錯誤运嗜。
一條請求消息只能寫一個URI。如果需要獲取多個文件悯舟,必須對每個文件單獨發(fā)送一條請求担租。比如:一個網(wǎng)頁中包含3個圖片,那么獲取網(wǎng)頁加上圖片抵怎,一個需要向Web服務器發(fā)送4條請求奋救。 以下為www.baidu.com的請求數(shù)

屏幕快照 2017-05-21 下午11.24.28.png

網(wǎng)頁中的文本數(shù)據(jù)和其中嵌入的圖片數(shù)據(jù)是分別保存在不同文件中的,他們合在一起就組成了一張網(wǎng)頁反惕。讀取文件的操作是對各個文件分別執(zhí)行的尝艘,而且是相互獨立的。比如:①用于獲取/file.html文件的請求消息姿染,②將/file.html的內(nèi)容返回給客戶端的響應消息背亥,③用于獲取/picture.jpg文件的請求消息,④將/picture.jpg的內(nèi)容返回給客戶端的響應消息。


二隘梨、 向DNS服務器查詢Web服務器的IP地址

生成HTTP消息后程癌,下一步需要根據(jù)域名查詢IP地址,委托操作系統(tǒng)發(fā)送消息轴猎∏独颍互聯(lián)網(wǎng)和局域網(wǎng)都是基于TCP/IP的結(jié)構(gòu)。TCP/IP的網(wǎng)絡結(jié)構(gòu):用集線器連接起來的幾臺計算機看作一個單位捻脖,子網(wǎng)锐峭,然后一些小的子網(wǎng)通過路由器連接起來組成一個大的網(wǎng)絡。IP地址分為網(wǎng)絡號和主機號可婶,網(wǎng)絡號對應的是這個子網(wǎng)沿癞,主機號對應的是分配個子網(wǎng)中的計算機。有了IP地址矛渴,就能將數(shù)據(jù)以包的形式通過集線器椎扬,路由器的轉(zhuǎn)發(fā)傳送到目標服務器。


  • 2.1 IP地址組成

IP地址是一串32比特的數(shù)字具温,按照8比特(1字節(jié))為一組分為4組蚕涤,分別用十進制表示再用圓點隔開。除此之外铣猩,我們還需要附加信息即子網(wǎng)掩碼來表示IP地址內(nèi)部結(jié)構(gòu)揖铜,也就是哪部分是網(wǎng)絡號,哪部分是主機號达皿。子網(wǎng)掩碼是與IP地址相同長度的32比特數(shù)字天吓,左邊一半都是1,右邊一半都是0峦椰,為1的部分表示網(wǎng)絡號龄寞,為0的部分表示主機號。
(1) 采用與IP地址主體相同格式表示子網(wǎng)掩碼的方法
10.11.12.13/255.255.255.0 即 IP地址/子網(wǎng)掩碼
10進制轉(zhuǎn)化為比特:
IP地址: 00001010.00001011.00001100.00001101 子網(wǎng)掩碼: 11111111.11111111.11111111.00000000 網(wǎng)絡號: 00001010.00001011.00001100 即 10.11.12 主機號: 00001101 即 13

(2) 采用網(wǎng)絡號比特數(shù)表示子網(wǎng)掩碼的方法
10.11.12.13/24
(3)表示子網(wǎng)的地址
10.11.12.0/24 主機號部分的比特全部為0汤功,表示不是單獨計算機而是代表整個子網(wǎng)萄焦。
(4)表示子網(wǎng)內(nèi)廣播的地址
10.11.12.255/24 主機號部分的比特全部為1,表示對整個子網(wǎng)進行廣播冤竹,就是向子網(wǎng)內(nèi)所有設備發(fā)送包。


三茬射、DNS工作原理

向DNS(Domain Name System鹦蠕,域名服務系統(tǒng)。將服務器名稱和IP地址進行關(guān)聯(lián)是DNS最常見用法在抛,但DNS也可以用于關(guān)聯(lián)郵件地址和郵件服務器等其他信息和對應名稱的關(guān)聯(lián))服務器發(fā)出查詢钟病,并接收服務器返回的響應信息。 通過DNS查詢IP地址的操作稱為域名解析,所以計算機內(nèi)部的DNS客戶端也稱之為解析器肠阱。解析器實際上是包含在操作系統(tǒng)里的Socket庫中的一段程序票唆,Socket庫是用于調(diào)用網(wǎng)絡功能的程序組件集合,包含很多用于發(fā)送和接收數(shù)據(jù)的程序組件屹徘。

  • 3.1 解析器內(nèi)部原理

解析器既然是Socket庫中的程序都是標準組件走趋,所以只要在編寫瀏覽器等應用程序的時候,進行調(diào)用就行了噪伊。

99E1D683E695E07510DA789115D2B45D.png

解析器會生成要發(fā)送給DNS服務器的查詢消息簿煌,這個過程類似于瀏覽器生成要發(fā)送給Web服務器的HTTP請求消息過程,不過HTTP請求消息是文本鉴吹,DNS查詢消息是二進制數(shù)據(jù)編寫姨伟。而發(fā)送給DNS服務器這個操作不是解析器完成,是委托給操作系統(tǒng)內(nèi)部的協(xié)議棧(操作系統(tǒng)內(nèi)部的網(wǎng)絡控制軟件也叫協(xié)議驅(qū)動豆励,TCP/IP驅(qū)動)完成夺荒。類似瀏覽器,解析器也不具備使用網(wǎng)絡收發(fā)數(shù)據(jù)功能良蒸。而是通過協(xié)議棧進行發(fā)送消息操作技扼,再通過網(wǎng)卡將消息發(fā)送給DNS服務器。

當DNS服務器收到查詢消息后诚啃,會根據(jù)消息進行查詢淮摔,如果要訪問的Web服務器已經(jīng)在DNS服務器上注冊,那么這條記錄肯定能查詢到始赎,然后將其IP地址寫入響應消息并返回給客戶端和橙。接下來,消息經(jīng)過網(wǎng)絡到達客戶端造垛,再經(jīng)過協(xié)議棧被傳遞到解析器魔招,解析器讀取消息取出IP地址,返回給應用程序(瀏覽器)里指定的內(nèi)存地址五辽。具體如下圖:

19C8EEFCDB9936836A6216C0115EE3A0.png

順便提下办斑,向DNS服務器發(fā)送查詢消息,也需要知道DNS服務器的IP地址杆逗,不過這個IP地址是作為TCP/IP的一個設置選項事先設置好的乡翅。可以手動設置也可以自動獲取罪郊。

B987B1EECB87A78AC4AF4DB5382861B0.png
  • 3.2 DNS服務器工作原理

DNS服務器的基本工作就是接收來自客戶端的查詢消息蠕蚜,然后根據(jù)消息的內(nèi)容返回響應。查詢消息包括以下三種:
(a) 域名:服務器悔橄、郵件服務器(郵件地址中@后面的部分)的名稱靶累。
(b) Class : 用來代表互聯(lián)網(wǎng)的IN腺毫。
(c) 記錄類型:表示域名對應何種類型的記錄。例如挣柬,當類型為A(Address)時潮酒,表示域名對應IP地址;當類型為MX(Mail eXchange)時邪蛔,表示域名對應郵件服務器急黎。對于不同的記錄類型,服務器返回的響應消息也不同店溢。

DNS服務器上會事先保存有前面這3種信息對應的記錄數(shù)據(jù)叁熔,然后根據(jù)記錄查找符合查詢請求的內(nèi)容并對客戶端作出響應。比如下表:

| 域名 | Class | 記錄類型 | 響應數(shù)據(jù)
| ------------- |:-------------: | -----: |
| www.lab.glasscom.com | IN | A | 192.0.2.226
| glasscom.com | IN | MX | 10 mail.glasscom.com
| mail.glasscom.com | IN | A | 192.0.2.227
| ...|...|...|...|

上述表格信息是保存在配置文件中的床牧,表格中的一行信息稱為一條資源記錄荣回。對于郵件地址tone@glasscom.com,@后面就是域名戈咳,10代表優(yōu)先級心软,當一個郵件地址對應多個郵件服務器時,需要根據(jù)優(yōu)先級判斷哪個服務器優(yōu)先著蛙,越小越優(yōu)先删铃。10后面代表郵件服務器域名,第三行就是域名對應的IP踏堡。

總結(jié):DNS服務器會從域名和IP地址的對照表中查找相應記錄猎唁,并返回IP地址。

  • 3.3 域名的層次結(jié)構(gòu)與DNS服務器接力

DNS中的域名都是用句點來分割顷蟆,比如:www.lab.glasscom.com诫隅,句點劃分了不同層次,也就是不同的域帐偎。類似于公司的組織結(jié)構(gòu)逐纬。越靠右,層級越高削樊。如果按照公司的組織結(jié)構(gòu)來說豁生,大概就是com事業(yè)集團glasscom部lab科的www。就是com域的下一層glasscom域再下一層lab域漫贞,再下面才是www這個名字甸箱。

負責管理下級域的DNS服務器的IP地址注冊到它們的上級DNS服務器中,然后上級DNS服務器的IP地址再注冊到更上一級的DNS服務器中迅脐,以此類推芍殖。比如:lab.glasscom.com域的DNS服務器的IP地址需要注冊到glasscom.com域的DNS服務器中。我們可以通過上級DNS服務器查詢出下級DNS服務器中的IP地址仪际。

com域被稱為頂級域围小,頂級域上面還有一級域,稱為根域树碱。根域沒有自己名字肯适,一般省略,如果表示則在最后加個句點成榜,如:www.glasscom.com. 框舔。根域的DNS服務器保管著com等DNS服務器信息。上級DNS服務器保存著所有下級DNS服務器的信息赎婚,我們可以從根域開始往下找刘绣。另外,根域的DNS服務器信息保存在互聯(lián)網(wǎng)所有DNS服務器中挣输,分配給根域DNS服務器的IP地址在全世界僅有13個纬凤,保存在所有DNS服務器的配置文件中,任意一臺都能訪問根域DNS服務器撩嚼。下圖為客戶端向DNS服務器查詢IP地址的過程:

3869C3E17FA142D1B0CDD9E55BFCFE42.png

DNS服務器有緩存功能停士,查詢不存在域名的也會緩存,如果原本的注冊信息發(fā)生改變完丽,緩存的信息就可能不正確恋技,需要刪除緩存。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末逻族,一起剝皮案震驚了整個濱河市蜻底,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌聘鳞,老刑警劉巖薄辅,帶你破解...
    沈念sama閱讀 207,248評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異搁痛,居然都是意外死亡长搀,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,681評論 2 381
  • 文/潘曉璐 我一進店門鸡典,熙熙樓的掌柜王于貴愁眉苦臉地迎上來源请,“玉大人,你說我怎么就攤上這事彻况∷” “怎么了?”我有些...
    開封第一講書人閱讀 153,443評論 0 344
  • 文/不壞的土叔 我叫張陵纽甘,是天一觀的道長良蛮。 經(jīng)常有香客問我,道長悍赢,這世上最難降的妖魔是什么决瞳? 我笑而不...
    開封第一講書人閱讀 55,475評論 1 279
  • 正文 為了忘掉前任货徙,我火速辦了婚禮,結(jié)果婚禮上皮胡,老公的妹妹穿的比我還像新娘痴颊。我一直安慰自己,他們只是感情好屡贺,可當我...
    茶點故事閱讀 64,458評論 5 374
  • 文/花漫 我一把揭開白布蠢棱。 她就那樣靜靜地躺著,像睡著了一般甩栈。 火紅的嫁衣襯著肌膚如雪泻仙。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,185評論 1 284
  • 那天量没,我揣著相機與錄音玉转,去河邊找鬼。 笑死允蜈,一個胖子當著我的面吹牛冤吨,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播饶套,決...
    沈念sama閱讀 38,451評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼漩蟆,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了妓蛮?” 一聲冷哼從身側(cè)響起怠李,我...
    開封第一講書人閱讀 37,112評論 0 261
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎蛤克,沒想到半個月后捺癞,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,609評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡构挤,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,083評論 2 325
  • 正文 我和宋清朗相戀三年髓介,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片筋现。...
    茶點故事閱讀 38,163評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡唐础,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出矾飞,到底是詐尸還是另有隱情一膨,我是刑警寧澤,帶...
    沈念sama閱讀 33,803評論 4 323
  • 正文 年R本政府宣布洒沦,位于F島的核電站豹绪,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏申眼。R本人自食惡果不足惜瞒津,卻給世界環(huán)境...
    茶點故事閱讀 39,357評論 3 307
  • 文/蒙蒙 一蝉衣、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧巷蚪,春花似錦买乃、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,357評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽肴焊。三九已至前联,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間娶眷,已是汗流浹背似嗤。 一陣腳步聲響...
    開封第一講書人閱讀 31,590評論 1 261
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留届宠,地道東北人烁落。 一個月前我還...
    沈念sama閱讀 45,636評論 2 355
  • 正文 我出身青樓,卻偏偏與公主長得像豌注,于是被迫代替她去往敵國和親伤塌。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 42,925評論 2 344

推薦閱讀更多精彩內(nèi)容