第 1 章 瀏覽器生成訊息——探索瀏覽器內部

quanquan147發表於2018-02-13

在開始探索之旅之前,我們準備了一些和本章內容有關的小題目,請大家先試試看。

這些題目是否答得出來並不影響接下來的探索之旅,因此請大家放輕鬆。 問題

下列說法是正確的(√)還是錯誤的(×)?

  1. http://www.nikkeibp.co.jp/ 中的 www 代表 World Wide Web 協議(對通訊操作規則所作的定義)。

  2. 個人也可以申請註冊網際網路中的域名。

  3. 瀏覽器等網路應用程式實際上並不具備網路控制功能。 答案

  4. ×。http://www.nikkeibp.co.jp/ 中的 www 只是 Web 伺服器上的一種命名。而且,World Wide Web 也不是一個協議的名字,而是 Web 的提出者最早開發的瀏覽器兼 HTML 編輯器的名字。

  5. √。如果是“.com”“.net”“.org”“.jp”(除“co.jp”“ne.jp”等“xx.jp”格式的域名外)1 等沒有對註冊物件範圍進行限制的域名,任何個人都可以申請註冊。此外,也有一種“.name”域名是專門為個人申請者準備的。

1中國的情況類似,個人可以申請“.cn”域名,但“.com.cn”“.net.cn”等域名則是不開放給個人註冊的。此外,日本的域名體系中,“.jp”下級的域名用的是兩個字母的命名,例如“.co.jp”“.ne.jp”,而中國使用的是三個字母的命名,例如“.com.cn”“.net.cn”。——譯者注

  1. √。應用程式並不是自己去控制網路,而是委託作業系統來控制網路。 探索之旅的看點

探索之旅即將出發,出發之前我們先來介紹一下本次的看點。

{%}

(1)生成 HTTP 請求訊息

本次探索之旅從使用者在瀏覽器中輸入網址(URL)開始。接下來,瀏覽器的工作會從對使用者輸入的網址進行解析開始。瀏覽器如何解析網址就是我們的第一個看點。然後,瀏覽器會根據網址的含義來生成請求訊息。瀏覽器通過請求訊息將使用者需要哪些資料告知伺服器,而請求訊息實際的樣子就是我們的第二個看點。只要理解了具體的訊息長什麼樣,我們也就能夠理解訪問 Web 伺服器時使用的 HTTP 協議的原理了。

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

請求訊息生成之後,瀏覽器會委託作業系統向 Web 伺服器傳送請求,但瀏覽器必須告訴作業系統接收方的 IP 地址才行,因此瀏覽器必須先查出 Web 伺服器的 IP 地址。網址中只有 Web 伺服器的域名,因此瀏覽器需要向 DNS 伺服器查詢域名對應的 IP 地址,瀏覽器如何進行這一操作也是本章看點之一。

(3)全世界 DNS 伺服器的大接力

這時,我們的旅程進入到了 DNS 伺服器幫助瀏覽器查詢 IP 地址這一環節了。全世界共有上萬臺 DNS 伺服器,它們相互接力才能完成 IP 地址的查詢,而它們進行接力的方法也是本章看點之一。

(4)委託協議棧傳送訊息

查詢到 IP 地址之後,瀏覽器就可以將訊息委託給作業系統傳送給 Web 伺服器了,但這個委託到底是如何完成的呢?這也是本章看點之一。“委託給作業系統”這句話看似簡單,但關於委託給作業系統,其實有非常詳細的規則,必須要遵守這些規則才能完成操作。由於只有編寫程式的人才需要精通這些規則,所以面向一般讀者的圖書中幾乎很少見到對這些規則的解釋。不過,對這些規則有個大概的理解還是會有很多好處的,因為理解了向作業系統進行委託時的規則,我們就能夠明白做出某個委託時作業系統會給我們怎樣的反饋,這可以說是相當於具體地理解了網路的潛在能力。這一點對於沒有程式設計經驗的人來說也很重要。 1.1 生成 HTTP 請求訊息 1.1.1 探索之旅從輸入網址開始

我們的探索之旅從在瀏覽器中輸入網址開始 2,在介紹瀏覽器的工作方式之前,讓我們先來介紹一下網址。網址,準確來說應該叫 URL3,如果我說它就是以 http:// 開頭的那一串東西,恐怕大家一下子就明白了,但實際上除了“http:”,網址還可以以其他一些文字開頭,例如“ftp:”“file:”“mailto:”4 等。

2某些情況下,瀏覽器的工作是從點選網頁中的一個連結開始,大家可以認為這種情況與將連結中所包含的網址輸入到瀏覽器的位址列中是一樣的。——譯者注

3URL:Uniform Resource Locator,統一資源定位符。

4如果沒有正確配置電子郵件軟體,則即使在位址列中輸入“mailto:”也是無法正常工作的。

