什麼是http協議?客戶端連上web服務器後,若是想獲取web服務器中的某個web資源,就須要遵照必定的通信格式,http協議就是用於定義客戶端與服務器之間的通信格式。html
http是hypertext transfer protocol(超文本傳輸協議)的簡寫,它是TCP/IP協議的一個應用層協議,用於定義web瀏覽器與web服務器之間交換數據的過程。web
深刻學習http協議是學好web開發的一個重要前提!apache
http協議的版本:http/1.0、http/1.1瀏覽器
(使用telnet演示,ctrl+],讓回顯正常顯示)緩存
在http1.0協議中,客戶端與服務器創建鏈接後,只能獲取一個web資源。
http1.1協議,容許客戶端與web服務器創建鏈接後,在一個鏈接上獲取多個資源。(使用telnet演示)
若是頁面上有對別的web資源的引用,那麼客戶端會屢次請求服務器,例如,有三張圖片,那麼就會一共請求四次(CSS精靈,優化程序)。tomcat
客戶端連上服務器以後,向服務器請求某個web資源,稱之爲客戶端向服務器發送了一個http請求。一個完整的http請求包括:安全
一個請求行服務器
若干消息頭app
實體內容jsp
GET /aaa/1.html HTTP/1.1
Host: localhost:8080
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:29.0) Gecko/20100101 Firefox/29.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,/;q=0.8
Accept-Language: en-us,zh-cn;q=0.8,zh;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate
DNT: 1
Connection: keep-alive
If-Modified-Since: Fri, 13 Jun 2014 23:27:47 GMT
If-None-Match: W/「268-1402702067708」
Cache-Control: max-age=0
請求行:用於描述客戶端的請求方式、請求資源的名稱,以及使用HTTP協議版本號
消息頭:用於描述客戶端請求哪臺主機,以及客戶端的一些環境信息等
實體內容:在此次請求中所攜帶的數據(消息頭與實體內容中有一個空行)
請求行中的GET稱爲請求方式,請求方式有:
POST、GET、HEAD、OPTIONS、DELETE、PUT
經常使用的有:GET、POST
用戶若是沒有設置,默認狀況下瀏覽器向服務器發送的都是get請求。(直接在地址欄輸入地址訪問,點擊超連接訪問,表單訪問)
POST和GET,都用於向服務器請求某個資源,這兩種方式的區別主要表如今數據傳遞上:
若是請求方式是GET,那麼能夠在請求的URL地址後面以 ? 的形式帶上交給服務器的數據,多個數據之間用 & 分隔(GET /aaa/1.html?name=jack&pwd=123)
GET方式這種附帶參數是有限制的,其數據容量不能超過1K(不安全)
若是使用POST請求,則能夠在請求的實體內容中(負載)向服務器發送數據,並且數量不限(安全)
經常使用的消息頭:
Accept : text/html,image/* 告訴服務器,客戶端所支持的類型
Accept-Charset : ISO=8859-1 客戶端採用的編碼表
Accept-Encoding : gzip,compress 客戶端所支持的數據壓縮格式
Accept-Language : en-us,zh-cn 客戶端的語言環境(國際化)
Host : www.xinsiku.com:80 客戶端想訪問的主機
If-Modified-Since: Fri, 13 Jun 2014 23:27:47 GMT 客戶端對於資源的最後緩存時間
Referer : http://www.xinsiku.com/index.jsp 告知服務端,客戶端是從哪一個頁面去訪問服務器的(防盜鏈)
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:29.0) Gecko/20100101 Firefox/29.0 客戶端的機器環境(使用的操做系統,瀏覽器,版本號等)
Cookie 給服務器帶一些數據
Connection: close/keep-alive 告訴服務器,請求完以後,是保存鏈接仍是關閉鏈接
Date : Fri, 13 Jun 2014 23:27:47 GMT 請求時間值
一個http響應表明服務器向客戶端返回的數據,它包括:
一個狀態行,用於描述服務器對請求的處理結果
若干消息頭,消息頭用於描述服務器的基本信息,以及數據的描述,服務器經過這些數據的描述信息,能夠通知客戶端如何處理等一會返回的數據
以及實體內容,服務器向客戶端返回的數據(實體內容與消息頭中間有一個空行)
HTTP/1.1 200 OK (304 Not Modified)
Server : Apache-Coyote/1.1
Etag : W/「268-1402702066000」
Date : Sat, 14 Jun 2014 03:45:49 GMT
Accept-Ranges : bytes
Content-Length : 268
Content-Type : text/html
Date : Sat, 14 Jun 2014 03:47:34 GMT
Etag : W/「268-1402702066000」
Last-Modified : Fri, 13 Jun 2014 23:27:46 GMT
Server : Apache-Coyote/1.1
格式:HTTP版本號 狀態碼 緣由敘述
舉例:HTTP/1.1 200 OK
狀態碼用於表示服務器對請求的處理結果,它是一個三位的十進制數。響應狀態碼分爲5類:
100~199 表示成功接收請求,要求客戶端繼續提交下一次請求才能完成整個處理過程(不多見)
200~299 表示成功接收請求並已完成整個處理過程,經常使用200
300~399 爲完成請求,客戶須要進一步細化請求。例如:請求的資源已經移動一個新地址,經常使用302(讓請求去找別的資源)、307和304(讓客戶端去拿緩存)
400~499 客戶端請求有錯誤,經常使用 404
500~599 服務器端出現錯誤,經常使用500
http響應經常使用響應頭:
Location: http://xinsiku/index.jsp 這個頭一般和302一塊兒使用,告訴客戶端去找別的資源 (demo)
Server: apache tomcat 告訴瀏覽器服務器的類型
Content-Encoding: gzip 告訴瀏覽器數據的壓縮格式(gzip,減小流量,提高性能)(demo)
Content-Length: 80 告訴瀏覽器返回數據的長度
Content-Language: zh-cn 語言環境
Content-Type: text/html; charset=GB2312 返回數據的類型和編碼 (demo)
Last-Modified: Fri, 13 Jun 2014 23:27:46 GMT 數據的最後修改時間(跟緩存相關)
Refresh: 1;url=http://www.xinsiku.com 多長時間定時刷新(服務器經過這個頭來控制瀏覽器行爲)(demo)
Content-Disposition: attachment; filename=aaa.zip 用下載的方式打開返回的數據(提示用戶下載)(demo)
Transfer-Encoding: chunked 告訴瀏覽器,數據是以塊的方式傳輸的
Set-Cookie:SS=Q0=5Lb_nQ; path=/search 控制Cookie與Session相關(後面有專題講)
ETag: W/「7777-1242234904000」 給網頁生成一個編號(作緩存用,單位能夠到毫秒級別,Modified相關的只能到秒級別,高性能網站才須要相關開發)
Expires: -1 作緩存相關設置(-1或0 不要緩存,也能夠設置緩存時間,如:2014 08 09,該設置是基於這次返回數據的,對別的資源沒有效果)
Cache-Control: no-cache 設置緩存
Pragma: no-cache 設置緩存(針對不一樣的瀏覽器開發商,對緩存的設置,這三個設置一塊兒用)
Connection: close/Keep-Alive
Date: Fri, 13 Jun 2014 23:27:46 GMT
在實際開發中,咱們是不須要編寫這些複雜的頭信息的,由於在JavaEE中已經封裝了不少針對不一樣請求和響應的處理對象,直接調用相對應的API就能夠了,可是隻要清楚了響應頭,咱們也能夠本身去編寫一些響應程序,並且對於響應對象的理解也更加容易。
HTTP請求頭字段
Range頭指示服務器只傳輸一部分web資源。這個頭能夠用來實現斷點續傳功能。Renge字段能夠經過三種格式設置傳輸的字節範圍:
Range : bytes=1000-200 (傳輸範圍從1000到2000字節)
Range : bytes=1000- (從1000個字節之後的全部內容)
Range : bytes=1000 (傳輸最後1000個字節)
HTTP響應消息頭字段
Accept-Ranges: 表示知否支持Renge,若是支持,返回:Accept-Ranges: bytes,若是不支持,返回:Accept-Ranges: none Content-Range : 返回的Web資源的字節範圍,如:Content-Range : 1000-3000/5000(表示本次返回資源的1000到3000字節的數據,總共5000字節)