前言

本書對互聯網基盤——HTTP協議進行了全面系統的介紹。做者由HTTP協議的發展歷史娓娓道來,嚴謹細緻地剖析了HTTP協議的結構,列舉諸多常見通訊場景及實戰案例,最後延伸到Web安全、最新技術動向等方面。本書的特點爲在講解的同時,輔以大量生動形象的通訊圖例,更好地幫助讀者深入理解HTTP通訊過程當中客戶端與服務器之間的交互狀況。讀者可經過本書快速瞭解並掌握HTTP協議的基礎,前端工程師分析抓包數據,後端工程師實現REST API、實現本身的HTTP服務器等過程當中所需的HTTP相關知識點本書均有介紹。html

本書適合Web開發工程師,以及對HTTP協議感興趣的各層次讀者。前端

第一章、瞭解 WEB 及網絡基礎

HTTP 的誕生後端

1989年3月,HTTP 誕生了,最初設想的理念是:藉助多文本之間互相關聯造成的超文本,連成 WWW。瀏覽器

Web 成長時代緩存

1990年11月,CERN 研發了世界上第一臺 WEB 服務器。安全

1990年,你們針對 HTML1.0 草案進行討論,因存在多處模糊的地方,草案被直接廢棄。服務器

1992年9月,日本第一個網站的主頁上線了。網絡

1993年1月,現代瀏覽器的祖先 Mosaic 問世,它之內聯等形式顯示 HTML 的圖像,迅速在世界範圍內流行開來。前端工程師

1994年12月,網景公司發佈 Netscape Navigator 1.0。分佈式

1995年,微軟發佈了 Internet Explorer 1.0 和 2.0。

駐足不前的 HTTP

HTTP 0.9 :由於那時的 HTTP 並無正式的標準被創建,全部含有 HTTP 1.0 以前版本的意思。

HTTP 1.0 :1996年5月正式做爲標準被公佈,並記載於 RFC1945

HTTP 1.1 :1997年1月公佈,最新標準版本爲 RFC2616

網絡基礎 TCP/IP

一般使用的網絡(包括互聯網)是在 TCP/IP 協議族的基礎上運做的。而 HTTP 屬於它內部的一個子集。

TCP/IP 協議族

TCP/IP 是互聯網相關的各種協議族的總稱。

TCP/IP 的分層管理

分爲四層:

  • 應用層:決定了向用戶提供應用服務時通訊的活動,例如:FTP、DNS、HTTP。
  • 傳輸層:提供處於網絡鏈接中的兩臺計算機之間的數據傳輸,TCP、UDP。
  • 網絡層:處理在網絡上流動的數據包,規定傳輸路線。
  • 數據鏈路層:處理鏈接網絡的硬件部分。包括控制操做系統、硬件的設備驅動、網卡及光纖等物理可見部分。

分層的好處:把各層之間的接口部分規劃好後,修改某個地方時只需修改對應的層,每一個層次內部不影響其餘層。

TCP/IP 通訊傳輸流

HTTP 舉例:

與 HTTP 關係密切的協議 : IP、TCP 和DNS

  • 負責傳輸的 IP 協議

  • 確保可靠性的 TCP 協議

  • 負責域名解析的 DNS 服務

各類協議與 HTTP 協議的關係

第二章、簡單的 HTTP 協議

HTTP 協議用於客戶端和服務器之間的通訊,請求資源方成爲客戶端,提供資源響應方成爲服務器端。

請求報文是由請求方法、請求 URI、協議版本、可選的請求首部字段和內容實體構成的。

請求報文的構成:

響應報文的構成:

HTTP 是不保存狀態的協議

HTTP 是一個無狀態協議,自身不具有保存以前發送過的請求或響應的功能。

以後隨着發展,引入了 Cookie 技術。

請求 URI 定位資源

HTTP 協議使用 URI 定位互聯網上的資源。正是由於 URI 的特定功能,在互聯網上任意位置的資源都能訪問到。

告知服務器意圖的 HTTP 方法

持久鏈接節省通訊量

HTTP 協議的初始版本中,每進行一次 HTTP 通訊就要斷開一次 TCP鏈接。

持久鏈接

爲解決上述 TCP 鏈接的問題,HTTP/1.1 和一部分的 HTTP/1.0 想出了持久鏈接的方法。

持久鏈接的特色是,只要任意一端沒有明確提出斷開鏈接,則保持 TCP 鏈接狀態。

好處在於減小了 TCP 鏈接的重複創建和斷開所形成的額外開銷,減輕了服務器端的負載。

管線化

管線化技術出現後,可以作到同時並行發送多個請求,而不須要一個接一個地等待響應了。

使用 Cookie 的狀態管理

Cookie 技術經過在請求和響應報文中寫入 Cookie 信息來控制客戶端的狀態。

Cookie 會根據從服務器端發送的響應報文內的一個叫作 Set-Cookie 的首部字段信息,通知客戶端保存 Cookie。當下次客戶端再往該服務器發送請求時,客戶端會自動在請求報文中加入 Cookie 值後發送出去。

