應用層之HTTP 協議(計算機網絡筆記-可用於複習,備考)

Web 應用和 HTTP 協議

    

一、HTTP 概況

    HTTP 協議由兩部分程序實現:一個客戶機程序和一個服務器程序,它們運行在不同的端系統中,通過交換 HTTP 消息進行會話。HTTP 定義了瀏覽器和 Web 服務器之間的消息格式以及客戶機和服務器是如何進行消息交換的。

    HTML 是超文本標記語言,定義了網頁的表現形式,例如字體、排版等。
 
    Web 頁面是由對象組成的。對象(object )簡單來說就是文件,如 HTML 文件、JPEG 圖形文件、Java 小程序或視頻片段文件,這些文件可通過一個 URL 地址尋址。多數 Web 頁面含有一個基本 HTML 文件以及幾個引用對象(你看到的 web 頁是瀏覽器根據 HTML 語法,將多個對象文件渲染而成的)。

    例如,如果一個 Web 頁面包含 HTML 文本和 5 個 JPEG 圖形文件,那麼這個 Web 頁面有 6 個對象:一個基本 HTML 文件加 5 個圖片。在基本 HTML 文件中通過對象的 URL 地址對對象進行引用。在服務器磁盤中,這個 HTML 文件和圖片是分開存放的。瀏覽器獲得這些對象後,進行渲染,把它們組合在一起呈現給用戶。

URL 地址由兩部分組成:存放對象的服務器主機名和對象的路徑名。

例如,URL 地址

http://www.qq.com:80/news/index.html
協議:// 主機:端口(80)/ 文件名及其路徑
http://www.someschool.edu.cn/images/Department.gif
 www.someschool.edu.cn 就是主機名
 images/Department.gif 是路徑名。

    當用戶請求一個 Web 頁面時,瀏覽器向服務器發出對該頁面中所有包含對象的 HTTP請求消息,服務器接受請求並生成包含這些對象的 HTTP 響應消息進行響應。
    HTTP 使用 TCP 而不是 UDP 作爲它的傳輸層協議。瀏覽器發起一個與服務器的 TCP 連接,一旦連接建立,瀏覽器和服務器進程就可以通過套接字接口(就是發送/接收函數調用)訪問TCP。

    

二、非持久連接、持久連接和無狀態

    如果瀏覽器使用一個 TCP 連接向服務器請求一個 Web 頁面對象,也就是說請求一個對象後這個連接就關閉了,就稱爲 HTTP 的非持久連接
    如果瀏覽器使用一個 TCP 連接向服務器請求多個 Web 頁面對象,那麼稱爲持久連接。 例如上面那個 Web 頁面有 6 個對象,使用非持久連接,將打開 6 個 TCP 連接取回所有對象。若使用持久連接,理論上只需要一次 TCP 連接。

    現在的瀏覽器通常使用持久連接,即使選擇了 HTTP1.0。

    瀏覽器通常使用並行的 TCP 連接來加快 Web 頁面的獲取。
    例如 Firefox 瀏覽器,在其配置頁面 about:config 中就可以方便地設置訪問單個 Web 服務器的最大 TCP 連接數目。如果將最大並行連接數設置爲 1,這樣在非持久連接中 TCP 連接就會以串行方式建立。

    往返時間(Round-Trip Time,RTT)的定義,即一個分組從客戶機到服務器再回到客戶機所花費的時間。RTT 包括分組傳播時延、分組在中間路由器和交換機上的排隊時延以及分組處理時延。

    HTTP 是無狀態的。服務器向客戶機發送被請求的文件時,並不存儲任何關於該客戶機的狀態信息。假如一個特定的用戶在幾秒鐘內多次請求同一個對象,服務器並不會因爲剛剛爲該用戶提供了該對象就不再做出反應,而是重新發送該對象。但服務器一般會在日誌文件中記錄用戶的訪問歷史。

三、HTTP 消息格式

    
HTTP 消息有兩種:請求消息響應消息
•HTTP 請求消息

下面是一個典型的 HTTP 請求消息:

GET /somedir/Page.html HTTP 1 .1
Host: www.someschool.edu.cn
Connection: Keep Alive
User-agent: Moailla/2.0
Accept-language: fr

Entity body

    HTTP 消息頭部是用普通的 ASCII 文本書寫的。
    HTTP 請求消息的第一行叫做請求行(request line),其後繼的行叫做頭部行(header line )
請求行有 3 個字段:方法字段、URL 字段和 HTTP 協議版本字段

字段
方法字段 GET、POST、HEAD、PUT 和 DELETE
Host: www.someschool.edu.cn 定義了目標所在的主機
Connection: Keep Alive 瀏覽器告訴服務器希望使用持久連接
User-agen 定義用戶發送請求的瀏覽器的類型
Accept-language: fr 表示用戶想獲的該對象的語言版本

    方法字段可以取值 GET、POST、HEAD、PUT 和 DELETE。