之所以有各種各樣的 URL,是因為儘管我們通常是使用瀏覽器來訪問 Web 伺服器的,但實際上瀏覽器並不只有這一個功能,它也可以用來在 FTP5 伺服器上下載和上傳檔案,同時也具備電子郵件客戶端的功能。可以說,瀏覽器是一個具備多種客戶端功能的綜合性客戶端軟體,因此它需要一些東西來判斷應該使用其中哪種功能來訪問相應的資料,而各種不同的 URL 就是用來幹這個的,比如訪問 Web 伺服器時用“http:”,而訪問 FTP 伺服器時用“ftp:”。

5FTP:File Transfer Protocol,檔案傳送協議。這是一種在上傳、下載檔案時使用的協議。使用 FTP 協議來傳送檔案的程式也被叫作 FTP。

圖 1.1 列舉了現在網際網路中常見的幾種 URL,根據訪問目標的不同,URL 的寫法也會不同。例如在訪問 Web 伺服器和 FTP 伺服器時,URL 中會包含伺服器的域名 6 和要訪問的檔案的路徑名等,而發郵件的 URL 則包含收件人的郵件地址。此外,根據需要,URL 中還會包含使用者名稱、密碼、伺服器埠號 7 等資訊。

6域名:就是像 www.glasscom.com 這樣以句點(.)分隔的名稱。關於域名,1.2.2 節和 1.3.2 節有詳細說明。

7埠號:1.4.3 節和第 6 章的 6.1.3 節有詳細說明,這裡請大家理解為一個用來識別要連線的伺服器程式的編號。不同的伺服器程式會使用不同的編號,例如 Web 是 80,郵件是 25 等。

{%}

圖 1.1 URL 的各種格式

儘管 URL 有各種不同的寫法,但它們有一個共同點,那就是 URL 開頭的文字,即“http:”“ftp:”“file:”“mailto:”這部分文字都表示瀏覽器應當使用的訪問方法。比如當訪問 Web 伺服器時應該使用 HTTP8 協議,而訪問 FTP 伺服器時則應該使用 FTP 協議。因此,我們可以把這部分理解為訪問時使用的協議 9 型別 10。儘管後面部分的寫法各不相同,但開頭部分的內容決定了後面部分的寫法,因此並不會造成混亂。

8HTTP:Hypertext Transfer Protocol,超文字傳送協議。

9協議:通訊操作的規則定義稱為協議(protocol)。

10像“ file:”這樣的 URL 在訪問時是不使用網路的,因此說 URL 的開頭部分表示的是協議型別並不完全準確,也許理解為“訪問方法”會更好一些。 1.1.2 瀏覽器先要解析 URL

瀏覽器要做的第一步工作就是對 URL 進行解析,從而生成傳送給 Web 伺服器的請求訊息。剛才我們已經講過,URL 的格式會隨著協議的不同而不同,因此下面我們以訪問 Web 伺服器的情況為例來進行講解。

根據 HTTP 的規格,URL 包含圖 1.2(a)中的這幾種元素。當對 URL 進行解析時,首先需要按照圖 1.2(a)的格式將其中的各個元素拆分出來,例如圖 1.2(b)中的 URL 會拆分成圖 1.2(c)的樣子。然後,通過拆分出來的這些元素,我們就能夠明白 URL 代表的含義。例如,我們來看拆分結果圖 1.2(c),其中包含 Web 伺服器名稱 www.lab.glasscom.com,以及檔案的路徑名 /dir1/file1.html,因此我們就能夠明白,圖 1.2(b)中的 URL 表示要訪問 www.lab.glasscom.com 這個 Web 伺服器上路徑名為 /dir/file1.html 的檔案,也就是位於 /dir/ 目錄 11 下的 file1.html 這個檔案(圖 1.3)。

11目錄(directory)這個詞的意思相當於 Windows 中的資料夾(folder)。

{%}

圖 1.2 Web 瀏覽器解析 URL 的過程

{%}

圖 1.3 路徑名為 /dir/file1.html 的檔案 1.1.3 省略檔名的情況

圖 1.2(b)是一個以“http:”開頭的典型 URL,但有時候我們也會見到一些不太一樣的 URL,例如下面這個 URL 是以“/”來結尾的。

(a)http://www.lab.glasscom.com/dir/

我們可以這樣理解,以“/”結尾代表 /dir/ 後面本來應該有的檔名被省略了。根據 URL 的規則,檔名可以像前面這樣省略。

不過,沒有檔名,伺服器怎麼知道要訪問哪個檔案呢?其實,我們會在伺服器上事先設定好檔名省略時要訪問的預設檔名。這個設定根據伺服器不同而不同,大多數情況下是 index.html 或者 default.htm 之類的檔名。因此,像前面這樣省略檔名時,伺服器就會訪問 /dir/index.html 或者 /dir/default.htm。