服務器端發現客戶端發送過來的 Cookie 後,會去檢查到底是從哪個客戶端發來的鏈接請求,而後對比服務器上的記錄,最後獲得以前的狀態信息。

第三章、HTTP 報文內的 HTTP信息

HTTP 報文

用於 HTTP 協議交互的信息被稱爲 HTTP 報文。

HTTP 報文自己是由多行(用 CR+LF 做換行符)數據構成的字符串文本。

HTTP 報文大體可分爲報文首部和報文主體兩塊,一般,並不必定要有報文主體。

結構

實例

編碼提高傳輸速率

HTTP 在傳輸時能夠原樣直接傳輸,也能夠在傳輸時經過編碼提高傳輸速率,經過編碼,能有效地處理大量的訪問請求,但也消耗更多的 CPU 等資源。

報文主體和實體主體的差別

  • 報文:HTTP 通訊中的基本單位,由8位組字節流組成,經過 HTTP 通訊傳輸。
  • 實體:做爲請求或響應的有效載荷數據(補充項)被傳輸,其內容由實體首部和實體主體組成。

壓縮傳輸的內容編碼

經常使用的內容編碼有如下幾種:

  • gzip(GNU zip)
  • compress(UNIX 系統的標準壓縮)
  • deflate(zlib)
  • identity(不進行編碼)

分割發送的分塊傳輸編碼

在傳輸大容量數據時,經過把數據分割成多塊,可以讓瀏覽器逐步顯示頁面,這種把實體主體分塊的功能稱爲分塊傳輸編碼。

分塊傳輸編碼會將實體主體分紅多個部分(塊)。每一塊都會用十六進制來標記塊的大小,而實體主體的最後一塊會使用「0(CR+LF)」來標記。

發送多種數據的多部分對象集合

發送的一份報文主體內可含有多類型實體。一般是在圖片或文本文件等上傳時使用。

多部分對象集合包含的對象以下:

  • multipart/form-data:在 Web 表單文件上傳時使用。
  • multipart/byteranges:狀態碼 206,響應報文包含了多個範圍的內容時使用。

獲取部份內容的範圍請求

爲了解決加載超大圖片致使網絡中斷的狀況而實現的一種手段,叫作範圍請求。

對一份 10 000 字節大小的資源,若是使用範圍請求,能夠只請求5001~10 000 字節內的資源。

內容協商返回最合適的內容

當瀏覽器的默認語言爲英語或中文,訪問相同 URI 的 Web 頁面時,則會顯示對應的英語版或中文版的 Web 頁面。這樣的機制稱爲內容協商。

第四章、返回結果的狀態碼

HTTP 狀態碼負責表示客戶端 HTTP 請求的返回結果、標記服務器端的處理是否正常、通知出現的錯誤等工做。

狀態碼類別

更多:HTTP 響應代碼

第五章、與 HTTP 協做的 Web 服務器

用單臺虛擬主機實現多個域名

即使物理層面只有一臺服務器,但只要使用虛擬主機的功能,則能夠搭建多個站點。

通訊數據轉發程序:代理、網關、隧道

HTTP 通訊時,除客戶端和服務器之外,還有一些用於通訊數據轉發的應用程序:

  • 代理:一種有轉發功能的應用程序,扮演了服務器和客戶端中間人的角色。
  • 網關:轉發其餘服務器通訊數據的服務器,它就像本身擁有資源的源服務器同樣對請求進行處理。
  • 隧道:將相隔甚遠的客戶端和服務器二者之間進行中轉,並保持雙方通訊鏈接的應用程序。

    保存資源的緩存

緩存是指代理服務器或客戶端本地磁盤內保存的資源副本。利用緩存可減小對源服務器的訪問,所以也就節省了通訊流量和通訊時間。

客戶端的緩存

緩存不只能夠存在於緩存服務器內,還能夠存在客戶端瀏覽器中。以 Internet Explorer 程序爲例,把客戶端緩存稱爲臨時網絡文件。

第六章、HTTP 首部

注:這部分太多解釋,建議看原文

HTTP 請求報文

在請求中,HTTP 報文由方法、URI、HTTP 版本、HTTP 首部字段等部分構成

HTTP 響應報文

在響應中,HTTP 報文由 HTTP 版本、狀態碼(數字和緣由短語)、HTTP 首部字段 3 部分構成。

HTTP/1.1 首部字段一覽

通用首部字段:

請求首部字段:

響應首部字段:

實體首部字段:

第七章、HTTP 的缺點

主要的不足,例舉以下:

  • 通訊使用明文(不加密),內容可能會被竊聽(例如:抓包)
  • 不驗證通訊方的身份,所以有可能遭遇假裝(例如:DoS)
  • 沒法證實報文的完整性,因此有可能已遭篡改(例如:中間人攻擊)

HTTP+ 加密 + 認證 + 完整性保護=HTTPS

爲了統一解決上述這些問題,須要在 HTTP 等機制。咱們把添加了加密及認證機制的稱爲 HTTPS。

