前言
B/S網路架構的核心是HTTP,掌握HTTP對一個從事網際網路工作的程式設計師來說非常重要。要理解HTTP,最重要的是要熟悉HTTP的HTTP Header,HTTP Header控制著網際網路上成千上萬使用者的資料傳輸。最關鍵的是,它控制著使用者瀏覽器的渲染行為和伺服器的執行邏輯。例如,當伺服器沒有使用者請求的資料的時候就會返回一個404狀態碼,告訴瀏覽器沒有要請求的資料,通常瀏覽器就會展示一個非常不願意看到的該頁面不存在的錯誤資訊。OK,接下來開始對於HTTP的學習。
HTTP是什麼
HTTP,英文全稱為HyperText Transfer Protocol,即超文字傳輸協議,是網際網路上應用最為廣泛的一種網路協議。HTTP是一種屬於應用層的物件導向的協議,一次HTTP操作稱為一個實物,其簡單工作過程如圖:
其工作過程可以分為四步:
1、首先客戶端與伺服器需要建立連線,只需要單擊某個超級連結,HTTP的工作開始
2、建立連線後,客戶端傳送一個請求給伺服器(預設請求伺服器的80埠),請求方式的格式為:統一資源識別符號(URL)+協議版本號+MIME資訊包括請求修飾符、客戶端資訊和可能的內容
3、伺服器接收到請求後,給予響應的相應資訊,其格式為一個狀態行,包括資訊的協議版本號、一個成功或錯誤的程式碼,後面是MIME資訊包括伺服器資訊、實體資訊和可能的內容
4、客戶端接收伺服器所返回的資訊通過瀏覽器顯示在使用者的螢幕上,然後客戶端和伺服器斷開連線
以上的過程中任意一步出錯,那麼產生的錯誤資訊將返回到客戶端,由螢幕輸出。對於使用者來說,這些過程都是HTTP自己完成的,使用者只要用滑鼠點選,等待資訊顯示就可以了。HTTP協議的主要特點可以概括如下:
1、支援客戶端/伺服器模式
2、簡單快速,客戶端向伺服器傳送請求服務時,只需要傳送請求方法和路徑。由於HTTP協議簡單,使得HTTP伺服器的程式規模小,因而通訊速度快
3、靈活,HTTP允許傳輸任意型別的資料物件,正在傳輸的型別由Content-Type加以標記
4、無連線,無連線的含義是限制每次連線只處理一個請求,伺服器處理完成客戶端的請求,並收到客戶的應答後,即斷開連線。採用這種方式可以節省傳輸時間
5、無狀態,HTTP協議是無狀態協議,無狀態是指協議對於事物處理沒有記憶能力,血少狀態意味著如果後續處理需要前面的資訊,則它必須重傳,這樣可能導致每次連線傳輸的資料量增大。另一方面,在伺服器不需要先前資訊時它的應答就較快
HTTP請求頭
請 求 頭 | 說 明 |
Accept | 指定客戶端能夠接收的內容型別,如Accept:text/plain,text/html |
Accept-Charset | 指定客戶端可以接受的字符集編碼,如Accept-Charset:UTF-8 |
Accept-Encoding | 指定瀏覽器可以支援的Web伺服器返回內容壓縮編碼型別,如Accept-Encoding:gzip,deflate |
Accept-Language | 指定瀏覽器可以接受的語言,如Accept-Language:zh-cn,zn,en |
Authorization | HTTP授權的授權證書,如Authorization:Basic... |
Cache-Control | 指定請求和響應遵循的快取機制,如Cache-Control:no-cache |
Connection | 表示是否需要持久連線(HTTP1.1預設進行持久連結),如Connection:close |
Cookie | HTTP請求傳送時會把儲存在該請求域名下的所有cookie值一起傳送給Web伺服器,如Cookie:$Version=1;Skin=new; |
Content-Length | 表示請求的請求體的內容長度,這個長度是經過了壓縮後的長度,如Content-Length:348 |
Content-Type | 表示請求的請求體對應的MIME資訊,如Content-Type:application/x-www/form-urlencoded |
Date | 表示請求傳送的日期和時間,如Date:Oct, 24 Nov 2015 20:12:30 GMT |
Host | 表示請求的伺服器的域名和埠號,如Host:home.cnblogs.com |
Pragma | 表示用來包含實現特定的指令,如Pragma:no-cache |
Referer | 表示從哪個連結鏈到當前地址,如Referer:http://www.cnblogs.com/ |
User-Agent | 表示發出請求的使用者資訊(如使用者作業系統、瀏覽器和其他屬性),如User-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64) |
一個HTTP請求頭的例子,比如我訪問了我的空間:
HTTP響應頭
響 應 頭 | 說 明 |
Allow | 表示對某網路資源的有效請求行為,不允許則返回405,如Allow:GET,HEAD |
Cache-Control | 表示告訴所有的快取機制是否可以快取及哪種快取型別,如Cache-Control:no-cache |
Content-Encoding | 表示Web伺服器只是的返回內容壓縮編碼型別,如Content-Encoding:gzip |
Content-Language | 表示響應體的語言,如Content-Language:en,zh |
Content-Length | 表示響應體的內容長度,這個長度是經過了壓縮後的長度,如Content-Language:348 |
Content-Type | 表示返回內容的MIME型別,如Content-Type:text/html;charset=utf-8 |
Date | 表示原始伺服器訊息發出的時間,如Date:Oct, 24 Nov 2015 20:12:30 GMT |
Expires | 表示響應過期的日期和時間,如Expires:Sat, 24 Oct 2015 20:45:30 GMT |
Location | 用來重定向接收方到非請求URL的位置來完成請求或標識新的資源,如Location:http://www.sina.com.cn/ |
Last-Modified | 表示資源的最後修改時間,如Last-Modified: 表示響應過期的日期和時間,如Expires:Sat, 24 Oct 2015 20:45:30 GMT |
Retry-After | 表示如果響應體如果暫時不可取得,客戶端在指定時間之後再嘗試,如Retry-After:120 |
Server | 表示Web伺服器軟體名稱,如Server:Apache/1.3.6(Unix) |
Set-Cookie | 表示設定Http Cookie,如Set-Cookie:UserID=RickyXu;Max-Age=3600;Version=1 |
Transfer-Encoding | 表示檔案傳輸編碼,如Transfer-Encoding-chunked |
www.Authenticate | 表示客戶端請求實體應該使用的授權方案,如WWW-Authenticate:Basic |
一個HTTP響應頭的例子,比如我訪問了我的空間:
最後幾個"X-"開頭估計是有特殊用途而通過程式碼設定到HTTP HEADER裡面去的內容
HTTP狀態碼
列舉一下常見的HTTP狀態碼:
狀 態 碼 | 語 法 |
200 | 表示客戶端請求成功,通常這表示伺服器提供了請求的網頁 |
201 | 表示客戶端請求成功並且伺服器建立了新的資源 |
202 | 表示伺服器已經接受請求但尚未處理 |
204 | 表示伺服器成功處理了請求但沒有任何返回內容 |
302 | 表示臨時跳轉,跳轉的地址通過Location指定 |
400 | 表示客戶端請求有語法錯誤,不能被伺服器識別 |
403 | 表示伺服器收到請求,但是拒絕提供服務 |
404 | 表示伺服器找不到請求的資源 |
500 | 表示伺服器發生了不可預期的錯誤 |
503 | 表示伺服器目前無法使用(由於超載或停機維護),通常這只是暫時狀態 |
505 | 表示伺服器不支援請求中所使用的HTTP協議版本 |
HTTP快取
想想現在的大型網站,隨便一個頁面都是一兩百個請求,每天PV量過千萬、過億,如果沒有快取,使用者體驗會急劇下降,同時伺服器壓力和網路頻寬都面臨嚴重的考驗。
快取分為服務端快取和客戶端快取,客戶端快取一般指的是瀏覽器快取,目的就是加速各種靜態資源的訪問。瀏覽器快取有兩種機制:HTML Meta標籤和HTTP HEADER資訊。
1、HTML META標籤
瀏覽器快取機制主要是HTTP協議定義的快取機制(如Expires、Cache-Control等),但是也有非HTTP協議定義的快取機制,如使用HTML META標籤,Web開發者可以在HTML頁面的<head>節點中加入<meta>標籤,程式碼如下:
<META HTTP-EQUIV="Pragma" CONTENT="no-cache">
上述程式碼的作用是告訴瀏覽器當前頁面不被快取,每次訪問都需要去伺服器讀取。使用上很簡單,但只有部分瀏覽器支援,而且所有快取代理伺服器都不支援,因為代理不解析HTML內容本身,而廣泛應用的還是HTTP HEADER資訊來控制快取。
2、HTTP HEADER資訊
當使用了HTTP HEADER資訊來控制快取,那麼瀏覽器第一次請求時:
瀏覽器再次請求時:
幾個重要的概念:
(1)Expires策略
Expires策略是Web伺服器響應訊息頭欄位,在響應HTTP請求時告訴瀏覽器在過期時間前瀏覽器可以直接從瀏覽器快取取資料而無須再次請求。不過Expires策略在HTTP1.1基本忽略,因為Expires返回的到期時間是伺服器的時間,如果客戶端和伺服器的時間相差很大,那麼誤差就很大。
(2)Cache-Control策略
Cache-Control策略與Expires策略的作用一致,都是致命當前資源的有效期,控制瀏覽器是否直接從瀏覽器快取取資料還是重新傳送請求到伺服器取資料。只不過Cache-Control的選擇更多、被各瀏覽器支援得更好、設定得更細緻,如果同時設定的話,其優先順序也比較高(高於Expires),Cache-Control的選擇有:
選 擇 | 作 用 |
public | 表示響應可被任何快取區快取,在響應頭中設定 |
private | 表示對於單個使用者的整個或部分響應訊息,不能被共享快取處理,在響應頭中設定 |
no-cache | 表示請求或響應訊息不被快取,在請求頭和響應頭中都可以設定 |
no-store | 表示防止重要的資訊被無意釋出,所有內容都不會被快取到快取中或者Internet臨時檔案中,在響應頭中設定 |
must-revalidate/proxy-revaliate | 表示如果快取的內容失效,請求必須傳送到伺服器/代理以進行重新驗證,在請求頭中設定 |
max-age=xxx | 表示快取的內容將在xxx秒後失效,這個選項只有HTTP1.1可用,在響應頭中設定 |
Pragma是為了相容HTTP1.0,它的的作用和Cache-Control是一樣的。
如果我們使用Ctrl+F5組合件重新整理一個頁面時,那麼在HTTP請求頭中會增加一些資訊,它告訴伺服器我們要獲取的是最新的資料而不是快取。