還有一些 URL 是像下面這樣只有 Web 伺服器的域名的,這也是一種省略了檔名的形式。

(b)http://www.lab.glasscom.com/

這個 URL 也是以“/”結尾的,也就是說它表示訪問一個名叫“/”的目錄 12。而且,由於省略了檔名,所以結果就是訪問 /index.html 或者 /default.htm 這樣的檔案了。

12“/”目錄表示目錄層級中最頂層的“根目錄”。也許單獨一個“/”表示根目錄的寫法看上去很奇怪,其實只要明白目錄的規則就很容易理解了。我們寫目錄名時會像“dir/”一樣在末尾加上一個“/”,這一點大家應該沒什麼疑問,那麼如果目錄本身沒有名字的話會怎麼樣呢?在上面的例子中,就相當於“dir/”去掉了其中的 dir,這樣一來就只剩下一個“/”了,這就是表示根目錄的“/”。對於目錄層級最頂層的那個目錄,我們出於方便的考慮把它叫作根目錄,其實它本身並沒有名字,因此我們僅用“/”來表示它。

那麼,下面這個 URL 又是什麼意思呢?

(c)http://www.lab.glasscom.com

這次連結尾的“/”都省略了。像這樣連目錄名都省略時,真不知道到底在請求哪個檔案了,實在有些過分。不過,這種寫法也是允許的。當沒有路徑名時,就代表訪問根目錄下事先設定的預設檔案 13,也就是 /index.html 或者 /default.htm 這些檔案,這樣就不會發生混亂了。

13最早的時候這個檔案被叫作“主頁”(home page),意思就是當省略檔名時訪問的那個預設的頁面。隨著 Web 的普及,這個詞的意義似乎並沒有被正確理解,現在不光是預設頁面,似乎隨便什麼網頁都可以被叫作主頁了。

不過,下面這個例子就更詭異了。

(d)http://www.lab.glasscom.com/whatisthis

前面這個例子中,由於末尾沒有“/”,所以 whatisthis 應該理解為檔名才對。但實際上,很多人並沒有正確理解省略檔名的規則,經常會把目錄末尾的“/”也給省略了。因此,或許我們不應該總是將 whatisthis 作為檔名來處理。一般來說,這種情況會按照下面的慣例進行處理:如果 Web 伺服器上存在名為 whatisthis 的檔案,則將 whatisthis 作為檔名來處理;如果存在名為 whatisthis 的目錄,則將 whatisthis 作為目錄名來處理 14。

14我們無法建立兩個名字相同的檔案和目錄,因此不可能既有一個名為 whatisthis 的檔案,同時又有一個名為 whatisthis 的目錄。只要查詢一下磁碟中的檔案和目錄,就可以知道 whatisthis 究竟是一個檔案還是一個目錄了,並不會產生歧義。

瀏覽器的第一步工作就是對 URL 進行解析。

1.1.4 HTTP 的基本思路

解析完 URL 之後,我們就知道應該要訪問的目標在哪裡了。接下來,瀏覽器會使用 HTTP 協議來訪問 Web 伺服器,不過在介紹這一環節之前,我們先來講一講 HTTP 協議到底是怎麼回事。

{%}

圖 1.4 HTTP 的基本思路

HTTP 協議定義了客戶端和伺服器之間互動的訊息內容和步驟,其基本思路非常簡單。首先,客戶端會向伺服器傳送請求訊息(圖 1.4)。請求訊息中包含的內容是“對什麼”和“進行怎樣的操作”兩個部分。其中相當於“對什麼”的部分稱為 URI15。一般來說,URI 的內容是一個存放網頁資料的檔名或者是一個 CGI 程式 16 的檔名,例如“/dir1/file1.html”“/dir1/program1.cgi”等 17。不過,URI 不僅限於此,也可以直接使用“http:”開頭的 URL18 來作為 URI。換句話說就是,這裡可以寫各種訪問目標,而這些訪問目標統稱為 URI。

15URI:Uniform Resource Identifier,統一資源識別符號。

16CGI 程式:對 Web 伺服器程式呼叫其他程式的規則所做的定義就是 CGI,而按照 CGI 規範來工作的程式就稱為 CGI 程式。

17實際上,這個檔案在 Web 伺服器上未必是真實存在的,因為 Web 伺服器可以通過重寫規則對虛擬的 URI 進行對映。——譯者注

185.4.3 節有詳細說明。

相當於接下來“進行怎樣的操作”的部分稱為方法 19。方法表示需要讓 Web 伺服器完成怎樣的工作,其中典型的例子包括讀取 URI 表示的資料、將客戶端輸入的資料傳送給 URI 表示的程式等。表 1.1 列舉了主要的方法,通過這張表大家應該能夠理解通過方法可以執行怎樣的操作。

19也叫 HTTP 謂詞,或者 HTTP 動詞。——譯者注

相關文章