使用 HTTPS 通訊

常常會在 Web 的登陸頁面和購物結算界面等使用 HTTPS 通訊。

HTTPS 是身披 SSL 外殼的 HTTP

HTTPS 並不是是應用層的一種新協議。只是 HTTP 通訊接口部分用 SSL 和 TLS 協議代替而已。

簡言之,所謂 HTTPS,其實就是身披SSL 協議這層外殼的 HTTP。

SSL 是獨立於 HTTP 的協議,因此不光是 HTTP 協議,其餘運行在應用層的 SMTP 和 Telnet 等協議都可配合 SSL 協議使用。能夠說 SSL 是當今世界上應用最爲普遍的網絡安全技術。

相互交換密鑰的公開密鑰加密技術

SSL 採用一種叫作公開密鑰加密(非對稱加密)的加密處理方式。

HTTPS 的安全通訊機制

通訊步驟:

SSL 速度慢嗎

HTTPS 也存在一些問題,那就是當使用 SSL 時,它的處理速度會變慢。

HTTPS 比 HTTP 要慢 2 到 100 倍,由於與純文本通訊相比,加密通訊會消耗更多的CPU 及內存資源。若是每次通訊都加密,會消耗至關多的資源,平攤到一臺計算機上時,可以處理的請求數量一定也會隨之減小。

第八章、確認訪問用戶身份的認證

何爲認證

服務器爲了確認用戶的身份,一般須要覈對一些信息:

  • 密碼
  • 動態令牌
  • 數字證書
  • 生物認證
  • IC 卡

HTTP 使用的認證方式

  • BASIC 認證(基本認證)
  • DIGEST 認證(摘要認證)
  • SSL 客戶端認證
  • FormBase 認證(基於表單認證)

第九章、基於 HTTP 的功能追加協議

消除 HTTP 瓶頸的 SPDY

Google 在 2010 年發佈了 SPDY(取自 SPeeDY,發音同 speedy),其開發目標旨在解決 HTTP 的性能瓶頸,縮短 Web 頁面的加載時間(50%)。

SPDY 的目標

陸續出現的 Ajax 和 Comet 等提升易用性的技術,必定程度上使 HTTP獲得了改善,但 HTTP 協議自己的限制也使人有些一籌莫展。爲了進行根本性的改善,須要有一些協議層面上的改動。

處於持續開發狀態中的 SPDY 協議,正是爲了在協議級別消除 HTTP所遭遇的瓶頸。

使用 SPDY 後,HTTP 協議額外得到如下功能。

  • 多路複用流:經過單一的 TCP 鏈接,能夠無限制處理多個 HTTP 請求。
  • 賦予請求優先級:能夠給請求逐個分配優先級順序。這樣主要是爲了在發送多個請求時,解決因帶寬低而致使響應變慢的問題。
  • 壓縮 HTTP 首部
  • 推送功能:支持服務器主動向客戶端推送數據的功能。
  • 服務器提示功能:服務器能夠主動提示客戶端請求所需的資源。

使用瀏覽器進行全雙工通訊的WebSocket

利用 Ajax 和 Comet 技術進行通訊能夠提高 Web 的瀏覽速度。但問題在於通訊若使用 HTTP 協議,就沒法完全解決瓶頸問題。WebSocket網絡技術正是爲解決這些問題而實現的一套新協議及 API。

WebSocket 協議

主要特色:

  • 推送功能:支持由服務器向客戶端推送數據的推送功能。
  • 減小通訊量:只要創建起 WebSocket 鏈接,就但願一直保持鏈接狀態。

期盼已久的 HTTP/2.0

特色:

Web 服務器管理文件的 WebDAV

WebDAV(基於萬維網的分佈式創做和版本控制)是一個可對 Web 服務器上的內容直接進行文件複製、編輯等操做的分佈式文件系統。

第十章、構建 Web 內容的技術

  • HTML
  • CSS
  • JavaScript
  • 動態 HTML
  • CGI
  • Servlet
  • XML
  • RSS/Atom
  • JSON

第十一章、Web 的攻擊技術

對 Web 應用的攻擊模式有如下兩種:

  • 主動攻擊:是指攻擊者經過直接訪問 Web 應用,把攻擊代碼傳入的攻擊模式
  • 被動攻擊:指利用圈套策略執行攻擊代碼的攻擊模式

因輸出值轉義不徹底引起的安全漏洞:

  • XSS 注入
  • SQL 注入
  • OS 命令注入
  • HTTP 首部注入攻擊
  • 郵件首部注入攻擊
  • 目錄遍歷攻擊
  • 遠程文件包含漏洞

    因設置或設計上的缺陷引起的安全漏洞:

  • 強制瀏覽

  • 不正確的錯誤信息處理
  • 開放重定向

因會話管理疏忽引起的安全漏洞:

  • 會話劫持
  • 會話固定攻擊
  • 跨站點請求僞造

其餘安全漏洞:

  • 密碼破解
  • 點擊劫持
  • DoS 攻擊
  • 後門程序