Http權威指南筆記(一)——概述

Web瀏覽器、服務器和應用程序之間的通信都可以聽過Http協議實現,本篇先對Http協議中的幾個概念做一個總體的介紹。

1 Web服務端和客戶端

一般Web服務器是用於存儲Web內容的,負責向客戶端提供數據。其中的內容可以被Web客戶端通過HTTP協議進行訪問,服務器在客戶端提出HTTP請求後,會做在HTTP響應中回送所請求的數據。而HTTP客戶端一般最常見的就是我們的瀏覽器,不過現在很多移動端的APP也可以看做是一個HTTP客戶端。一次客戶端和服務端之間的通信,一般如下所示:
HTTP服務端和客戶端

2 資源

Web服務器就是Web資源的宿主,Web服務的主要目的之一就是提供Web資源給客戶端使用。Web服務器上存放的那些靜態文件就是最簡單的一種Web資源,如:“文本文件、 HTML 文件、微軟的 Word 文件、 Adobe 的 Acrobat 文件、 JPEG 圖片文件、 AVI 電影文件,或所有其他你能夠想到的格式。雖然靜態文件是一種Web資源,但是Web資源並不一定就是靜態文件,還有可能是由程序動態生成的數據,比如你再購物網站上搜索你感興趣的商品,所展示的頁面的數據就是由程序動態的根據你的搜索添加從數據庫中檢索出來的。

2.1 媒體類型

因爲Web服務器上所有的內容來源我們都可以稱之爲資源。所以Web資源是非常龐大的,數據類型是非常繁多的,爲了區分和處理,HTTP協議給各種資源都打上了一種稱爲媒體類型**(MIME TYPE)的標籤。最初設計MIME的目的是用於郵件系統,但是由於其非常好用,所以HTTP協議中也採納MIME用於標記多媒體內容(如:img/jpeg表示內容是一張jpeg格式的圖片,video/quickTime表示數據是一段視頻)。有了MIME-TYPE的好處在於,可以告訴HTTP客戶端(瀏覽器)如果去處理數據內容,如:是顯示一張圖片,還是播放一段視頻等。

2.2 URI

上面先總體說了Web資源的概念和其媒體類型的特徵,但是我們怎麼去獲取服務器上的資源呢?這就需要用到URI了。URI被稱爲統一資源標識符(Uniform Resource Identier,URI)其意義就類似於我們實際生活中的地址一樣。如果我們有了某個人的具體地址,就能很輕鬆的找到這個人,所以Web服務器上的資源了有了唯一的URI,那我們也就能很輕鬆的定位並獲取該資源了。

2.2.1 URL

