Web 瀏覽器、服務器和相關的Web 應用程序都是通過HTTP 相互通信的。HTTP 是現代全球因特網中使用的公共語言。
一、HTTP-因特網的多媒體信使
每天,都有數以億萬計的JPEG 圖片、HTML 頁面、文本文件、MPEG 電影、WAV音頻文件、Java 小程序和其他資源在因特網上游弋。HTTP 可以從遍佈全世界的Web 服務器上將這些信息塊迅速、便捷、可靠地搬移到人們桌面上的Web 瀏覽器上去。 HTTP 使用的是可靠的數據傳輸協議,因此即使數據來自地球的另一端,它也能夠確保數據在傳輸的過程中不會被損壞或產生混亂。
二、Web客戶端和服務端
Web 內容都是存儲在Web 服務器上的。Web 服務器所使用的是HTTP 協議,因此經常會被稱爲HTTP 服務器。這些HTTP 服務器存儲了因特網中的數據,如果HTTP 客戶端發出請求的話,它們會提供數據。客戶端向服務器發送HTTP 請求,服務器會在HTTP 響應中回送所請求的數據。
可能你每天都在使用HTTP 客戶端。最常見的客戶端就是Web 瀏覽器,比如微軟的Internet Explorer 或網景的Navigator。Web 瀏覽器向服務器請求HTTP 對象,並將這些對象顯示在你的屏幕上。
三、資源
Web 服務器是Web 資源(Web resource)的宿主。Web 資源是Web 內容的源頭。最簡單的Web 資源就是Web 服務器文件系統中的靜態文件。這些文件可以包含任意內容:文本文件、HTML 文件、微軟的Word 文件、Adobe 的Acrobat 文件、JPEG 圖片文件、AVI 電影文件,或所有其他你能夠想到的格式。但資源不一定非得是靜態文件。資源還可以是根據需要生成內容的軟件程序。這些動態內容資源可以根據你的身份、所請求的信息或每天的不同時段來產生內容。它們可以爲你顯示照相機中活生生的照片,也可以幫你進行股票交易,搜索房產數據庫,或者從在線商店中購買禮物
1、媒體類型
因特網上有數千種不同的數據類型,HTTP 仔細地給每種要通過Web 傳輸的對象都打上了名爲MIME 類型(MIME type) 的數據格式標籤。
MIME 類型是一種文本標記,表示一種主要的對象類型和一個特定的子類型,中間由一條斜槓來分隔。
• HTML 格式的文本文檔由 text/html 類型來標記。
• 普通的 ASCII 文本文檔由 text/plain 類型來標記。
• JPEG 格式的圖片爲 image/jpeg 類型。
• GIF 格式的圖片爲 image/gif 類型。
• Apple 的 QuickTime 電影爲 video/quicktime 類型。
• 微軟的 PowerPoint 演示文件爲 application/vnd.ms-powerpoint 類型。
2、URI
每個Web 服務器資源都有一個名字,這樣客戶端就可以說明它們感興趣的資源是什麼了。服務器資源名被稱爲統一資源標識符(Uniform Resource Identifier,URI)。URI 就像因特網上的郵政地址一樣,在世界範圍內唯一標識並定位信息資源。
3、URL
統一資源定位符(URL)是資源標識符最常見的形式。URL 描述了一臺特定服務器上某資源的特定位置。
大部分URL 都遵循一種標準格式,這種格式包含三個部分。
• URL 的第一部分被稱爲方案(scheme),說明了訪問資源所使用的協議類型。這部分通常就是HTTP 協議(http://)。
• 第二部分給出了服務器的因特網地址(比如,www.joes-hardware.com)。
• 其餘部分指定了 Web 服務器上的某個資源(比如,/specials/saw-blade.gif)。
4、URN
URI 的第二種形式就是統一資源名(URN)。URN 是作爲特定內容的唯一名稱使用的,與目前的資源所在地無關。使用這些與位置無關的URN,就可以將資源四處搬移。通過URN,還可以用同一個名字通過多種網絡訪問協議來訪問資源。
四、事務
一個HTTP 事務由一條(從客戶端發往服務器的)請求命令和一個(從服務器發回客戶端的)響應結果組成。
1、方法
HTTP 支持幾種不同的請求命令,這些命令被稱爲HTTP 方法(HTTP method)。每條HTTP 請求報文都包含一個方法。這個方法會告訴服務器要執行什麼動作(獲取一個Web 頁面、運行一個網關程序、刪除一個文件等)。
HTTP方法 | 描 述 |
GET | 從服務器向客戶端發送命名資源 |
PUT | 將來自客戶端的數據存儲到一個命名的服務器資源中去 |
DELETE | 從服務器中刪除命名資源 |
POST | 將客戶端數據發送到一個服務器網關應用程序 |
HEAD | 僅發送命名資源響應中的HTTP 首部 |
2、狀態碼
每條HTTP 響應報文返回時都會攜帶一個狀態碼。狀態碼是一個三位數字的代碼,告知客戶端請求是否成功,或者是否需要採取其他動作。
顯示了幾種常見的狀態碼。
HTTP狀態碼 | 描述 |
200 | OK。文檔正確返回 |
302 | Redirect(重定向)。到其他地方去獲取資源 |
404 | Not Found(沒找到)。無法找到這個資源 |
3、Web頁面可以包含多個對象
應用程序完成一項任務時通常會發布多個HTTP 事務。比如,Web 瀏覽器會發布一系列HTTP 事務來獲取並顯示一個包含了豐富圖片的Web 頁面。瀏覽器會執行一個事務來獲取描述頁面佈局的HTML“框架”,然後發佈另外的HTTP 事務來獲取每個嵌入式圖片、圖像面板、Java 小程序等。這些嵌入式資源甚至可能位於不同的服務器上。因此,一個“Web 頁面”通常並不是單個資源,而是一組資源的集合。
五、報文
HTTP 報文是由一行一行的簡單字符串組成的。HTTP 報文都是純文本,不是二進制代碼,所以人們可以很方便地對其進行讀寫。
從Web 客戶端發往Web 服務器的HTTP 報文稱爲請求報文(request message)。從服務器發往客戶端的報文稱爲響應報文(response message),此外沒有其他類型的HTTP 報文。
HTTP 報文包括以下三個部分。
• 起始行
報文的第一行就是起始行,在請求報文中用來說明要做些什麼,在響應報文中說明出現了什麼情況。
• 首部字段
起始行後面有零個或多個首部字段。每個首部字段都包含一個名字和一個值,爲了便於解析,兩者之間用冒號(:)來分隔。首部以一個空行結束。添加一個首部字段和添加新行一樣簡單。
• 主體
空行之後就是可選的報文主體了,其中包含了所有類型的數據。請求主體中包括了要發送給Web 服務器的數據;響應主體中裝載了要返回給客戶端的數據。起始行和首部都是文本形式且都是結構化的,而主體則不同,主體中可以包含任意的二進制數據(比如圖片、視頻、音軌、軟件程序)。當然,主體中也可以包含文本。
六、連接
我們來討論一下報文是如何通過傳輸控制協議(Transmission Control Protocol,TCP)連接從一個地方搬移到另一個地方去的。
1、TCP/IP
HTTP 是個應用層協議。HTTP 無需操心網絡通信的具體細節;它把聯網的細節都交給了通用、可靠的因特網傳輸協議TCP/IP。
TCP 提供了:
• 無差錯的數據傳輸;
• 按序傳輸(數據總是會按照發送的順序到達);
• 未分段的數據流(可以在任意時刻以任意尺寸將數據發送出去)。
因特網自身就是基於TCP/IP 的,TCP/IP 是全世界的計算機和網絡設備常用的層次化分組交換網絡協議集。TCP/IP 隱藏了各種網絡和硬件的特點及弱點,使各種類型的計算機和網絡都能夠進行可靠的通信。只要建立了TCP 連接,客戶端和服務器之間的報文交換就不會丟失、不會被破壞,也不會在接收時出現錯序了。
用網絡術語來說,HTTP 協議位於TCP 的上層。HTTP 使用TCP 來傳輸其報文數
據。與之類似,TCP 則位於IP 的上層。
2、連接、IP地址及端口號
在HTTP 客戶端向服務器發送報文之前,需要用網際協議(Internet Protocol,IP)地址和端口號在客戶端和服務器之間建立一條TCP/IP 連接。建立一條TCP 連接的過程與給公司辦公室的某個人打電話的過程類似。首先,要撥打公司的電話號碼。這樣就能進入正確的機構了。其次,撥打要聯繫的那個人的分機號。
在TCP 中,你需要知道服務器的IP 地址,以及與服務器上運行的特定軟件相關的TCP 端口號。
怎麼獲得HTTP 服務器的IP 地址和端口號呢?當然是通過URL了!我們前面曾提到過,URL 就是資源的地址,所以自然能夠爲我們提供存儲資源的機器的IP 地址。我們來看幾個URL:
http://207.200.83.29:80/index.html
http://www.netscape.com:80/index.html
http://www.netscape.com/index.html
第一個URL 使用了機器的IP 地址,207.200.83.29 以及端口號80。
第二個URL 沒有使用數字形式的IP 地址,它使用的是文本形式的域名,或者稱爲主機名(www.netscape.com)。主機名就是IP 地址比較人性化的別稱。可以通過一種稱爲域名服務(Domain Name Service,DNS)的機制方便地將主機名轉換爲IP地址,這樣所有問題就都解決了。第2 章會介紹更多有關DNS 和URL 的內容。
最後一個URL 沒有端口號。HTTP 的URL 中沒有端口號時,可以假設默認端口號是80。
瀏覽器是怎樣通過HTTP 顯示位於遠端服務器中的某個簡單HTML 資源的。
步驟如下:
(a) 瀏覽器從URL 中解析出服務器的主機名;
(b) 瀏覽器將服務器的主機名轉換成服務器的IP 地址;
(c) 瀏覽器將端口號(如果有的話)從URL 中解析出來;
(d) 瀏覽器建立一條與Web 服務器的TCP 連接;
(e) 瀏覽器向服務器發送一條HTTP 請求報文;
(f) 服務器向瀏覽器回送一條HTTP 響應報文;
(g) 關閉連接,瀏覽器顯示文檔。
3、Telnet
由於HTTP 使用了TCP/IP 傳輸協議,而且它是基於文本的,沒有使用那些難以理解的二進制格式,因此很容易直接與Web 服務器進行對話。
Telnet 程序可以將鍵盤連接到某個目標TCP 端口,並將此TCP 端口的輸出回送到顯示屏上。Telnet 常用於遠程終端會話,但它幾乎可以連接所有的TCP 服務器,包括HTTP 服務器。
可以通過Telnet 程序直接與Web 服務器進行對話。通過Telnet 可以打開一條到某臺機器上某個端口的TCP 連接,然後直接向那個端口輸入一些字符。Web 服務器會將Telnet 程序作爲一個Web 客戶端來處理,所有回送給TCP 連接的數據都會顯示在屏幕上。
七、協議版本
現在使用的HTTP 協議有幾個版本。HTTP 應用程序要儘量強健地處理各種不同的HTTP 協議變體。
八、Web的結構組件
1、代理
首先我們來看看HTTP 代理服務器,這是Web 安全、應用集成以及性能優化的重要組成模塊。
如圖所示,代理位於客戶端和服務器之間,接收所有客戶端的HTTP 請求,並將這些請求轉發給服務器(可能會對請求進行修改之後轉發)。對用戶來說,這些應用程序就是一個代理,代表用戶訪問服務器。
2、緩存
Web 緩存(Web cache)或代理緩存(proxy cache)是一種特殊的HTTP 代理服務器,可以將經過代理傳送的常用文檔複製保存起來。下一個請求同一文檔的客戶端就可以享受緩存的私有副本所提供的服務了。
3、網關
網關(gateway)是一種特殊的服務器,作爲其他服務器的中間實體使用。通常用於將HTTP 流量轉換成其他的協議。網關接受請求時就好像自己是資源的源端服務器一樣。客戶端可能並不知道自己正在與一個網關進行通信。
例如,一個HTTP/FTP 網關會通過HTTP 請求接收對FTP URI 的請求,但通過FTP協議來獲取文檔。得到的文檔會被封裝成一條HTTP 報文,發送給客戶端。
4、隧道
隧道(tunnel)是建立起來之後,就會在兩條連接之間對原始數據進行盲轉發的HTTP 應用程序。HTTP 隧道通常用來在一條或多條HTTP 連接上轉發非HTTP 數據,轉發時不會窺探數據。
HTTP 隧道的一種常見用途是通過HTTP 連接承載加密的安全套接字層(SSL,Secure Sockets Layer)流量,這樣SSL 流量就可以穿過只允許Web 流量通過的防火牆了。
5、Agent代理
用戶Agent 代理(或者簡稱爲Agent 代理)是代表用戶發起HTTP 請求的客戶端程序。所有發佈Web 請求的應用程序都是HTTP Agent 代理。到目前爲止,我們只提到過一種HTTP Agent 代理:Web 瀏覽器,但用戶Agent 代理還有很多其他類型。比如,有些自己會在Web 上閒逛的自動用戶Agent 代理,可以在無人監視的情況下發布HTTP 事務並獲取內容。這些自動代理的名字通常都很生動,比如“網絡蜘蛛”(spiders)或者“Web 機器人”(Web robots)。