1. 程式人生 > 其它 >《網路是怎樣連線的》第 1 章讀書筆記

《網路是怎樣連線的》第 1 章讀書筆記

《網路是怎樣連線的》第 1 章介紹了從瀏覽器生成 HTTP 請求訊息、到委託作業系統的協議棧傳送訊息的全過程,是一次整體的概覽,對之後的幾章內容奠定了基礎。第 2、第 3 章分別著重於協議棧內部的實現機理和網路硬體裝置。

本章的流程:使用 URL(或伺服器名) 向 DNS 查詢伺服器的 IP 地址(第 1 節、第 3 節) --> 瀏覽器生成 HTTP 訊息(第 2 節,請求訊息) --> 委託 OS 向伺服器傳送 HTTP 訊息(第 4 節) --> 委託 OS 從伺服器接收 HTTP 訊息(第 2 節,響應訊息)

目錄

1 統一資源定位符—— URL

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

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

  • URL 的元素:

http://Web伺服器名 (/目錄名/.../檔名) 資料來源(檔案)的路徑名可省略

  • 省略檔名:在伺服器上事先設定好檔名省略時要訪問的預設檔名。這個設定根據伺服器不同而不同,大多數情況下是 index.html 或者 default.htm 之類的檔名。因此,像這樣省略檔名時,伺服器就會訪問 /dir/index.html 或者 /dir/default.htm。

http://www.lab.glasscom.com/

2 訊息的格式—— HTTP 協議

2.1 URI 和方法

  • “對什麼”(Uniform Resource Identifier,統一資源識別符號):URI 的內容是一個存放網頁資料的檔名或者是一個 CGI 程式的檔名,例如“/dir1/file1.html”“/dir1/program1.cgi” 等。不過,URI 不僅限於此,也可以直接使用“http:”開頭的 URL 來作為 URI。

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

  • “進行操作”(方法):表示需要讓Web 伺服器完成怎樣的工作。以下為常用方法:

  • GET 方法:當我們訪問 Web 伺服器獲取網頁資料時,使用的就是 GET 方法。
  • POST 方法:在表單(網頁中的文字框、複選框等能夠輸入資料的部分)中填寫資料並將其傳送給 Web 伺服器時就會使用這個方法。使用 POST 方法時, URI 會指向 Web 伺服器中執行的一個應用程式的檔名。

2.2 請求訊息

  • 請求訊息的第一行稱為請求行。這裡的重點是最開頭的方法,方法可以告訴 Web 伺服器它應該進行怎樣的操作。

  • 寫好方法之後,加一個空格,然後寫 URI。URI 部分的格式如下:

/< 目錄名 >/…/< 檔名 >

  • 第一行的末尾需要寫上 HTTP 的版本號,這是為了表示該訊息是基於哪個版本的 HTTP 規格編寫的。

  • 第二行開始為訊息頭。訊息頭的規格中定義了很多專案,如日期、客戶端支援的資料型別、語言、壓縮格式、客戶端和伺服器的軟體名稱和版本、資料有效期和最後更新時間等。訊息頭中的內容隨著瀏覽器型別、版本號、設定等的不同而不同,大多數情況下訊息頭的長度為幾行到十幾行不等。

  • 寫完訊息頭之後,還需要新增一個完全沒有內容的空行,然後寫上需要傳送的資料。這一部分稱為訊息體,也就是訊息的主體。

2.3 響應訊息

  • 在響應訊息中,第一行的內容為狀態碼和響應短語,用來表示請求的執行結果是成功還是出錯。狀態碼是一個數字,它主要用來向程式告知執行的結果(狀態碼的第一位數字表示狀態型別,第二、三位數字表示具體的情況);相對地,響應短語則是一段文字,用來向人們告知執行的結果。

  • 由於每條請求訊息中只能寫 1 個 URI, 所以每次只能獲取 1 個檔案,如果需要獲取多個檔案,必須對每個檔案單獨傳送 1 條請求。 如下所示:

3 查詢伺服器的 IP 地址—— DNS 伺服器

3.1 IP 地址

  • 集線器連線起來的幾臺計算機,我們將它看作一個單位,稱為子網(凡是通過集線器連線起來的所有裝置都屬於同一個子網)。將子網通過路由器連線起來,就形成了一個網路(一些家用路由器中已經內建了集線器功能)。

  • “號” 對應的號碼稱為網路號,“室” 對應的號碼稱為主機號,這個地址的整體稱為 IP 地址。

  • 在 IP 地址的規則中, 網路號和主機號連起來總共是 32 位元, 但這兩部分的具體結構是不固定的,因此還需要另外的附加資訊來表示 IP 地址的內部結構。這一附加資訊稱為子網掩碼,其中,子網掩碼為 1 的部分表示網路號,子網掩碼為 0 的部分表示主機號。我們也可以把 1 的部分的位元數用十進位制表示並寫在 IP 地址的右側。

3.2 解析器和 DNS 伺服器的互動

  • DNS: Domain Name System,域名服務系統。將伺服器名稱和 IP 地址進行關聯是 DNS 最常見的用法,但 DNS 的功能並不僅限於此,它還可以將郵件地址和郵件伺服器進行關聯,以及為各種資訊關聯相應的名稱。

  • 相當於 DNS 客戶端的部分稱為 DNS 解析器,或者簡稱解析器。通過 DNS 查詢 IP 地址的操作稱為域名解析,因此負責執行解析(resolution)這一操作的就叫解析器(resolver) 了。

  • Socket 庫也是一種庫,其中包含的程式元件可以讓其他的應用程式呼叫作業系統的網路功能,而解析器就是這個庫中的其中一種程式元件。

  • 應用程式呼叫解析器後發生了什麼:

  • 向 DNS 伺服器傳送訊息時,我們當然也需要知道 DNS 伺服器的 IP 地址。只不過這個 IP 地址是作為 TCP/IP 的一個設定專案事先設定好的,不需要再去查詢了。

