跳至主要内容

[HTTP] 1. 簡單易用的 HTTP/0.9 ~ HTTP/1.1

HTTP 發展史簡介

今天又是新的網路常識主題: HTTP,我會就我所知道的來介紹 HTTP 的發展史,主要介紹 HTTP 0.9 ~ HTTP 3.0 的時空背景,每個版本發展的原因,和其究竟帶來了什麼改變


從大方向來看,HTTP 主要經歷過了幾次大變更:

版本目的
HTTP 0.9 ~ HTTP 1.1簡單易用的網路協定
主要是為了使 HTTP 協定能快速普及
HTTP 2.0改善應用層的效能
主要是改善 HTTP head of blocking 造成的效能問題,讓我們可以同時發送多個 HTTP request
HTTP 3.0改善傳輸層的效能
主要是改善 TCP head of blocking 造成的效能問題,讓我們可以快速切換不同的網路,而不會造成卡頓


以下是 HTTP 版本的簡介表格:

版本引入年份現在狀態
HTTP/0.91991❌ 棄用
HTTP/1.01996❌ 棄用
HTTP/1.11997✅ 標準
HTTP/22015✅ 標準
HTTP/32022✅ 標準

(資料來源: https://en.wikipedia.org/wiki/HTTP#History )



接者,今天會介紹 HTTP 0.9 ~ HTTP 1.1 的發展史


HTTP 0.9: 最簡單的單行協定 (One-Line protocol)

1989 年,「萬維網之父」Tim Berners-Lee 提出了 World Wide Web 的概念,,並在 1990 年開發了 HTTP 協議和 HTML 語言。萬維網的發明徹底改變了人們獲取信息的方式,使信息的傳播變得更加快速和便捷,並在 1991 年正式公佈 HTTP 0.9

此時 HTTP 的版本正是 0.9,只具有以下功能

$> telnet google.com 80

Connected to 74.125.xxx.xxx

GET /about/

(hypertext response)
(connection closed)

此時候能做的只有

  • Client 只能送出 GET method,跟要取得的路徑資源
  • Server 只能回傳 HTML response

沒有任何的 HTTP header


HTTP 1.0: 網路飛快成長的年代


HTTP/1.0 主要解決了網路飛快成長的年代,需要更多的功能面對不同的需求


從 1991 年到 1995 年是 HTML 規範的快速共同演化時期,一種被稱為「網頁瀏覽器」的新型軟體的出現,以及面向消費者的公共互聯網基礎設施的出現和快速增長

在此時,基於「萬維網之父」Tim Berner-Lee 的初始瀏覽器原型,國家超級計算應用中心(NCSA, National Center of Supercomputing Applications)的一個團隊決定實施他們自己的版本。於是,第一個流行的瀏覽器誕生了:NCSA Mosaic。NCSA 團隊的一位程序員 Marc Andreessen 與 Jim Clark 於 1994 年 10 月合作創立了 Mosaic Communications。該公司後來改名為 Netscape,並於 1994 年 12 月推出了 Netscape Navigator 1.0

隨著開始向大眾普及,以及各類需求飛增,很快暴露了 HTTP 0.9 的許多基本限制:我們需要一個功能更豐富的協定,不僅可以提供 HTML,還能提供有關請求和回應的更豐富的 metadata,實現內容協商等功能,並在 1996 年正式公佈 HTTP 1.0


此時 HTTP 1.0 的範本如下:

$> telnet website.org 80

Connected to xxx.xxx.xxx.xxx

# Request
GET /rfc/rfc1945.txt HTTP/1.0 (1)
User-Agent: CERN-LineMode/2.15 libwww/2.17b3
Accept: */*

# Response
HTTP/1.0 200 OK (2)
Content-Type: text/plain (3)
Content-Length: 137582
Expires: Thu, 01 Dec 1997 16:00:00 GMT (4)
Last-Modified: Wed, 1 May 1996 12:45:26 GMT (4)
Server: Apache 0.84

(plain-text response)
(connection closed)

此時,我們多了以下功能:

  • 更多的 HTTP method:POST, HEAD
  • 提供使用的 HTTP version (1)
  • 提供 response status (2)
  • 可以發送不同種類的內文,包括 HTML file, plain text file, image, 還有其他內文類型.
  • 多行的 HTTP content,包括:
    • Cache related (4)
    • Authorization
  • Connection: keep-alive 支持長連接,但非標準

已經算是具有非常多功能的協定了,還包含以下一些常用到的功能


Cache 部分

HTTP 1.0 的緩存控制機制主要依靠 Last-ModifiedExpires 這兩個 header 來控制資源的緩存

  • Last-Modified:表示資源的最後修改時間
  • Expires:表示資源的過期時間

主要是利用時間來控制 cache 的存取 (關於 HTTP cache 的部分,後面會再詳細介紹)


Authorization 權限設定部分

Authorization: <username>:<password>

其中,username 表示用戶名,password 表示密碼,例如,以下是 HTTP 1.0 中 Authorization header 的示例:

Authorization: benson_chen:benson123456

HTTP 1.0 的 Authorization header 存在以下缺點:

  • 安全性不高:用戶名和密碼明文傳輸,容易被截獲
  • 不靈活:只能使用 Basic 方式進行授權

此時的 Authorization 功能還是算簡陋,也很容易被竊取,跟我們現在的使用情境還有一段距離




雖然已經有這麼豐富的功能,但是 HTTP 1.0 其實還不是個正式的網路標準協定(詳見 RFC 1945)


因此,制定 HTTP 協議相關的組織仍在致力於制定網路的標準協定,經過了 4 年的努力後,才誕生出了第一個標準的網路協定:HTTP 1.1



HTTP 1.1: 標準的網路協定


HTTP/1.1 主要制定了網路傳輸協定標準,且針對效能進行諸多改良


此標準於 1997 年 1 月正式發布,大約在 HTTP/1.0 發布後的六個月。然後,在 1999 年 6 月,大約兩年半後,一些改進和更新被納入標準,並作為 RFC 2616 發布

HTTP/1.1 標準解決了早期版本中發現的許多協議模糊性,擴展了許多既有功能,並引入了一些關鍵的性能優化:

優化項目內容
HTTP method擴展 PUT, DELETE, OPTIONS HTTP methods
HTTP Authorization header新增 Authorization 的 schema,使 HTTP 可以有不同類型的密碼
效能方面
  • Keep-Alive connections
  • 擴展 caching 機制
  • 新增 request pipelining 機制


HTTP/1.1 的樣本如下:

$> telnet website.org 80
Connected to xxx.xxx.xxx.xxx

# Request 1
GET /index.html HTTP/1.1
Host: website.org
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_4)... (snip)
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Encoding: gzip,deflate,sdch
Accept-Language: en-US,en;q=0.8
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3
Cookie: __qca=P0-800083390... (snip)

# Response 1
HTTP/1.1 200 OK
Server: nginx/1.0.11
Connection: keep-alive
Content-Type: text/html; charset=utf-8
Via: HTTP/1.1 GWA
Date: Wed, 25 Jul 2012 20:23:35 GMT
Expires: Wed, 25 Jul 2012 20:23:35 GMT
Cache-Control: max-age=0, no-cache
Transfer-Encoding: chunked

100
<!doctype html>
(snip)

100
(snip)

0

# Request 2
GET /favicon.ico HTTP/1.1
Host: www.website.org
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_4)... (snip)
Accept: */*
Referer: http://website.org/
Connection: close
Accept-Encoding: gzip,deflate,sdch
Accept-Language: en-US,en;q=0.8
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3
Cookie: __qca=P0-800083390... (snip)

# Response 2
HTTP/1.1 200 OK
Server: nginx/1.0.11
Content-Type: image/x-icon
Content-Length: 3638
Connection: close
Last-Modified: Thu, 19 Jul 2012 17:51:44 GMT
Cache-Control: max-age=315360000
Accept-Ranges: bytes
Via: HTTP/1.1 GWA
Date: Sat, 21 Jul 2012 21:35:22 GMT
Expires: Thu, 31 Dec 2037 23:55:55 GMT
Etag: W/PSA-GAu26oXbDi

(icon data)
(connection closed)

擴展的 Authorization 機制

  • 增加了 Bearer 方式
    Bearer 方式是 HTTP 1.1 中新增的一種授權方式,它使用令牌來代替用戶名和密碼。Bearer 方式更加安全和方便,因此在 HTTP 1.1 中被廣泛使用

  • 增加了 Digest 方式
    Digest 方式是 HTTP 1.1 中新增的一種授權方式,它使用哈希算法來驗證用戶名和密碼。Digest 方式更加安全,因此在一些安全敏感的應用中被使用

  • 增加了 Authorization header 的格式校驗
    HTTP 1.1 對 Authorization header 的格式進行了校驗,以防止錯誤的授權信息


具體來說,HTTP 1.1 中 Authorization header 的格式如下:

Authorization: <scheme> <credentials>

其中,scheme 表示授權方式,credentials 表示授權信息



擴展的 Caching 機制

  • 增加了 Etag 頭部
    Etag 頭部是資源的唯一標識符,可以用來代替 Last-Modified 頭部。Etag 頭部可以有效防止資源被誤判為過期。

  • 引入了 Cache-Control 頭部
    Cache-Control 頭部可以用來指定資源的緩存策略,例如是否可以緩存、緩存的時間等。Cache-Control 頭部可以讓客戶端和服務器更加靈活地控制資源的緩存。

  • 引入了 Vary 頭部
    Vary 頭部可以用來指定影響資源緩存的因素,例如客戶端的 IP 地址、Cookie 等。Vary 頭部可以防止資源被緩存到客戶端的本地,從而提高資源的安全性


TCP Keep-Alive


在之前提到的 TCP connection 中,每一次的建立 TCP 連結都需要經過三次握手的複雜過程,因此會大大增加 network request 所需要的時間,在 HTTP/1.1 中,每次的 request 已經都預設為讓 TCP Keep-Alive,使得下一次發送 request 時,不需要再重新建立一次 TCP connection,大大節省 network request 的時間


Request Pipelining

允許同時發出多個 HTTP request,不用等待上一個 request 的 response

雖然理想很豐滿,但現實很骨感,實際上

  • 現實中 Pipelining 要正確地實現非常棘手,因為 proxy 很難正確的控制 pipelining
  • 雖然不用等待上一個 response,但 response 回傳一定要按順序,例如:



導致 Head of blocking 的問題產生,因此有了後續 HTTP/2.0 來進行優化,請看下一篇~



結論

  • 瞭解 HTTP 0.9 ~ HTTP 1.1 的主要功能是為了使網際網路快速普及,設計上簡單易用為目的
  • 瞭解 HTTP 0.9 只提供 Client GET method,和 Server 回傳 HTML response,只有最簡單的功能
  • 瞭解 HTTP 1.0 為了因應 Web browser 的誕生,和網路的快速發展,多了許多功能因應多樣需求,但還不是正式的網路傳輸標準協定
  • 瞭解 HTTP 1.1 完善了 HTTP 1.0 的功能,包括 Authorization, Caching 等,並做了諸多效能優化,包括 TCP Keep-Alive, Compressing, Pipelining,並且是正式的網路傳輸標準協定


參考資源