1.HTTP協議:即超文本傳輸協議(Hypertext transfer protocol)。是一種詳細規定了瀏覽器和Web服務器之間互相通訊的規則,它容許將超文本標記語言(HTML)文檔從Web服務器傳送到客戶端的瀏覽器。
它可使瀏覽器更加高效,使網絡傳輸減小。它不只保證計算機正確快速地傳輸超文本文檔,還肯定傳輸文檔中的哪一部分,以及哪部份內容首先顯示(如文本先於圖形)等。
HTTP是一個應用層協議,由請求和響應構成,是一個標準的客戶端服務器模型。HTTP是一個無狀態的協議。
在Internet中全部的傳輸都是經過TCP/IP進行的。HTTP協議做爲TCP/IP模型中應用層的協議也不例外。HTTP協議一般承載於TCP協議之上,有時也承載於TLS或SSL協議層之上,這個時候,就成了咱們常說的HTTPS。
HTTP是一個屬於應用層的面向對象的協議,因爲其簡捷、快速的方式,適用於分佈式超媒體信息系統。它於1990年提出,通過幾年的使用與發展,獲得不斷地完善和擴展。目前在WWW中使用的是HTTP/1.0的第六版,HTTP/1.1的規範化工做正在進行之中,並且HTTP-NG(Next Generation of HTTP)的建議已經提出。
2.無狀態協議:
協議的狀態是指下一次傳輸能夠「記住」此次傳輸信息的能力。
HTTP是不會爲了下一次鏈接而維護此次鏈接所傳輸的信息,爲了保證服務器內存。
好比客戶得到一張網頁以後關閉瀏覽器,而後再一次啓動瀏覽器,再登錄該網站,可是服務器並不知道客戶關閉了一次瀏覽器。
因爲Web服務器要面對不少瀏覽器的併發訪問,爲了提升Web服務器對併發訪問的處理能力,在設計HTTP協議時規定Web服務器發送HTTP應答報文和文檔時,不保存發出請求的Web瀏覽器進程的任何狀態信息。這有可能出現一個瀏覽器在短短几秒以內兩次訪問同一對象時,服務器進程不會由於已經給它發過應答報文而不接受第二期服務請求。因爲Web服務器不保存發送請求的Web瀏覽器進程的任何信息,所以HTTP協議屬於無狀態協議(Stateless Protocol)。
3.HTTP協議是無狀態的和Connection: keep-alive的區別:
無狀態是指協議對於事務處理沒有記憶能力,服務器不知道客戶端是什麼狀態。從另外一方面講,打開一個服務器上的網頁和你以前打開這個服務器上的網頁之間沒有任何聯繫。
HTTP是一個無狀態的面向鏈接的協議,無狀態不表明HTTP不能保持TCP鏈接,更不能表明HTTP使用的是UDP協議(無鏈接)。
從HTTP/1.1起,默認都開啓了Keep-Alive,保持鏈接特性,簡單地說,當一個網頁打開完成後,客戶端和服務器之間用於傳輸HTTP數據的TCP鏈接不會關閉,若是客戶端再次訪問這個服務器上的網頁,會繼續使用這一條已經創建的鏈接。
Keep-Alive不會永久保持鏈接,它有一個保持時間,能夠在不一樣的服務器軟件(如Apache)中設定這個時間。
4.HTTP中文譯名問題
HTTP超文本傳輸協議,聽上去像是傳輸層的協議同樣,但事實上你們都知道HTTP和FTP同樣都是屬於應用層的協議。既然是應用層的協議,怎 麼就取這樣一個誤導人的名稱?在對TCP/IP協議還不熟悉的時候,這很容易讓人誤解和納悶的。在wiki上有這麼一段話:
HTTP在中國大陸被翻譯爲「超文本傳輸協議」,由於「transfer」在中文裏有「傳輸」的含意。但依據 HTTP 定製者之一的 Roy Fielding博士的論文[1](6.5.3節),做者專門強調「transfer」表示的是「(表述狀態的)轉移」 (Representational State Transfer),而不是「傳輸」(transport)。故其中文譯名「超文本傳輸協議」偏偏反映了這種誤解。更符合原義的譯名應該爲「超文本轉移協議」。html
HTTP協議的主要特色可歸納以下:
1.支持客戶/服務器模式。支持基本認證和安全認證。
2.簡單快速:客戶向服務器請求服務時,只需傳送請求方法和路徑。請求方法經常使用的有GET、HEAD、POST。每種方法規定了客戶與服務器聯繫的類型不一樣。因爲HTTP協議簡單,使得HTTP服務器的程序規模小,於是通訊速度很快。
3.靈活:HTTP容許傳輸任意類型的數據對象。正在傳輸的類型由Content-Type加以標記。
4.HTTP 0.9和1.0使用非持續鏈接:限制每次鏈接只處理一個請求,服務器處理完客戶的請求,並收到客戶的應答後,即斷開鏈接。
HTTP 1.1使用持續鏈接:沒必要爲每一個Web對象建立一個新的鏈接,一個鏈接能夠傳送多個對象,採用這種方式能夠節省傳輸時間。
5.無狀態:HTTP協議是無狀態協議。無狀態是指協議對於事務處理沒有記憶能力。缺乏狀態意味着若是後續處理須要前面的信息,則它必須重傳,這樣可能致使每次鏈接傳送的數據量增大。另外一方面,在服務器不須要先前信息時它的應答就較快。
6.永遠都是客戶端發起請求,服務器回送響應。這樣就限制了使用HTTP協議,沒法實如今客戶端沒有發起請求的時候,服務器將消息推送給客戶端。
7.HTTP默認的端口號爲80,HTTPS的端口號爲443。web
一次HTTP操做稱爲一個事務,其工做過程可分爲四步:
1.首先客戶機與服務器須要創建鏈接。只要單擊某個超級連接,HTTP的工做開始。
2.創建鏈接後,客戶機發送一個請求給服務器,請求方式的格式爲:統一資源標識符(URL)、協議版本號,後邊是MIME信息包括請求修飾符、客戶機信息和可能的內容。
3.服務器接到請求後,給予相應的響應信息,其格式爲一個狀態行,包括信息的協議版本號、一個成功或錯誤的代碼,後邊是MIME信息包括服務器信息、實體信息和可能的內容。
4.客戶端接收服務器所返回的信息經過瀏覽器顯示在用戶的顯示屏上,而後客戶機與服務器斷開鏈接。
若是在以上過程當中的某一步出現錯誤,那麼產生錯誤的信息將返回到客戶端,有顯示屏輸出。對於用戶來講,這些過程是由HTTP本身完成的,用戶只要用鼠標點擊,等待信息顯示就能夠了。
HTTP是基於傳輸層的TCP協議,而TCP是一個端到端的面向鏈接的協議。所謂的端到端能夠理解爲進程到進程之間的通訊。因此HTTP在開始傳輸以前,首先須要創建TCP鏈接,而TCP鏈接的過程須要所謂的「三次握手」。在TCP三次握手以後,創建了TCP鏈接,此時HTTP就能夠進行傳輸了。一個重要的概念是面向鏈接,既HTTP在傳輸完成之間並不斷開TCP鏈接。在HTTP1.1中(經過Connection頭設置)這是默認行爲。小程序
每一個頭域由一個域名,冒號(:)和域值三部分組成。域名是大小寫無關的,域值前能夠添加任何數量的空格符,頭域能夠被擴展爲多行,在每行開始處,使用至少一個空格或製表符。
HTTP消息由客戶端到服務器的請求和服務器到客戶端的響應組成。請求消息和響應消息都是由開始行(對於請求消息,開始行就是請求行,對於響應消息,開始行就是狀態行),消息報頭(可選),空行(只有CRLF的行),消息正文(可選)組成。
1.請求消息
HTTP請求由三部分組成,分別是:請求行、消息報頭、請求正文。發出的請求消息格式以下:
請求行,例如GET /images/logo.gif HTTP/1.1,表示從/images目錄下請求logo.gif這個文件。
請求頭,每個報頭域都是由名字+「:」+空格+值 組成,消息報頭域的名字是大小寫無關的。例如Accept-Language: en
空行
可選的消息體 請求行和標題必須以<CR><LF>做爲結尾(也就是,回車而後換行)。空行內必須只有<CR><LF>而無其餘空格。在HTTP/1.1協議中,全部的請求頭,除post外,都是可選的。
(1)請求行
以一個請求方法開頭,以空格分開,後面跟着請求的URI和協議的版本。
格式以下:Method Request-URI HTTP-Version CRLF
Method表示請求方法;
Request-URI是一個統一資源標識符;
HTTP-Version表示請求的HTTP協議版本;
CRLF表示回車和換行(除了做爲結尾的CRLF外,不容許出現單獨的CR或LF字符)。
a.請求方法:微信小程序
HTTP/1.1協議中共定義了八種方法(有時也叫「動做」)來代表Request-URI指定的資源的不一樣操做方式: GET 向特定的資源發出請求。注意:GET方法不該當被用於產生「反作用」的操做中,例如在web app.中。其中一個緣由是GET可能會被網絡蜘蛛等隨意訪問。 POST 向指定資源提交數據進行處理請求(例如提交表單或者上傳文件)。數據被包含在請求體中。POST請求可能會致使新的資源的創建和/或已有資源的修改。 HEAD 向服務器索要與GET請求相一致的響應,只不過響應體將不會被返回。這一方法能夠在沒必要傳輸整個響應內容的狀況下,就能夠獲取包含在響應消息頭中的元信息。該方法經常使用於測試超連接的有效性,是否能夠訪問,以及最近是否更新。 PUT 向指定資源位置上傳其最新內容。 DELETE 請求服務器刪除Request-URI所標識的資源。 TRACE 回顯服務器收到的請求,主要用於測試或診斷。 CONNECT HTTP/1.1協議中預留給可以將鏈接改成管道方式的代理服務器。 OPTIONS 返回服務器針對特定資源所支持的HTTP請求方法。也能夠利用向Web服務器發送'*'的請求來測試服務器的功能性。 注:HTTP服務器至少應該實現GET和HEAD方法,其餘方法都是可選的。此外,除了上述方法,特定的HTTP服務器還可以擴展自定義的方法。
b.GET和POST的區別:
GET提交的數據會放在URL以後,以?分割URL和傳輸數據,參數之間以&相連,如EditPosts.aspx?name=test1&id=123456. POST方法是把提交的數據放在HTTP包的Body中。
GET提交的數據大小有限制,最多隻能有1024字節(由於瀏覽器對URL的長度有限制),而POST方法提交的數據沒有限制。
GET方式須要使用Request.QueryString來取得變量的值,而POST方式經過Request.Form來獲取變量的值。
GET方式提交數據,會帶來安全問題,好比一個登陸頁面,經過GET方式提交數據時,用戶名和密碼將出如今URL上,若是頁面能夠被緩存或者其餘人能夠訪問這臺機器,就能夠從歷史記錄得到該用戶的帳號和密碼。
(2)請求報頭
請求報頭容許客戶端向服務器端傳遞請求的附加信息以及客戶端自身的信息。
經常使用的請求報頭:跨域
Accept:瀏覽器端能夠接受的MIME類型。例如:Accept:image/gif,代表客戶端但願接受GIF圖象格式的資源;Accept:text/html,代表客戶端但願接受html文本。 Accept-Charset:Accept-Charset請求報頭域用於指定客戶端接受的字符集。例如:Accept-Charset:iso-8859-1,gb2312.若是在請求消息中沒有設置這個域,缺省是任何字符集均可以接受。 Accept-Encoding:瀏覽器申明本身可接收的編碼方法,一般指定壓縮方法,是否支持壓縮,支持什麼壓縮方法(gzip,deflate) Accept-Language :瀏覽器申明本身接收的語言。語言跟字符集的區別:中文是語言,中文有多種字符集,好比big5,gb2312,gbk等等;例如:Accept-Language: en-us。若是請求消息中沒有設置這個報頭域,服務器假定客戶端對各類語言均可以接受。 Accept-Charset:瀏覽器可接受的字符集。若是在請求消息中沒有設置這個域,缺省表示任何字符集均可以接受。 User-Agent:告訴HTTP服務器,客戶端使用的操做系統和瀏覽器的名稱和版本。 例如:User-Agent: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; CIBA; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729; .NET4.0C; InfoPath.2; .NET4.0E) Authorization:受權信息,一般出如今對服務器發送的WWW-Authenticate頭的應答中。主要用於證實客戶端有權查看某個資源。當瀏覽器訪問一個頁面時,若是收到服務器的響應代碼爲401(未受權),能夠發送一個包含Authorization請求報頭域的請求,要求服務器對其進行驗證。 Host:(發送請求時,該頭域是必需的)主要用於指定被請求資源的Internet主機和端口號,它一般從HTTP URL中提取出來的,發送請求時,該報頭域是必需的。HTTP/1.1請求必須包含主機頭域,不然系統會以400狀態碼返回。 例如: 咱們在瀏覽器中輸入:http://luyucheng.cnblogs.com/index.html 瀏覽器發送的請求消息中,就會包含Host請求報頭域,以下: Host:luyucheng.cnblogs.com 此處使用缺省端口號80,若指定了端口號,則變成:Host:luyucheng.cnblogs.com:指定端口號 Cookie:最重要的請求頭之一, 將cookie的值發送給HTTP服務器。 Content-Length:表示請求消息正文的長度。例如:Content-Length: 38。 Content-Type:例如:Content-Type: application/x-www-form-urlencoded。 From:請求發送者的email地址,由一些特殊的Web客戶程序使用,瀏覽器不會用到它。 Range:能夠請求實體的一個或者多個子範圍。例如, 表示頭500個字節:bytes=0-499 表示第二個500字節:bytes=500-999 表示最後500個字節:bytes=-500 表示500字節之後的範圍:bytes=500- 第一個和最後一個字節:bytes=0-0,-1 同時指定幾個範圍:bytes=500-600,601-999 可是服務器能夠忽略此請求頭,若是無條件GET包含Range請求頭,響應會以狀態碼206(PartialContent)返回而不是以200(OK)。 If-Modified-Since:把瀏覽器端緩存頁面的最後修改時間發送到服務器去,服務器會把這個時間與服務器上實際文件的最後修改時間進行對比。若是時間一致,那麼返回304,客戶端就直接使用本地緩存文件。若是時間不一致,就會返回200和新的文件內容。客戶端接到以後,會丟棄舊文件,把新文件緩存起來,並顯示在瀏覽器中。 例如:If-Modified-Since: Thu, 09 Feb 2012 09:07:57 GMT If-None-Match:If-None-Match和ETag一塊兒工做,工做原理是在HTTP Response中添加ETag信息。 當用戶再次請求該資源時,將在HTTP Request 中加入If-None-Match信息(ETag的值)。若是服務器驗證資源的ETag沒有改變(該資源沒有更新),將返回一個304狀態告訴客戶端使用本地緩存文件。不然將返回200狀態和新的資源和Etag. 使用這樣的機制將提升網站的性能。例如: If-None-Match: "03f2b33c0bfcc1:0"。 Referer:包含一個URL,用戶從該URL表明的頁面出發訪問當前請求的頁面。提供了Request的上下文信息的服務器,告訴服務器我是從哪一個連接過來的,好比從我主頁上連接到一個朋友那裏,他的服務器就可以從HTTP Referer中統計出天天有多少用戶點擊我主頁上的連接訪問他的網站。 例如: Referer:http://luyucheng.cnblogs.com/ Pragma:指定「no-cache」值表示服務器必須返回一個刷新後的文檔,即便它是代理服務器並且已經有了頁面的本地拷貝;在HTTP/1.1版本中,它和Cache-Control:no-cache做用如出一轍。Pargma只有一個用法, 例如: Pragma: no-cache 注意: 在HTTP/1.0版本中,只實現了Pragema:no-cache, 沒有實現Cache-Control Connection: 例如:Connection: keep-alive 當一個網頁打開完成後,客戶端和服務器之間用於傳輸HTTP數據的TCP鏈接不會關閉,若是客戶端再次訪問這個服務器上的網頁,會繼續使用這一條已經創建的鏈接。HTTP 1.1默認進行持久鏈接。利用持久鏈接的優勢,當頁面包含多個元素時(例如Applet,圖片),顯著地減小下載所須要的時間。要實現這一點,Servlet須要在應答中發送一個Content-Length頭,最簡單的實現方法是:先把內容寫入ByteArrayOutputStream,而後在正式寫出內容以前計算它的大小。 Connection: close 表明一個Request完成後,客戶端和服務器之間用於傳輸HTTP數據的TCP鏈接會關閉,當客戶端再次發送Request,須要從新創建TCP鏈接。 Host:(發送請求時,該頭域是必需的)主要用於指定被請求資源的Internet主機和端口號,它一般從HTTP URL中提取出來的。HTTP/1.1請求必須包含主機頭域,不然系統會以400狀態碼返回。 例如: 咱們在瀏覽器中輸入:http://luyucheng.cnblogs.com/index.html,瀏覽器發送的請求消息中,就會包含Host請求頭域:Host:http://luyucheng.cnblogs.com,此處使用缺省端口號80,若指定了端口號,則變成:Host:指定端口號。 Cookie:最重要的請求頭之一, 將cookie的值發送給HTTP服務器。 Authorization:受權信息,一般出如今對服務器發送的WWW-Authenticate頭的應答中。主要用於證實客戶端有權查看某個資源。當瀏覽器訪問一個頁面時,若是收到服務器的響應代碼爲401(未受權),能夠發送一個包含Authorization請求報頭域的請求,要求服務器對其進行驗證。 UA-Pixels,UA-Color,UA-OS,UA-CPU:由某些版本的IE瀏覽器所發送的非標準的請求頭,表示屏幕大小、顏色深度、操做系統和CPU類型。 From:請求發送者的email地址,由一些特殊的Web客戶程序使用,瀏覽器不會用到它。 Range:能夠請求實體的一個或者多個子範圍。例如, 表示頭500個字節:bytes=0-499 表示第二個500字節:bytes=500-999 表示最後500個字節:bytes=-500 表示500字節之後的範圍:bytes=500- 第一個和最後一個字節:bytes=0-0,-1 同時指定幾個範圍:bytes=500-600,601-999 可是服務器能夠忽略此請求頭,若是無條件GET包含Range請求頭,響應會以狀態碼206(PartialContent)返回而不是以200(OK)。 Cache-Control:指定請求和響應遵循的緩存機制。緩存指令是單向的(響應中出現的緩存指令在請求中未必會出現),且是獨立的(在請求消息或響應消息中設置Cache-Control並不會修改另外一個消息處理過程當中的緩存處理過程)。請求時的緩存指令包括no-cache、no-store、max-age、max-stale、min-fresh、only-if-cached,響應消息中的指令包括public、private、no-cache、no-store、no-transform、must-revalidate、proxy-revalidate、max-age、s-maxage。 Cache-Control:Public 能夠被任何緩存所緩存 Cache-Control:Private 內容只緩存到私有緩存中 Cache-Control:no-cache 全部內容都不會被緩存 Cache-Control:no-store 用於防止重要的信息被無心的發佈。在請求消息中發送將使得請求和響應消息都不使用緩存。 Cache-Control:max-age 指示客戶機能夠接收生存期不大於指定時間(以秒爲單位)的響應。 Cache-Control:min-fresh 指示客戶機能夠接收響應時間小於當前時間加上指定時間的響應。 Cache-Control:max-stale 指示客戶機能夠接收超出超時期間的響應消息。若是指定max-stale消息的值,那麼客戶機能夠接收超出超時期指定值以內的響應消息。
2.響應消息
HTTP響應由三部分組成,分別是:狀態行、響應報頭、響應正文。
客戶端向服務器發送一個請求,服務器以一個狀態行做爲響應,響應的內容包括:消息協議的版本、成功或者錯誤編碼、服務器信息、實體元信息以及必要的實體內容。根據響應類別的類別,服務器響應裏能夠含實體內容,但不是全部的響應都有實體內容。
(1)狀態行
響應頭第一行也稱爲狀態行,格式以下:
HTTP-Version 空格 Status-Code 空格 Reason-Phrase CRLF
HTTP-Version表示HTTP版本,例如爲HTTP/1.1。
Status-Code是結果狀態響應碼,用三個數字表示。
Reason-Phrase是個簡單的文本描述,解釋Status-Code的具體緣由。Status-Code用於機器自動識別,Reason-Phrase用於人工理解。Status-Code的第一個數字表明響應類別,可能取5個不一樣的值。後兩個數字沒有分類做用。Status-Code的第一個數字表明響應的類別,後續兩位描述在該類響應下發生的具體情況
a.狀態響應碼:
不管你什麼時候瀏覽一個網頁,你的電腦都會經過一個使用HTTP協議的服務器來獲取所請求的數據。在你請求的網頁顯示在瀏覽器以前,支配網頁的網站服務器會返回一個包含有狀態碼的HTTP頭文件。這個狀態碼提供了有關所請求網頁的相關條件信息。若是一切正常,一個標準網頁會收到一條諸如200的狀態碼。固然咱們的目的不是去研究200響應碼,而是去探討那些表明出現錯誤信息的服務器頭文件響應碼,例如表示「未找到指定網頁」的404碼。瀏覽器
1xx(信息類):表示接收到請求而且繼續處理 100 客戶必須繼續發出請求 101 客戶要求服務器根據請求轉換HTTP協議版本 2xx(響應成功):表示動做被成功接收、理解和接受 200 代表該請求被成功地完成,所請求的資源發送回客戶端 201 提示知道新文件的URL 202 接受和處理、但處理未完成 203 返回信息不肯定或不完整 204 請求收到,但返回信息爲空 205 服務器完成了請求,用戶代理必須復位當前已經瀏覽過的文件 206 服務器已經完成了部分用戶的GET請求 3xx(重定向類):爲了完成指定的動做,必須接受進一步處理 300 請求的資源可在多處獲得 301 本網頁被永久性轉移到另外一個URL 302 請求的網頁被轉移到一個新的地址,但客戶訪問仍繼續經過原始URL地址,重定向,新的URL會在response中的Location中返回,瀏覽器將會使用新的URL發出新的Request。 303 建議客戶訪問其餘URL或訪問方式 304 自從上次請求後,請求的網頁未修改過,服務器返回此響應時,不會返回網頁內容,表明上次的文檔已經被緩存了,還能夠繼續使用 305 請求的資源必須從服務器指定的地址獲得 306 前一版本HTTP中使用的代碼,現行版本中再也不使用 307 申明請求的資源臨時性刪除 4xx(客戶端錯誤類):請求包含錯誤語法或不能正確執行 400 客戶端請求有語法錯誤,不能被服務器所理解 401 請求未經受權,這個狀態代碼必須和WWW-Authenticate報頭域一塊兒使用 HTTP 401.1 未受權:登陸失敗 HTTP 401.2 未受權:服務器配置問題致使登陸失敗 HTTP 401.3 ACL 禁止訪問資源 HTTP 401.4 未受權:受權被篩選器拒絕 HTTP 401.5 未受權:ISAPI 或 CGI 受權失敗 402 保留有效ChargeTo頭響應 403 禁止訪問,服務器收到請求,可是拒絕提供服務 HTTP 403.1 禁止訪問:禁止可執行訪問 HTTP 403.2 禁止訪問:禁止讀訪問 HTTP 403.3 禁止訪問:禁止寫訪問 HTTP 403.4 禁止訪問:要求 SSL HTTP 403.5 禁止訪問:要求 SSL 128 HTTP 403.6 禁止訪問:IP 地址被拒絕 HTTP 403.7 禁止訪問:要求客戶證書 HTTP 403.8 禁止訪問:禁止站點訪問 HTTP 403.9 禁止訪問:鏈接的用戶過多 HTTP 403.10 禁止訪問:配置無效 HTTP 403.11 禁止訪問:密碼更改 HTTP 403.12 禁止訪問:映射器拒絕訪問 HTTP 403.13 禁止訪問:客戶證書已被吊銷 HTTP 403.15 禁止訪問:客戶訪問許可過多 HTTP 403.16 禁止訪問:客戶證書不可信或者無效 HTTP 403.17 禁止訪問:客戶證書已經到期或者還沒有生效 404 一個404錯誤代表可鏈接服務器,但服務器沒法取得所請求的網頁,請求資源不存在。例如:輸入了錯誤的URL 405 用戶在Request-Line字段定義的方法不容許 406 根據用戶發送的Accept拖,請求資源不可訪問 407 相似401,用戶必須首先在代理服務器上獲得受權 408 客戶端沒有在用戶指定的餓時間內完成請求 409 對當前資源狀態,請求不能完成 410 服務器上再也不有此資源且無進一步的參考地址 411 服務器拒絕用戶定義的Content-Length屬性請求 412 一個或多個請求頭字段在當前請求中錯誤 413 請求的資源大於服務器容許的大小 414 請求的資源URL長於服務器容許的長度 415 請求資源不支持請求項目格式 416 請求中包含Range請求頭字段,在當前請求資源範圍內沒有range指示值,請求也不包含If-Range請求頭字段 417 服務器不知足請求Expect頭字段指定的指望值,若是是代理服務器,多是下一級服務器不能知足請求長。 5xx(服務端錯誤類):服務器不能正確執行一個正確的請求 500 服務器遇到錯誤,沒法完成請求 HTTP 500.11 服務器關閉 HTTP 500.12 應用程序從新啓動 HTTP 500.13 服務器太忙 HTTP 500.14 應用程序無效 HTTP 500.15 不容許請求 global.asa HTTP 500.100 內部服務器錯誤 - ASP 錯誤 501 未實現 502 網關錯誤 503 因爲超載或停機維護,服務器目前沒法使用,一段時間後可能恢復正常
(2)響應報頭
服務器須要傳遞許多附加信息,這些信息不能全放在狀態行裏。所以,須要另行定義響應報頭,用來描述這些附加信息。響應報頭主要描述服務器的信息和Request-URI的信息。
經常使用的響應報頭:緩存
Location:重定向接受者到一個新的位置。Location響應報頭域經常使用在更換域名的時候。 Server:指明HTTP服務器用來處理請求的軟件信息。例如:Server: Microsoft-IIS/7.5、Server:Apache-Coyote/1.1。此域能包含多個產品標識和註釋,產品標識通常按照重要性排序。 Refresh:表示瀏覽器應該在多少時間以後刷新文檔,以秒計。 WWW-Authenticate:WWW-Authenticate響應報頭域必須被包含在401(未受權的)響應消息中,客戶端收到401響應消息時候,併發送Authorization報頭域請求服務器對其進行驗證時,服務端響應報頭就包含該報頭域。 WWW-Authenticate:Basic realm="Basic Auth Test!" //能夠看出服務器對請求資源採用的是基本驗證機制。 Connection: 例如: Connection: keep-alive 當一個網頁打開完成後,客戶端和服務器之間用於傳輸HTTP數據的TCP鏈接不會關閉,若是客戶端再次訪問這個服務器上的網頁,會繼續使用這一條已經創建的鏈接。 Connection: close 表明一個Request完成後,客戶端和服務器之間用於傳輸HTTP數據的TCP鏈接會關閉,當客戶端再次發送Request,須要從新創建TCP鏈接。 Referer:包含一個URL,用戶從該URL表明的頁面出發訪問當前請求的頁面。提供了Request的上下文信息的服務器,告訴服務器我是從哪一個連接過來的,例如從我主頁上連接到一個朋友那裏,他的服務器就可以從HTTP Referer中統計出天天有多少用戶點擊我主頁上的連接訪問他的網站。 例如: Referer:http://luyucheng.cnblogs.com/ Content-Encoding:WEB服務器代表本身使用了什麼壓縮方法(gzip,deflate)壓縮響應中的對象。只有在解碼以後才能夠獲得Content-Type頭指定的內容類型。利用gzip壓縮文檔可以顯著地減小HTML文檔的下載時間。例如:Content-Encoding:gzip Content-Language:WEB服務器告訴瀏覽器本身響應的對象所用的天然語言。沒有設置該域則認爲實體內容將提供給全部的語言閱讀。例如:Content-Language:da。 Content-Range:用於指定整個實體中的一部分的插入位置,他也指示了整個實體的長度。在服務器向客戶返回一個部分響應,它必須描述響應覆蓋的範圍和整個實體長度。通常格式:Content-Range:bytes-unitSPfirst-byte-pos-last-byte-pos/entity-length。例如,傳送頭500個字節次字段的形式:Content-Range:bytes0-499/1234若是一個HTTP消息包含此節(例如,對範圍請求的響 應或對一系列範圍的重疊請求),Content-Range表示傳送的範圍。 Content-Type:發送給接收者的實體正文的媒體類型。媒體類型的格式爲:大類/小類,例如text/html。 例如: Content-Type: text/html;charset=utf-8 Content-Type: image/jpeg Last-Modified:資源的最後修改日期和時間。 ETag:和If-None-Match 配合使用。 Expires:響應過時的日期和時間。爲了讓代理服務器或瀏覽器在一段時間之後更新緩存中(再次訪問曾訪問過的頁面時,直接從緩存中加載,縮短響應時間和下降服務器負載)的頁面,咱們可使用Expires實體報頭域指定頁面過時的時間。例如:Expires:Thu,15 Sep 2006 16:23:12 GMT HTTP1.1的客戶端和緩存必須將其餘非法的日期格式(包括0)看做已通過期。例如:爲了讓瀏覽器不要緩存頁面,咱們也能夠利用Expires實體報頭域,設置爲0,jsp中程序以下:response.setDateHeader("Expires","0"); Allow:服務器支持哪些請求方法(如GET、POST等)。 Date:表示消息發送的時間,時間的描述格式由rfc822定義。例如,Date:Mon,31Dec200104:25:57GMT。Date描述的時間表示世界標準時,換算成本地時間,須要知道用戶所在的時區。你能夠用setDateHeader來設置這個頭以免轉換時間格式的麻煩 Expires:指明應該在何時認爲文檔已通過期,從而再也不緩存它,從新從服務器獲取,會更新緩存。過時以前使用本地緩存。HTTP1.1的客戶端和緩存會將非法的日期格式(包括0)看做已通過期。例如:爲了讓瀏覽器不要緩存頁面,咱們也能夠將Expires實體報頭域,設置爲0。 例如: Expires: Tue, 08 Feb 2022 11:35:14 GMT P3P:用於跨域設置Cookie, 這樣能夠解決iframe跨域訪問cookie的問題 例如: P3P: CP=CURa ADMa DEVa PSAo PSDo OUR BUS UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR Set-Cookie:很是重要的header, 用於把cookie發送到客戶端瀏覽器,每個寫入cookie都會生成一個Set-Cookie。 例如: Set-Cookie: sc=4c31523a; path=/; domain=.acookie.taobao.com IANA(The Internet Assigned Numbers Authority,互聯網數字分配機構)定義了8個大類的媒體類型,分別是: application (例如: application/vnd.ms-excel) audio (例如: audio/mpeg) image (例如: image/png) message (例如,:message/HTTP) model(例如:model/vrml) multipart (例如:multipart/form-data) text(例如:text/html) video(例如:video/quicktime)
Web緩存(cache)位於Web服務器和客戶端之間,緩存會根據請求保存輸出內容的副本,例如html頁面,圖片,文件,當下一個請求來到的時候:若是是相同的URL,緩存直接使用副本響應訪問請求,而不是向源服務器再次發送請求。
HTTP協議定義了相關的消息頭來使Web緩存儘量好的工做。
1.緩存的優勢
減小相應延遲:由於請求從緩存服務器(離客戶端更近)而不是源服務器被相應,這個過程耗時更少,讓Web服務器看上去相應更快。
減小網絡帶寬消耗:當副本被重用時會減低客戶端的帶寬消耗;客戶能夠節省帶寬費用,控制帶寬的需求的增加並更易於管理。
2.客戶端緩存生效的常見流程
服務器收到請求時,會在200OK中回送該資源的Last-Modified和ETag頭,客戶端將該資源保存在cache中,並記錄這兩個屬性。當客戶端須要發送相同的請求時,會在請求中攜帶If-Modified-Since和If-None-Match兩個頭。兩個頭的值分別是響應中Last-Modified和ETag頭的值。服務器經過這兩個頭判斷本地資源未發生變化,客戶端不須要從新下載,返回304響應。
3.Web緩存機制
HTTP/1.1中緩存的目的是爲了在不少狀況下減小發送請求,同時在許多狀況下能夠不須要發送完整響應。前者減小了網絡迴路的數量;HTTP利用一個「過時(expiration)」機制來爲此目的。後者減小了網絡應用的帶寬;HTTP用「驗證(validation)」機制來爲此目的。
HTTP定義了3種緩存機制:
(1)Freshness:容許一個迴應消息能夠在源服務器不被從新檢查,而且能夠由服務器和客戶端來控制。例如,Expires迴應頭給了一個文檔不可用的時間。Cache-Control中的max-age標識指明瞭緩存的最長時間;
(2)Validation:用來檢查以一個緩存的迴應是否仍然可用。例如,若是一個迴應有一個Last-Modified迴應頭,緩存可以使用If-Modified-Since來判斷是否已改變,以便判斷根據狀況發送請求;
(3)Invalidation:在另外一個請求經過緩存的時候,經常有一個反作用。例如,若是一個URL關聯到一個緩存迴應,可是其後跟着POST、PUT和DELETE的請求的話,緩存就會過時。安全
1.斷點續傳的實現原理
HTTP協議的GET方法,支持只請求某個資源的某一部分;
206 Partial Content 部份內容響應;
Range 請求的資源範圍;
Content-Range 響應的資源範圍;
在鏈接斷開重連時,客戶端只請求該資源未下載的部分,而不是從新請求整個資源,來實現斷點續傳。
分塊請求資源實例:
Eg1:Range: bytes=306302- :請求這個資源從306302個字節到末尾的部分;
Eg2:Content-Range: bytes 306302-604047/604048:響應中指示攜帶的是該資源的第306302-604047的字節,該資源共604048個字節;
客戶端經過併發的請求相同資源的不一樣片斷,來實現對某個資源的併發分塊下載。從而達到快速下載的目的。目前流行的FlashGet和迅雷基本都是這個原理。
2.多線程下載的原理
下載工具開啓多個發出HTTP請求的線程;
每一個HTTP請求只請求資源文件的一部分:Content-Range: bytes 20000-40000/47000;
合併每一個線程下載的文件。
3.HTTP代理
HTTP代理服務器:
代理服務器英文全稱是Proxy Server,其功能就是代理網絡用戶去取得網絡信息。形象的說:它是網絡信息的中轉站。
代理服務器是介於瀏覽器和Web服務器之間的一臺服務器,有了它以後,瀏覽器不是直接到Web服務器去取回網頁而是向代理服務器發出請求,Request信號會先送到代理服務器,由代理服務器來取回瀏覽器所須要的信息並傳送給你的瀏覽器。
並且,大部分代理服務器都具備緩衝的功能,就好象一個大的Cache,它有很大的存儲空間,它不斷將新取得數據儲存到它本機的存儲器上,若是瀏覽器所請求的數據在它本機的存儲器上已經存在並且是最新的,那麼它就不從新從Web服務器取數據,而直接將存儲器上的數據傳送給用戶的瀏覽器,這樣就能顯著提升瀏覽速度和效率。更重要的是:Proxy Server(代理服務器)是Internet鏈路級網關所提供的一種重要的安全功能,它的工做主要在開放系統互聯(OSI)模型的對話層。
HTTP代理服務器的主要功能:
(1)突破自身IP訪問限制,訪問國外站點。如:教育網、169網等網絡用戶能夠經過代理訪問國外網站;
(2)訪問一些單位或團體內部資源,如某大學FTP(前提是該代理地址在該資源的容許訪問範圍以內),使用教育網內地址段免費代理服務器,就能夠用於對教育 網開放的各種FTP下載上傳,以及各種資料查詢共享等服務;
(3)突破中國電信的IP封鎖:中國電信用戶有不少網站是被限制訪問的,這種限制是人爲的,不一樣Serve對地址的封鎖是不一樣的。因此不能訪問時能夠換一個國外的代理服務器試試;
(4)提升訪問速度:一般代理服務器都設置一個較大的硬盤緩衝區,當有外界的信息經過時,同時也將其保存到緩衝區中,當其餘用戶再訪問相同的信息時,則直接由緩衝區中取出信息,傳給用戶,以提升訪問速度;
(5)隱藏真實IP:上網者也能夠經過這種方法隱藏本身的IP,免受攻擊。
對於客戶端瀏覽器而言,HTTP代理服務器至關於服務器。
而對於Web服務器而言,HTTP代理服務器又擔當了客戶端的角色。
4.虛擬主機
虛擬主機:是在網絡服務器上劃分出必定的磁盤空間供用戶放置站點、應用組件等,提供必要的站點功能與數據存放、傳輸功能。
所謂虛擬主機,也叫「網站空間」就是把一臺運行在互聯網上的服務器劃分紅多個「虛擬」的服務器,每個虛擬主機都具備獨立的域名和完整的Internet服務器(支持WWW、FTP、E-mail等)功能。一臺服務器上的不一樣虛擬主機是各自獨立的,並由用戶自行管理。但一臺服務器主機只可以支持必定數量的虛擬主機,當超過這個數量時,用戶將會感到性能急劇降低。
虛擬主機的實現原理:
虛擬主機是用同一個Web服務器,爲不一樣域名網站提供服務的技術。Apache、Tomcat等都可經過配置實現這個功能。
相關的HTTP消息頭:Host。
例如:Host: luyucheng.cnblogs.com
客戶端發送HTTP請求的時候,會攜帶Host頭,Host頭記錄的是客戶端輸入的域名。這樣服務器能夠根據Host頭確認客戶要訪問的是哪個域名。服務器
查看更多:
開發一個微信小程序實例教程
PHP安全之Web攻擊
秒殺系統設計優化
MySQL優化
Linux下常見的IO模型微信
參考資料:
http://www.cnblogs.com/li0803/archive/2008/11/03/1324746.html
http://www.cnblogs.com/EricaMIN1987_IT/p/3837436.html