圖解HTTP
第一章
web使用HTTP (HyperText Transfer Protocol,超文本傳輸協議)協議作文規范,完成從客戶端到服務器端等一系列運作流程。
協議:計算機與網絡設備要相互通信,雙方就必須基于相同的方法。比如,如何探測到通信目標、由哪一邊先發起通信、使用哪種語言進行通信、怎樣結束通信等規則都需要事先確定。不同的硬件、操作系統之間的通信,所有的這一切都需要一種規則。而我們就把這種規則稱為協議(protocol)。
TCP/IP 協議族分層:
TCP/IP 協議族按層次分別分為以下 4 層:應用層、傳輸層、網絡層和數據鏈路層。
把 TCP/IP 層次化是有好處的。比如,如果互聯網只由一個協議統籌,某個地方需要改變設計時,就必須把所有部分整體替換掉。而分層之后只需把變動的層替換掉即可。把各層之間的接口部分規劃好之后,每個層次內部的設計就能夠自由改動了。
層次化之后,設計也變得相對簡單了。每一層可以只考慮分派給自己的任務,而不需要弄清下一層完成任務的具體細節。
應用層:
應用層決定了向用戶提供應用服務時通信的活動。比如,FTP(File Transfer Protocol,文件傳輸協議)和 DNS(Domain Name System,域名系統)和HTTP 協議。
傳輸層:
傳輸層提供處于網絡連接中的兩臺計算機之間的數據傳輸。在傳輸層有兩個性質不同的協議:TCP(Transmission Control Protocol,傳輸控制協議)和 UDP(User Data Protocol,用戶數據報協議)。
網絡層:
網絡層用來處理在網絡上流動的數據包。數據包是網絡傳輸的最小數據單位。該層規定了通過怎樣的路徑(所謂的傳輸路線)到達對方計算機,并把數據包傳送給對方。與對方計算機之間通過多臺計算機或網絡設備進行傳輸時,網絡層所起的作用就是在眾多的選項內選擇一條傳輸路線。
鏈路層(又名數據鏈路層,網絡接口層):
用來處理連接網絡的硬件部分。包括控制操作系統、硬件的設備驅動、NIC(Network Interface Card,網絡適配器,即網卡),及光纖等物理可見部分(還包括連接器等一切傳輸媒介)。硬件上的范疇均在鏈路層的作用范圍之內。
利用 TCP/IP 協議族進行網絡通信時,會通過分層順序與對方進行通信。發送端從應用層往下走,接收端則往應用層往上走。
IP協議
Internet Protocol 網際協議
IP 協議的作用是把各種數據包傳送給對方。其中兩個重要的條件是 IP 地址和 MAC地址(Media Access Control Address)。
IP 地址指明了節點被分配到的地址,MAC 地址是指網卡所屬的固定地址。IP 地址可變換,但 MAC地址基本上不會更改。
ARP (Address Resolution Protocol)是一種用以解析地址的協議,根據通信方的 IP 地址就可以反查出對應的 MAC 地址。
ARP用途:通信的雙方在同一局域網(LAN)內的情況是很少的,通常是經過多臺計算機和網絡設備中轉才能連接到對方。而在進行中轉時,會利用下一站中轉設備的 MAC地址來搜索下一個中轉目標。like 快遞。
TCP協議
Transmission Control Protocol 傳輸控制協議
提供可靠的字節流服務。
字節流服務(Byte Stream Service)是指,為了方便傳輸,將大塊數據分割成以報文段(segment)為單位的數據包進行管理。
可靠的傳輸服務是指,能夠把數據準確可靠地傳給對方。
一言以蔽之,
TCP 協議為了更容易傳送大數據才把數據分割,而且 TCP 協議能夠確認數據最終是否送達到對方。
為了準確無誤地將數據送達目標處,TCP 協議采用了三次握手(three-way handshaking)策略。
握手過程中使用了 TCP 的標志(flag) —— SYN(synchronize,同步) 和ACK(acknowledgement,回執)。
發送端首先發送一個帶 SYN 標志的數據包給對方。接收端收到后,回傳一個帶有 SYN/ACK 標志的數據包以示傳達確認信息。最后,發送端再回傳一個帶 ACK 標志的數據包,代表“握手”結束。
DNS協議
Domain Name System 域名系統
是和 HTTP 協議一樣位于應用層的協議。它提供域名到 IP 地址之間的解析服務。
計算機既可以被賦予 IP 地址,也可以被賦予主機名和域名。
DNS 協議提供通過域名查找 IP 地址,或逆向從 IP 地址反查域名的服務。
URI和URL
URL(Uniform Resource Locator,統一資源定位符)指定文檔所在地址。
URL正是使用 Web 瀏覽器等訪問 Web 頁面時需要輸入的網頁地址。
URI (Uniform Resource Identifier)用字符串標識某一互聯網資源,而 URL表示資源的地點(互聯網上所處的位置)。可見 URL是 URI 的子集。
URI舉例:
第二章
http用于客戶端和服務器之間的通信。
請求訪問文本或圖像等資源的一端稱為客戶端,而提供資源響應的一端稱為服務器端。
請求報文是由請求方法、請求 URI、協議版本、可選的請求首部字段和內容實體構成的。
響應報文基本上由協議版本、狀態碼(表示請求成功或失敗的數字代碼)、用以解釋狀態碼的原因短語、可選的響應首部字段以及實體主體構成。
HTTP是無狀態協議
HTTP 協議自身不對請求和響應之間的通信狀態進行保存。
有了 Cookie 再用 HTTP 協議通信,就可以管理狀態了。
HTTP/1.1 中可使用的方法
GET:獲取資源
將數據附加在 URL 之后,以查詢字符串(Query String)的形式。數據以鍵值對的方式表示,并用 &
連接。查詢字符串以 ?
開頭。
POST:傳輸實體主體,用于向服務器提交數據
將數據放在 HTTP 請求的主體部分(body),而不是 URL 中。這使得 POST 可以傳輸較多數據,并且適合傳遞敏感信息。
PUT:傳輸文件
HEAD:獲得報文首部
DELETE:刪除文件
OPTIONS:詢問支持的方法
TRACE:追蹤路徑
CONNECT:要求用隧道協議連接代理
HTTP keep-alive
持久連接的特點是,只要任意一端沒有明確提出斷開連接,則保持 TCP 連接狀態。
管線化(pipelining):不用等待響應亦可直接發送下一個請求。同時并行發送多個請求,而不需要一個接一個地等待響應。
Cookie
Cookie 技術通過在請求和響應報文中寫入 Cookie 信息來控制客戶端的狀態。
Cookie 會根據從服務器端發送的響應報文內的一個叫做 Set-Cookie 的首部字段信息,通知客戶端保存 Cookie。當下次客戶端再往該服務器發送請求時,客戶端會自動在請求報文中加入 Cookie 值后發送出去。
第四章
狀態碼告知從服務器端返回的請求結果,狀態碼如 200 OK,以 3 位數字和原因短語組成。
第五章
物理層面只有一臺服務器,使用虛擬主機的功能,則可以假想已具有多臺服務器。
在相同的 IP 地址下,由于虛擬主機可以寄存多個不同主機名和域名的 Web 網站,因此在發送 HTTP 請求時,必須在 Host 首部內完整指定主機名或域名的 URI。
代理
代理服務器的基本行為就是接收客戶端發送的請求后轉發給其他服務器。代理不改變請求 URI,會直接發送給前方持有資源的目標服務器。
持有資源實體的服務器被稱為源服務器。從源服務器返回的響應經過代理服務器后再傳給客戶端。
轉發時,需要附加Via 首部字段以標記出經過的主機信息。
為什么使用代理服務器?
利用緩存技術(稍后講解)減少網絡帶寬的流量,組織內部針對特定網站的訪問控制,以獲取訪問日志為主要目的,等等。
緩存代理
代理轉發響應時,緩存代理(Caching Proxy)會預先將資源的副本(緩存)保存在代理服務器上。
當代理再次接收到對相同資源的請求時,就可以不從源服務器那里獲取資源,而是將之前緩存的資源作為響應返回。
透明代理
轉發請求或響應時,不對報文做任何加工的代理類型被稱為透明代理。
網關
利用網關可以由 HTTP 請求轉化為其他協議通信。工作機制和代理十分相似。
利用網關能提高通信的安全性,因為可以在客戶端與網關之間的通信線路上加密以確保連接的安全。
網關可以連接數據庫,使用SQL語句查詢數據。
隧道
隧道可按要求建立起一條與其他服務器的通信線路,屆時使用 SSL等加密手段進行通信。隧道的目的是確保客戶端能與服務器進行安全的通信。
可以和遠距離的服務器安全通信。
隧道不會去解析 HTTP 請求,在通信雙方斷開連接時結束。
緩存
緩存是指代理服務器或客戶端本地磁盤內保存的資源副本。利用緩存可減少對源服務器的訪問,因此也就節省了通信流量和通信時間。
緩存服務器是代理服務器的一種,當代理轉發從服務器返回的響應時,代理服務器將會保存一份資源的副本。
優勢在于利用緩存可避免多次從源服務器轉發資源。因此客戶端可就近從緩存服務器上獲取資源,而源服務器也不必多次處理相同的請求了。
第六章
HTTP 首部
HTTP 請求報文
在請求中,HTTP 報文由方法、URI、HTTP 版本、HTTP 首部字段等部分構成。
HTTP 響應報文
在響應中,HTTP 報文由 HTTP 版本、狀態碼(數字和原因短語)、HTTP 首部字段 3 部分構成。
HTTP 首部字段
通用首部字段(General Header Fields)
請求報文和響應報文兩方都會使用的首部。
請求首部字段(Request Header Fields)
從客戶端向服務器端發送請求報文時使用的首部。補充了請求的附加內容、客戶端信息、響應內容相關優先級等信息。
響應首部字段(Response Header Fields)
從服務器端向客戶端返回響應報文時使用的首部。補充了響應的附加內容,也會要求客戶端附加額外的內容信息。
實體首部字段(Entity Header Fields)
針對請求報文和響應報文的實體部分使用的首部。補充了資源內容更新時間等與實體有關的信息。
端到端首部(End-to-end Header)
分在此類別中的首部會轉發給請求 / 響應對應的最終接收目標,且必須保存在由緩存生成的響應中,另外規定它必須被轉發。
逐跳首部(Hop-by-hop Header)
分在此類別中的首部只對單次轉發有效,會因通過緩存或代理而不再轉發。HTTP/1.1 和之后版本中,如果要使用 hop-by-hop 首部,需提供 Connection 首部字段。
Keep-Alive是逐跳首部。
HTTP/1.1 通用首部字段
Cache-Control:控制緩存的行為
Connection:控制不再轉發給代理的首部字段,管理持久連接。
HTTP/1.1 版本的默認連接都是持久連接。為此,客戶端會在持久連接上連續發送請求。當服務器端想明確斷開連接時,則指定Connection 首部字段的值為 Close。
Date:表明創建 HTTP 報文的日期和時間。
Trailer:說明在報文主體后記錄了哪些首部字段,應用在 HTTP/1.1 版本分塊傳輸編碼時。
Transfer-Encoding:傳輸報文主體時采用的編碼方式。
Upgrade:用于檢測 HTTP 協議及其他協議是否可使用更高的版本進行通信,其參數值可以用來指定一個完全不同的通信協議。
Via:為了追蹤客戶端與服務器之間的請求和響應報文的傳輸路徑,還可避免請求回環的發生。所以必須在經過代理時附加該首部字段內容。
Warning:告知用戶一些與緩存相關的問題的警告。
請求首部字段
Accept:用戶代理能夠處理的媒體類型及媒體類型的相對優先級。可使用 type/subtype 這種形式,一次指定多種媒體類型。q( quality factor)是權重。
Authorization:用戶代理的認證信息。
From:告知服務器使用用戶代理的用戶的電子郵件地址。
Host:虛擬主機運行在同一個 IP 上,因此使用首部字段 Host 加以區分。
If-Match:形如 If-xxx 這種樣式的請求首部字段,都可稱為條件請求。服務器接收到附帶條件的請求后,只有判斷指定條件為真時,才會執行請求。
If-None-Match:在 GET 或 HEAD 方法中使用首部字段 If-None-Match 可獲取最新的資源。只有在 If-None-Match 的字段值與 ETag 值不一致時,可處理該請求。與 If-Match 首部字段的作用相反。
Referer:告知服務器請求的原始資源的 URI。
User-Agent:將創建請求的瀏覽器和用戶代理名稱等信息傳達給服務器。
響應首部字段
響應首部字段是由服務器端向客戶端返回響應報文中所使用的字段,用于補充響應的附加信息、服務器信息,以及對客戶端的附加要求等信息。
Age:首部字段 Age 能告知客戶端,源服務器在多久前創建了響應。字段值的單位為秒。
ETag:告知客戶端實體標識,服務器會為每份資源分配對應的 ETag值。它是一種可將資源以字符串形式做唯一性標識的方式。
強 ETag 值,不論實體發生多么細微的變化都會改變其值。
弱 ETag 值只用于提示資源是否相同。只有資源發生了根本改變,產生差異時才會改變 ETag 值。這時,會在字段值最開始處附加 W/。
Location:使用首部字段 Location 可以將響應接收方引導至某個與請求 URI 位置不同的資源。
實體首部字段
實體首部字段是包含在請求報文和響應報文中的實體部分所使用的首部,用于補充內容的更新時間等與實體相關的信息。
Allow:用于通知客戶端能夠支持 Request-URI 指定資源的所有 HTTP 方法。
Content-Encoding:告知客戶端服務器對實體的主體部分選用的內容編碼方式。
內容編碼是指在不丟失實體信息的前提下所進行的壓縮。gzip、compress、deflate、identity。
Content-Languag:首部字段 Content-Language 會告知客戶端,實體主體使用的自然語言(指中文或英文等語言)。
Expires:將資源失效的日期告知客戶端。
Last-Modified:指明資源最終修改的時間。
為 Cookie 服務的首部字段
Cookie 是用戶識別及狀態管理。
Set-Cookie:當服務器準備開始管理客戶端的狀態時,會事先告知各種信息。