一、 生成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é)奕巍。
寫完消息頭后吟策,還需要添加一個空行,然后寫上** 消息體**伍绳,就是需要發(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ù)
網(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)用就行了噪伊。
解析器會生成要發(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)存地址五辽。具體如下圖:
順便提下办斑,向DNS服務器發(fā)送查詢消息,也需要知道DNS服務器的IP地址杆逗,不過這個IP地址是作為TCP/IP的一個設置選項事先設置好的乡翅。可以手動設置也可以自動獲取罪郊。
-
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地址的過程:
DNS服務器有緩存功能停士,查詢不存在域名的也會緩存,如果原本的注冊信息發(fā)生改變完丽,緩存的信息就可能不正確恋技,需要刪除緩存。