當瀏覽器請求一個對象時,使用 GET 方法,在 URL 字段填寫該對象的 URL。
方法(Method)是對所請求對象所進行的操作,也就是一些命令。請求報文中的操作有:

方法(操作) 含義
GET 請求讀取一個Web頁面
HEAD 請求讀取一個Web頁面的首部
POST 附加一個命名資源(如Web頁面)
PUT 請求存儲一個Web頁面
DELETE 刪除Web頁面
TRACE 用於測試,要求服務器送回收到的請求
CONNECT 用於代理服務器
OPTION 查詢特定選項

    例如,用戶在使用 POST 方法向搜索引擎提供搜索關鍵詞,關鍵詞就出現在 Entity body 部分。也可以使用 GET 方法向服務器提交表單,這時輸入數據(表單字段值)會在請求行的 URL字段進行發送。
    例如,一個表單使用 GET 方法,它有一個字段,分別填寫的是 test,那麼得到的 URL 可能就是www.somesite.com/search?test。

    
•HTTP 響應消息

HTTP 1.1 200 OK

Connection: Keep Alive
Date: Tue,09 Aug 2017 23:23:02 GMT
Server: Apache/3 .0(unix)
Last-Modified: Sun,6May 2017 12:13:24 GMT
Content-Length: 6821
Con}tent-Tyge: text/html
 (data …)

響應消息分成三個部分:初始狀態行、首部行,然後是實體。

狀態行有 3 個字段:協議版本、狀態碼和相應狀態信息
Date
:首部行指示服務器產生併發送該響應消息的日期和時間。
Last-Modified:首部行指示了對象創建或者最後修改的日期和時間。它對可能在客戶機也可能在網絡緩存服務器上的對象緩存來說非常重要。
實體部分包含了所請求的對象。
常見的狀態碼

狀態碼 說明
200 響應成功
302 跳轉,跳轉地址通過響應頭中的 Location 屬性指定
400 客戶端請求有語法錯誤,不能被服務器識別
403 服務器接收到請求,但是拒絕提供服務(例如認證失敗)
404 請求資源不存在
500 服務器內部錯誤

    
    首部行的使用是由瀏覽器和 Web 服務器根據 HTTP 協議和用戶設置決定的。部分瀏覽器甚至有插件可以修改 HTTP 消息頭部,例如 Chrome 瀏覽器。
 

四、用戶與服務器的交互:cookie

HTTP 使用 cookie 技術使 Web 站點能夠跟蹤用戶。
cookie 技術有 4 個組成部分:
①在 HTTP 響應消息中有一個 set-cookie 首部行;
②在 HTTP 請求消息中有一個 cookie 首部行;
③在用戶端系統中保留有一個 cookie 文件,由用戶的瀏覽器管理;
④在 Web 站點有一個後端數據庫。

    

五、Web 緩存

    Web 緩存(web cache)也叫代理服務器(proxy server),可以配置用戶的瀏覽器,使得用戶的所有 HTTP 請求首先指向 Web 緩存。
     如果設置瀏覽器每次訪問一個 Web 網站時都通過緩存服務器。
    瀏覽器會首先建立一個到 Web 緩存服務器的 TCP 連接,並向 Web 緩存服務器發送一個HTTP 請求。
    Web 緩存服務器檢查本地是否存儲了該對象拷貝。
    如果有,Web 緩存服務器就用 HTTP 響應消息向客戶機瀏覽器返回該對象。
     如果 web 緩存服務器沒有該對象,它就與該對象的原始服務器建立 TCP 連接,請求該對象。
    當 web 緩存服務器接收該對象時,它在本地存儲一份拷貝,並用 HTTP 響應消息向客戶機的瀏覽器發送該拷貝。
    
    在因特網上部署 Web 緩存服務器有兩個原因。首先,可以加快對客戶機請求的響應時間。其次,Web 緩存可以大大減少一個單位內部網與因特網接入鏈路上的通信量

    

六、訪問qq實例

在用戶點擊URL爲http://www.qq.com/index.html的鏈接後,瀏覽器和Web服務器執行以下動作:

  1. 瀏覽器分析超鏈接中的URL
  2. 瀏覽器向DNS請求解析 www.qq.com 的IP地址
  3. DNS將解析出的IP地址 222.246.129.80 返回瀏覽器 HTTP over TCP
  4. 瀏覽器與服務器建立TCP連接(80端口)
  5. 瀏覽器請求文檔:GET /index.html
  6. 服務器給出響應,將文檔 index.html發送給瀏覽器
  7. 釋放TCP連接
  8. 瀏覽器顯示index.html中的內容
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章