前言
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請求頭中會增加一些信息,它告訴服務器我們要獲取的是最新的數據而不是緩存。