統一資源定位符(URL)是資源標識符最常見的形式。大部分URL都遵循一種標準格式,這種格式由三部分組成:

  • scheme:說明訪問資源所使用的協議,如:HTTP協議(http://)
  • 第二部分爲服務器的地址,如:www.example.com
  • 其餘部分用於指定服務器上的具體某個資源,如:/doc/guide.html

2.2.2 URN

統一資源名(URN)爲URI的第二種形式。其是作爲當前資源特定名稱使用,和其所在地無關。也就是說,我們從一個地方將該資源轉移到另外一個地方,不會影響他的URN,我們還是能通過其URN定位到該資源

3 事務

所謂的事務就是指一條HTTP請求和一條HTTP響應組成,這種通信是通過HTTP報文(一種格式化數據)進行。整個請求過程中涉及到多個HTTP協議組成部分,下面分開說明。

3.1 方法

HTTP協議支持多種不同的請求命令,這些命令就被稱之爲HTTP方法(HTTP method)。每種方法都代表了一種具體需要執行的動作,常見的HTTP方法如下:
HTTP方法

3.2 狀態碼

每條HTTP響應報文都好辦一個狀態碼,其是一個三位數的數字,告知客戶端本次請求的結果(是否成功,或者還需要採取其他動作),常見的狀態碼:
HTTP狀態碼
一般狀態碼的後面 都會緊跟着該狀態碼的一條解釋語句,如:200 OK。後面的的’OK‘就是一條解釋語句。

3.3 一項任務和事務的關係

上面說到一般一次請求和返回組成一個事務。這裏的一次請求僅僅就是一次HTTP請求。並不表示一個頁面的所有請求。這裏將整個頁面所有數據的請求和展示稱之爲“一項任務”的話,那一項任務可能會包含多個事務,比如一個頁面由文字、圖片、視頻三部分組成。那麼一般第一次請求的時候,僅僅將頁面的文字部分數據獲取到客戶端,接着客戶端還要根據獲得的信息去請求圖片和視頻。這裏請求圖片、或者是請求視頻都會作爲另外一項事務。

報文

HTTP報文是由一行一行簡單的字符串組成的,其都是純文本的,所以非常方便閱讀,一個簡單的報文如下:
HTTP報文
報文一般包括如下幾個部分:

  • 起始行:報文的第一行就是起始行,請求報文中該部分用於說明客戶端需求是什麼,響應報文中的該部分用於說明本次操作出現的情況和結果。
  • 首部字段:起始行後面會有0個或者多個首部字段,每個首部字段都是鍵值對形式,鍵和值之間用“:”隔開,最後首部以一個空行結束。
  • 主體:這裏面就是本次報文中的數據了,請求報文中的主體數據是發給服務器的,響應報文中的主體數據是給客戶端的。主體和前面的起始行、首部字段有個不同之處在於,主體可以是純文本也可以是二進制數據,但是起始行和首部字段都是純文本內容。

4 連接

之前的內容都是在討論HTTP協議的構成內容,但是客戶端和服務器到底是怎麼完成通信的呢,這就涉及到連接的問題了。HTTP 是個應用層協議。HTTP 無需操心網絡通信的具體細節;它把聯網的細節都交給了通用、可靠的因特網傳輸協議 TCP/IP。
TCP 提供了:

  • 無差錯的數據傳輸;
  • 按序傳輸(數據總是會按照發送的順序到達);
  • 未分段的數據流(可以在任意時刻以任意尺寸將數據發送出去)。

只要建立了 TCP 連接,客戶端和服務器之間的報文交換就不會丟失、不會被破壞,也不會在接收時出現錯序了。
用網絡術語來說,HTTP 協議位於 TCP 的上層。HTTP 使用 TCP 來傳輸其報文數據。與之類似,TCP 則位於 IP 的上層,典型的TCP/IP五層模型如下:
TCP/IP五層模型

4.1 IP地址和端口號

TCP/IP連接的時候,需要用到IP地址和端口號。IP地址和端口號就有點類似於我們打電話的時候,IP地址是總機號碼,但是爲了找到具體的人,還需要分機號(端口號)。那怎麼獲取IP地址和端口號呢?就是通過前面說的URL,我們看兩條典型的URL:

一般一個URL中Scheme之後就是服務器地址了,可以直接像第一條URL一樣,直接用數字形式的IP地址表示,也是像第二條一樣,用文本形式的域名錶示(域名只是爲了方便人類記憶和使用的,最終也會被域名服務(Domain Name Servce, DNS))轉爲IP地址。端口號一般是緊跟在IP地址或者域名之後,比如兩條URL中的80就代表端口號。

5 協議版本

這裏對協議版本沒有做重點介紹,總的倆說,HTTP協議經歷了又四個版本:

  • HTTP/0.9:原始版本,僅僅支持GET方法,不支持MIME類型,首部數據,和版本號
  • HTTP/1/0:比較成熟的版本,也是得到廣泛使用的一個版本,加入了MIME類型,首部數據,版本號等
  • HTTP/1.0+:一些其他三方添加的一些HTTP協議屬性,沒有得到官方的認可
  • HTTP/1/1:吸收和借鑑了1.0+中的部分內容,然後對1.0的版本優化了涉及機構、刪除了一些不好的特性。該版本是目前廣泛使用的版本。

6 Web的結構組件

除了上述提到的Web服務器和客戶端,Web應用程序時間的通信和交互過程中還有很多組件的參與。

  • 代理:位於客戶端和服務端之間的HTTP實體,可以轉發客戶端和服務器之間的請求和響應,也可以對其內容進行過濾。
  • 緩存: HTTP的倉庫,可以使經常用的頁面的副本保存在距離客戶端跟進的地方,可以加快客戶端的獲取速度
  • 網關:連接其他應用程序的特殊Web服務器。可以將HTTP流量轉爲其他的協議,比如一個HTTP/FTP網關,會將一個使用HTTP協議請求文檔的的請求,轉爲FTP協議,從另外一個FTP服務器獲取文檔後,在封裝爲一個HTTP響應返回給客戶端。
  • 隧道:對HTTP通信報文進行盲轉發的特殊代理。一般用來在一條或者多條HTTP連接上轉發非HTTP數據,比如:通過HTTP連接來承載加密的安全套接字層(SSL, Secure Sockets Layer)流量。
  • Agent代理:發起自動HTTP請求的半智能客戶端。所有發佈Web請求的應用程序都可以成爲Agent代理,比如:瀏覽器、蜘蛛爬蟲等。

概述部分的學習到這就完了,後續會對上面提到的內容進行展開詳細說明進行學習記錄。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章