3.3 DNS 伺服器儲存的內容

  • 域名:伺服器、郵件伺服器(郵件地址中 @ 後面的部分)的名稱。

  • Class: Class 的值永遠是代表網際網路的 IN。

  • 記錄型別:表示域名對應何種型別的記錄。例如,當型別為 A 時,表示域名對應的是 IP 地址;當型別為 MX 時,表示域名對應的是郵件伺服器。對於不同的記錄型別,伺服器向客戶端返回的資訊也會不同。

3.4 通過 DNS 伺服器查詢 IP 地址

查詢過程如下圖:

注意:

  • 客戶端只要能夠找到任意一臺 DNS 伺服器,就可以通過它找到根域 DNS 伺服器,然後再一路順藤摸瓜找到位於下層的某臺目標 DNS 伺服器。分配給根域 DNS 伺服器的 IP 地址在全世界僅有 13 個,而且這些地址幾乎不發生變化。

  • 現實中上級域和下級域有可能共享同一臺 DNS 伺服器。在這種情況下,訪問上級 DNS 伺服器時就可以向下跳過一級 DNS 伺服器, 直接返回再下一級 DNS 伺服器的相關資訊。

  • DNS 伺服器有一個快取功能,可以記住之前查詢過的域名。並且,當要查詢的域名不存在時,“不存在” 這一響應結果也會被快取。這樣,當下次查詢這個不存在的域名時,也可以快速響應。

  • DNS 伺服器中儲存的資訊都設定有一個有效期,當快取中的資訊超過有效期後,資料就會從快取中刪除。而且,在對查詢進行響應時,DNS 伺服器也會告知客戶端這一響應的結果是來自快取中還是來自負責管理該域名的 DNS 伺服器。

4 向伺服器傳送 HTTP 訊息——協議棧

知道了 IP 地址之後,就可以委託作業系統內部的協議棧向這個目標 IP 地址,也就是我們要訪問的 Web 伺服器傳送訊息了。

客戶端使用 Socket 庫來收發資料的操作過程下圖所示:

  • 建立套接字(建立套接字階段)
  • 將管道連線到伺服器端的套接字上(連線階段)
  • 收發資料(通訊階段)
  • 斷開管道並刪除套接字(斷開階段)

4.1 建立套接字階段

  • 在進行收發資料操作之前,雙方需要先建立起這條管道才行。建立管道的關鍵在於管道兩端的資料出入口,這些出入口稱為套接字。伺服器程式一般會在啟動後就建立好套接字並等待客戶端連線管道。客戶端也會先建立一個套接字,然後從該套接字延伸出管道,最後管道連線到伺服器端的套接字上。

  • 客戶端建立套接字的操作需呼叫 Socket 庫中的 socket 程式元件。只不過,socket 的內部操作並不像解析器那樣簡單。

  • 同一臺計算機上可能同時存在多個套接字,在這樣的情況下,我們就需要一種方法來識別出某個特定的套接字,這種方法就是描述符

  • 描述符是和委託建立套接字的應用程式進行互動時使用的,並不是用來告訴網路連線的另一方的,因此另一方並不知道這個描述符。同樣地,客戶端也無法知道伺服器上的描述符。

4.2 連線階段

應用程式通過呼叫 Socket 庫中的名為 connect 的程式元件來完成這一操作,需要三個引數:

  • 第 1 個引數,即描述符,就是在建立套接字的時候由協議棧返回的那個描述符。

  • 第 2 個引數,即伺服器 IP 地址,就是通過 DNS 伺服器查詢得到的我們要訪問的伺服器的 IP 地址。

  • 第 3 個引數,即埠號。如果說描述符是用來在一臺計算機(或應用程式)內部識別套接字的機制,那麼埠號就是用來讓通訊的另一方能夠識別出套接字的機制。比如 Web 是 80 號埠, 電子郵件是 25 號埠。

4.3 通訊階段

  • 只要將資料送入套接字,資料就會被髮送到對方的套接字中。當呼叫 write 時,需要指定描述符和傳送資料,然後協議棧就會將資料傳送到伺服器。

  • 當訊息返回後,需要執行的是接收訊息的操作。接收訊息的操作是通過 Socket 庫中的 read 程式元件委託協議棧來完成的,它將接收到的響應訊息存放到接收緩衝區中。

4.4 斷開階段

  • Web 使用的 HTTP 協議規定,當 Web 伺服器傳送完響應訊息之後,應該主動執行斷開操作, 因此 Web 伺服器會首先呼叫 close 來斷開連線。斷開操作傳達到客戶端之後,客戶端的套接字也會進入斷開階段。

  • 接下來,當瀏覽器呼叫 read 執行接收資料操作時,read 會告知瀏覽器收發資料操作已結束,連線已經斷開。瀏覽器得知後,也會呼叫 close 進入斷開階段。

  • 重複連線和斷開顯然是效率很低的,因此後來人們又設計出了能夠在一次連線中收發多個請求和響應的方法。因此,在 HTTP 版本 1.1 中,當所有資料都請求完成後,瀏覽器會主動觸發斷開連線的操作。

---EOF---