前言:
最近這段時間慢慢的在補充基礎知識,其中最先開始看的一本書就是【圖解HTTP】這本書非常適合新手入門,里面的內容把廣泛上需要了解的HTTP相關知識點都講,又不會讓讀者記得泛泛或者小兒科,以下是我在閱讀的時候做的讀書筆記以加深印象已經理解。
第一章 了解Web及網絡基礎
Web使用一種名為HTTP(HyperText Transfer Protocol,超文本傳輸協議)的協議作為規范,完成客戶端到服務器端一系列運作流程,也就是說,Web是建立在HTTP協議上通信的。
通常互聯網是在 TCP/IP 協議族的基礎上運作的,HTTP屬于這個族的一個子集。
TCP/IP 協議很重要的一個概念就是分層。按層次分別為:
應用層 >>> 傳輸層 >>> 網絡層 >>> 鏈路層。
一個HTTP請求發出后,大致的流程即是這樣的:
首先客戶端在應用層發出一個想看某個Web頁面的HTTP請求 >>>
為方便傳輸,傳輸層把從應用層收到的數據(HTTP請求報文)分割成多個數據包并標記序號后,轉發給網絡層 >>>
在網絡層增加作為通信目的地的MAC地址后轉發給鏈路層。
至此,發往網絡的通信請求就準備好了。發送端或者接收端,層與層之間傳遞數據時,每一層會被打上或消去該層所屬的首部信息。
DNS(Domain Name System)服務是和 HTTP 協議一樣位于應用層的協議。它提供域名到 IP 地址的解析服務。
TCP 協議位于傳輸層,提供可靠的字節流服務。因為傳輸層將數據分割,TCP 協議采用三次握手(three-way handshaking)策略以確保數據準確送達:首先發送一個帶有 SYN 標志的數據包給對方 >>>
接收端收到后回傳一個帶有 SYN/ACK 標志的送達確認信息 >>>
最后發送端再回傳一個帶有 ACK 標志的數據包。
至此,“握手”結束。IP 協議位于網絡層。作用是把各種數據包發送給對方。在此期間,會通過一個 ARP 協議將 IP 地址解析為 MAC 地址。
第二章 簡單的HTTP協議
HTTP 協議規定,請求從客戶端發出,最后服務器端響應請求并返回。也就是說,一定是從客戶端開始建立通信,服務器端沒有接收到請求之前不會發送響應。
請求報文是由請求方法、請求URI、協議版本、請求首部字段(可選)和內容實體構成的。
GET /html/index.html HTTP/1.1
Host: ddrenched.com
name=ddrenched
- 響應報文是由協議版本、狀態碼、狀態碼原因短語、響應首部字段(可選)和主體構成。
HTTP/1.1 200 OK
Date: Fri, 30 Jua 2017 10:59:19 GMT
<html>
...
HTTP 是不保存狀態的協議:不對請求和響應的通信狀態進行保存。
每當有新的請求發送時,就會有對應的新響應產生。
這是為了快速處理大量任務。-
HTTP 方法
- GET:獲取資源。該方法用來請求訪問已經 URI 識別的資源。
- HEAD:獲取報文首部。和 GET 方法一樣,只是不返回報文主 體。常用來確認 URI 的有效性和資源的更新時間等。
- POST:傳輸實體資源。該方法用來傳輸實體的主體。雖然 GET 方法也可以傳輸實體的主體,但一般用 POST 方法。
- PUT:用來傳輸文件。要求在請求報文的主體中包含內容,然后保存到請求的 URI 指定的位置。
- DELETE:用來刪除文件。與PUT方法相反,DELETE 方法按照請求 URI 刪除指定資源。
- OPTION:用來查詢請求的 URI 資源支持的方法。
CONNECT:要求與代理服務器通信時建立隧道,實現用隧道協議進行 TCP 通信。主要是為了使用 SSL(Secure Socket Layer,安全套接)和 TLS(Transport Layer Security,傳輸層安全)協議把信息內容加密后經網絡隧道傳輸。
持久連接:只要任意一方(客戶端和服務器端)沒有明確提出斷開連接,則保持 TCP 連接狀態。
在 HTTP1.1 中,所有連接默認都是持久的。Cookie 技術通過在請求和響應報文中寫入 Cookie 信息來控制客戶端狀態。
Cookie 會根據服務器端發送的響應報文內的一個叫 Set-Cookie 的首部字段,通知客戶端保存 Cookie。當下次客戶端發送請求到服務器端時,客戶端會在報文中加入 Cookie 值再發送出去。
第4章 返回結果的 HTTP 狀態碼
狀態碼的職責是描述客戶端發出請求的返回結果,狀態碼以三位數字和原因短語組成。
數字中的第一位指定了響應類別:1XX:Informationao(信息性狀態碼)接受的請求正在處理
2XX:Success(成功狀態碼)請求正常處理完畢
3XX:Redirection(重定向狀態碼)需要附加操作以完成請求
4XX:Client Error(客戶端錯誤狀態碼)服務器無法處理請求
5XX:Server Error (服務器錯誤狀態碼)服務器處理請求錯誤
-
2XX 成功
- 200 OK:客戶端發來的請求被服務器正常處理了。
- 204 No Content:服務器正常處理,但返回的響應報文實體中沒有主體。
-
3XX 重定向
- 301 Moved Permanently:永久性重定向。表示請求的的資源已被分配了新的 URI,以后應使用資源現在所指的 URI。
如果已經把資源對應的 URI 保存為書簽,這時應該按照 Location 首部字段提示的 URI 重新保存。 - 302 Found:臨時性重定向。表示請求的資源已被分配了新的 URI,希望用戶(本次)使用新的 URI 訪問。
和301狀態碼相似,但302只是臨時的,比如 URI 被保存成書簽,但不會像301那樣去更新書簽。 - 303 See Other:表示由于對應的資源存在著另一個 URI,應使用 GET 方法定向獲取請求資源。
- 304 Not Modified:表示客戶端發送附帶請求時(If-Match,If-None-Match,If-Modified-Since,If-Unmodified-Since,If-Range,中任一首部),服務器端允許請求訪問資源,但因發生了未滿足條件的情況,直接返回304。
304狀態碼返回時,不包含任何響應主體部分。
304雖然被劃分在3XX中,其實和重定向沒什么關系。 - 307 Temporary Redirect:臨時重定向。與302有著相同含義。
- 301 Moved Permanently:永久性重定向。表示請求的的資源已被分配了新的 URI,以后應使用資源現在所指的 URI。
-
4XX 客戶端錯誤
- 400 Bad Request:表示請求報文中語法錯誤。當錯誤發生時,需要求改請求內容后再次發送請求。
- 401 Unanthorized:表示發送的請求需要通過 HTTP 認證。
- 403 Forbidden:表示對請求資源的訪問被服務器拒絕了。
未獲得系統訪問權限,訪問權限出現問題等情況都可能發生403。 - 404 Not Found:表示服務器上無法找到請求的資源。
-
5XX 服務器錯誤
- 500 Internal Server Error:表示服務器執行請求時發生錯誤。
- 503 Service Unavailable:表示服務器暫時超載無法處理。
第5章 與 HTTP 協作的 Web 服務器
HTTP/1.1 協議允許一臺服務器搭建多個 Web 站點。
Web 托管服務可以用一臺服務器為多個域名運行,這是使用了 Virtual Host(虛擬主機)的功能。
客戶端使用 HTTP 協議訪問服務器時,會經常采用域名的方式。在互聯網上,域名通過 DNS 服務映射到 IP 地址。可見,當請求發送至服務器時,已經是 IP 地址形式的訪問了。
由于用作寄存的服務器的 IP 地址是相同的,多個虛擬主機寄存的不同 Web 站點如何區分呢? 必須在 Host 首部內指定主機名或域名的 URI。
代理。代理服務器的基本行為就是接受客戶端的請求后轉發給其它服務器。代理不改變 URI,直接發送給前方持有資源的目標服務器(稱為源服務器)。從源服務器返回的響應經過代理服務器后再傳給客戶端。
在 HTTP 通信中,可以級聯多臺代理服務器。請求和響應的轉發會經由數臺類似鎖鏈一樣鏈接起來的代理服務器。每次轉發,需要附加 Via 首部字段以標示經過的主機信息。
網關工作機制和代理十分相似,網關能使通信線路上的服務器提供非 HTTP 協議服務。
隧道的目的是確保客戶端與服務器進行安全的通信 。
隧道可以按要求建立一條與服務器的通信線路,屆時使用加密手段進行通信。
第6章 HTTP 首部
---未完