Http協(xié)議分析

Http協(xié)議分析

HTTP是一個屬于應用層的面向對象的協(xié)議,由于其簡捷、快速的方式,適用于分布式超媒體信息系統(tǒng)。它于1990年提出,經過幾年的使用與發(fā)展,得到不斷地完善和擴展。目前在WWW中使用的是HTTP/1.0的第六版,HTTP/1.1的規(guī)范化工作正在進行之中,而且HTTP-NG(Next Generation of HTTP)的建議已經提出。
HTTP協(xié)議的主要特點可概括如下:

  1. 支持客戶/服務器模式。
  2. 簡單快速:客戶向服務器請求服務時,只需傳送請求方法和路徑。請求方法常用的有GET、HEAD、POST。每種方法規(guī)定了客戶與服務器聯(lián)系的類型不同。由于HTTP協(xié)議簡單,使得HTTP服務器的程序規(guī)模小,因而通信速度很快。
  3. 靈活:HTTP允許傳輸任意類型的數(shù)據(jù)對象。正在傳輸?shù)念愋陀蒀ontent-Type加以標記。
  4. 無連接:無連接的含義是限制每次連接只處理一個請求。服務器處理完客戶的請求,并收到客戶的應答后,即斷開連接。采用這種方式可以節(jié)省傳輸時間。
  5. 無狀態(tài):HTTP協(xié)議是無狀態(tài)協(xié)議。無狀態(tài)是指協(xié)議對于事務處理沒有記憶能力。缺少狀態(tài)意味著如果后續(xù)處理需要前面的信息,則它必須重傳,這樣可能導致每次連接傳送的數(shù)據(jù)量增大。另一方面,在服務器不需要先前信息時它的應答就較快。

HTTP協(xié)議(URL)

http(超文本傳輸協(xié)議)是一個基于請求與響應模式的、無狀態(tài)的、應用層的協(xié)議,?;赥CP的連接方式,HTTP1.1版本中給出一種持續(xù)連接的機制,絕大多數(shù)的Web開發(fā),都是構建在HTTP協(xié)議之上的Web應用。
HTTP URL (URL是一種特殊類型的URI,包含了用于查找某個資源的足夠的信息)的格式如下: http://host[":"port][abs_path]
http表示要通過HTTP協(xié)議來定位網絡資源;host表示合法的Internet主機域名或者IP地址;port指定一個端口號,為空則使用缺省端口80;abs_path指定請求資源的URI;如果URL中沒有給出abs_path,那么當它作為請求URI時,必須以“/”的形式給出,通常這個工作瀏覽器自動幫我們完成。

HTTP協(xié)議的請求

http請求由三部分組成,分別是:請求行、消息報頭、請求正文
1、請求行以一個方法符號開頭,以空格分開,后面跟著請求的URI和協(xié)議的版本,格式如下:Method Request-URI HTTP-Version CRLF
其中 Method表示請求方法;Request-URI是一個統(tǒng)一資源標識符;HTTP-Version表示請求的HTTP協(xié)議版本;CRLF表示回車和換行(除了作為結尾的CRLF外,不允許出現(xiàn)單獨的CR或LF字符)。
請求方法(所有方法全為大寫)有多種,各個方法的解釋如下:

GET     請求獲取Request-URI所標識的資源 
POST    在Request-URI所標識的資源后附加新的數(shù)據(jù) 
HEAD    請求獲取由Request-URI所標識的資源的響應消息報頭 
PUT     請求服務器存儲一個資源,并用Request-URI作為其標識 
DELETE  請求服務器刪除Request-URI所標識的資源 
TRACE   請求服務器回送收到的請求信息,主要用于測試或診斷 
CONNECT 保留將來使用 
OPTIONS 請求查詢服務器的性能,或者查詢與資源相關的選項和需求 

應用舉例:

GET方法:在瀏覽器的地址欄中輸入網址的方式訪問網頁時,瀏覽器采用GET方法向服務器獲取資源,eg:GET /form.html HTTP/1.1 (CRLF) 
POST方法要求被請求服務器接受附在請求后面的數(shù)據(jù),常用于提交表單。
eg:POST /reg.jsp HTTP/ (CRLF) 
Accept:image/gif,image/x-xbit,... (CRLF) 
... 
HOST:www.guet.edu.cn (CRLF) 
Content-Length:22 (CRLF) 
Connection:Keep-Alive (CRLF) 
Cache-Control:no-cache (CRLF) 
(CRLF)         //該CRLF表示消息報頭已經結束,在此之前為消息報頭 
user=jeffrey&pwd=1234  //此行以下為提交的數(shù)據(jù) 

HEAD方法與GET方法幾乎是一樣的,對于HEAD請求的回應部分來說,它的HTTP頭部中包含的信息與通過GET請求所得到的信息是相同的。利用這個方法,不必傳輸整個資源內容,就可以得到Request-URI所標識的資源的信息。該方法常用于測試超鏈接的有效性,是否可以訪問,以及最近是否更新。

HTTP協(xié)議的響應

在接收和解釋請求消息后,服務器返回一個HTTP響應消息。
HTTP響應也是由三個部分組成,分別是:狀態(tài)行、消息報頭、響應正文
1、狀態(tài)行格式如下:

HTTP-Version Status-Code Reason-Phrase CRLF 

其中,HTTP-Version表示服務器HTTP協(xié)議的版本;Status-Code表示服務器發(fā)回的響應狀態(tài)代碼;Reason-Phrase表示狀態(tài)代碼的文本描述。
狀態(tài)代碼有三位數(shù)字組成,第一個數(shù)字定義了響應的類別,且有五種可能取值:

1xx:指示信息--表示請求已接收,繼續(xù)處理 
2xx:成功--表示請求已被成功接收、理解、接受 
3xx:重定向--要完成請求必須進行更進一步的操作 
4xx:客戶端錯誤--請求有語法錯誤或請求無法實現(xiàn) 
5xx:服務器端錯誤--服務器未能實現(xiàn)合法的請求 
常見狀態(tài)代碼、狀態(tài)描述、說明: 
200 OK      //客戶端請求成功 
400 Bad Request  //客戶端請求有語法錯誤,不能被服務器所理解 
401 Unauthorized //請求未經授權,這個狀態(tài)代碼必須和WWW-Authenticate報頭域一起使用 
403 Forbidden  //服務器收到請求,但是拒絕提供服務 
404 Not Found  //請求資源不存在,eg:輸入了錯誤的URL 
500 Internal Server Error //服務器發(fā)生不可預期的錯誤 
503 Server Unavailable  //服務器當前不能處理客戶端的請求,一段時間后可能恢復正常 
eg:HTTP/1.1 200 OK (CRLF) 

2、響應報頭
Location:Location響應報頭域用于重定向接受者到一個新的位置。例如:客戶端所請求的頁面已不存在原先的位置,為了讓客戶端重定向到這個頁面新的位置,服務器端可以發(fā)回Location響應報頭后使用重定向語句,讓客戶端去訪問新的域名所對應的服務器上的資源;
  Server:Server 響應報頭域包含了服務器用來處理請求的軟件信息及其版本。它和 User-Agent 請求報頭域是相對應的,前者發(fā)送服務器端軟件的信息,后者發(fā)送客戶端軟件(瀏覽器)和操作系統(tǒng)的信息。
  Vary:指示不可緩存的請求頭列表;
  Connection:連接方式;
  對于請求來說:close(告訴 WEB 服務器或者代理服務器,在完成本次請求的響應后,斷開連接,不等待本次連接的后續(xù)請求了)。keepalive(告訴WEB服務器或者代理服務器,在完成本次請求的響應后,保持連接,等待本次連接的后續(xù)請求);
  對于響應來說:close(連接已經關閉); keepalive(連接保持著,在等待本次連接的后續(xù)請求); Keep-Alive:如果瀏覽器請求保持連接,則該頭部表明希望WEB 服務器保持連接多長時間(秒);例如:Keep-Alive:300;
  WWW-Authenticate:WWW-Authenticate響應報頭域必須被包含在401 (未授權的)響應消息中,這個報頭域和前面講到的Authorization 請求報頭域是相關的,當客戶端收到 401 響應消息,就要決定是否請求服務器對其進行驗證。如果要求服務器對其進行驗證,就可以發(fā)送一個包含了Authorization 報頭域的請求;
  空行:最后一個響應頭部之后是一個空行,發(fā)送回車符和換行符,通知服務器以下不再有響應頭部。
3、響應正文就是服務器返回的資源的內容

4.4 HTTP協(xié)議的消息報頭
HTTP消息由客戶端到服務器的請求和服務器到客戶端的響應組成。請求消息和響應消息都是由開始行(對于請求消息,開始行就是請求行,對于響應消息,開始行就是狀態(tài)行),消息報頭(可選),空行(只有CRLF的行),消息正文(可選)組成。
HTTP消息報頭包括普通報頭、請求報頭、響應報頭、實體報頭。
每一個報頭域都是由名字+“:”+空格+值 組成,消息報頭域的名字是大小寫無關的。
1、普通報頭
在普通報頭中,有少數(shù)報頭域用于所有的請求和響應消息,但并不用于被傳輸?shù)膶嶓w,只用于傳輸?shù)南ⅰ?br> 2、請求報頭
請求報頭允許客戶端向服務器端傳遞請求的附加信息以及客戶端自身的信息。
請求報頭舉例:

GET /form.html HTTP/1.1 (CRLF) 
Accept:image/gif,image/x-xbitmap,image/jpeg,application/x-shockwave-flash,application/vnd.ms-excel,application/vnd.ms-powerpoint,application/msword,*/* (CRLF) 
Accept-Language:zh-cn (CRLF) 
Accept-Encoding:gzip,deflate (CRLF) 
If-Modified-Since:Wed,05 Jan 2007 11:21:25 GMT (CRLF) 
If-None-Match:W/"80b1a4c018f3c41:8317" (CRLF) 
User-Agent:Mozilla/4.0(compatible;MSIE6.0;Windows NT 5.0) (CRLF) 
Host:www.guet.edu.cn (CRLF) 
Connection:Keep-Alive (CRLF) 
(CRLF) 

3、響應報頭
響應報頭允許服務器傳遞不能放在狀態(tài)行中的附加響應信息,以及關于服務器的信息和對Request-URI所標識的資源進行下一步訪問的信息。
4、實體報頭
請求和響應消息都可以傳送一個實體。一個實體由實體報頭域和實體正文組成,但并不是說實體報頭域和實體正文要在一起發(fā)送,可以只發(fā)送實體報頭域。實體報頭定義了關于實體正文(eg:有無實體正文)和請求所標識的資源的元信息。

Servlet程序

Java Servlet介紹

Java Servlet 是運行在 Web 服務器或應用服務器上的程序,它是作為來自 Web 瀏覽器或其他 HTTP 客戶端的請求和 HTTP 服務器上的數(shù)據(jù)庫或應用程序之間的中間層。

使用 Servlet,您可以收集來自網頁表單的用戶輸入,呈現(xiàn)來自數(shù)據(jù)庫或者其他源的記錄,還可以動態(tài)創(chuàng)建網頁。
Java Servlet 通常情況下與使用 CGI(Common Gateway Interface,公共網關接口)實現(xiàn)的程序可以達到異曲同工的效果。但是相比于 CGI,Servlet 有以下幾點優(yōu)勢:
性能明顯更好。

Servlet 在 Web 服務器的地址空間內執(zhí)行。這樣它就沒有必要再創(chuàng)建一個單獨的進程來處理每個客戶端請求。
Servlet 是獨立于平臺的,因為它們是用 Java 編寫的。
服務器上的 Java 安全管理器執(zhí)行了一系列限制,以保護服務器計算機上的資源。因此,Servlet 是可信的。
Java 類庫的全部功能對 Servlet 來說都是可用的。它可以通過 sockets 和 RMI 機制與 applets、數(shù)據(jù)庫或其他軟件進行交互。
Java Servlet 是運行在帶有支持 Java Servlet 規(guī)范的解釋器的 web 服務器上的 Java 類。

Servlet 可以使用 javax.servlet 和 javax.servlet.http 包創(chuàng)建,它是 Java 企業(yè)版的標準組成部分,Java 企業(yè)版是支持大型開發(fā)項目的 Java 類庫的擴展版本。
這些類實現(xiàn) Java Servlet 和 JSP 規(guī)范。在寫本教程的時候,二者相應的版本分別是 Java Servlet 2.5 和 JSP 2.1。
Java Servlet 就像任何其他的 Java 類一樣已經被創(chuàng)建和編譯。在您安裝 Servlet 包并把它們添加到您的計算機上的 Classpath 類路徑中之后,您就可以通過 JDK 的 Java 編譯器或任何其他編譯器來編譯 Servlet。

Servlet 架構

下圖顯示了 Servlet 在 Web 應用程序中的位置。


image.png

Servlet 任務

Servlet 執(zhí)行以下主要任務:
讀取客戶端(瀏覽器)發(fā)送的顯式的數(shù)據(jù)。這包括網頁上的 HTML 表單,或者也可以是來自 applet 或自定義的 HTTP 客戶端程序的表單。
讀取客戶端(瀏覽器)發(fā)送的隱式的 HTTP 請求數(shù)據(jù)。這包括 cookies、媒體類型和瀏覽器能理解的壓縮格式等等。
處理數(shù)據(jù)并生成結果。這個過程可能需要訪問數(shù)據(jù)庫,執(zhí)行 RMI 或 CORBA 調用,調用 Web 服務,或者直接計算得出對應的響應。
發(fā)送顯式的數(shù)據(jù)(即文檔)到客戶端(瀏覽器)。該文檔的格式可以是多種多樣的,包括文本文件(HTML 或 XML)、二進制文件(GIF 圖像)、Excel 等。
發(fā)送隱式的 HTTP 響應到客戶端(瀏覽器)。這包括告訴瀏覽器或其他客戶端被返回的文檔類型(例如 HTML),設置 cookies 和緩存參數(shù),以及其他類似的任務。

Servlet 生命周期

Servlet 生命周期可被定義為從創(chuàng)建直到毀滅的整個過程。以下是 Servlet 遵循的過程:

Servlet 通過調用 init () 方法進行初始化。
Servlet 調用 service() 方法來處理客戶端的請求。
Servlet 通過調用 destroy() 方法終止(結束)。
最后,Servlet 是由 JVM 的垃圾回收器進行垃圾回收的。

現(xiàn)在讓我們詳細討論生命周期的方法。
init() 方法
init 方法被設計成只調用一次。它在第一次創(chuàng)建 Servlet 時被調用,在后續(xù)每次用戶請求時不再調用。因此,它是用于一次性初始化,就像 Applet 的 init 方法一樣。
Servlet 創(chuàng)建于用戶第一次調用對應于該 Servlet 的 URL 時,但是您也可以指定 Servlet 在服務器第一次啟動時被加載。
當用戶調用一個 Servlet 時,就會創(chuàng)建一個 Servlet 實例,每一個用戶請求都會產生一個新的線程,適當?shù)臅r候移交給 doGet 或 doPost 方法。init() 方法簡單地創(chuàng)建或加載一些數(shù)據(jù),這些數(shù)據(jù)將被用于 Servlet 的整個生命周期。
init 方法的定義如下:

public void init() throws ServletException {
  // 初始化代碼...}

service() 方法
service() 方法是執(zhí)行實際任務的主要方法。Servlet 容器(即 Web 服務器)調用 service() 方法來處理來自客戶端(瀏覽器)的請求,并把格式化的響應寫回給客戶端。
每次服務器接收到一個 Servlet 請求時,服務器會產生一個新的線程并調用服務。service() 方法檢查 HTTP 請求類型(GET、POST、PUT、DELETE 等),并在適當?shù)臅r候調用 doGet、doPost、doPut,doDelete 等方法。
下面是該方法的特征:

public void service(ServletRequest request, 
                    ServletResponse response) 
      throws ServletException, IOException{}

service() 方法由容器調用,service 方法在適當?shù)臅r候調用 doGet、doPost、doPut、doDelete 等方法。所以,您不用對 service() 方法做任何動作,您只需要根據(jù)來自客戶端的請求類型來重載 doGet() 或 doPost() 即可。
doGet() 和 doPost() 方法是每次服務請求中最常用的方法。下面是這兩種方法的特征。
doGet() 方法
GET 請求來自于一個 URL 的正常請求,或者來自于一個未指定 METHOD 的 HTML 表單,它由 doGet() 方法處理。

public void doGet(HttpServletRequest request,
                  HttpServletResponse response)
    throws ServletException, IOException {
    // Servlet 代碼}

doPost() 方法
POST 請求來自于一個特別指定了 METHOD 為 POST 的 HTML 表單,它由 doPost() 方法處理。

public void doPost(HttpServletRequest request,
                   HttpServletResponse response)
    throws ServletException, IOException {
    // Servlet 代碼}

destroy() 方法
destroy() 方法只會被調用一次,在 Servlet 生命周期結束時被調用。destroy() 方法可以讓您的 Servlet 關閉數(shù)據(jù)庫連接、停止后臺線程、把 Cookie 列表或點擊計數(shù)器寫入到磁盤,并執(zhí)行其他類似的清理活動。
在調用 destroy() 方法之后,servlet 對象被標記為垃圾回收。destroy 方法定義如下所示:

  public void destroy() {
    // 終止化代碼...
  }

下圖顯示了一個典型的 Servlet 生命周期方案。
第一個到達服務器的 HTTP 請求被委派到 Servlet 容器。
Servlet 容器在調用 service() 方法之前加載 Servlet。
然后 Servlet 容器處理由多個線程產生的多個請求,每個線程執(zhí)行一個單一的 Servlet 實例的 service() 方法。


image.png
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • Spring Cloud為開發(fā)人員提供了快速構建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 134,881評論 18 139
  • 一、概念(載錄于:http://www.cnblogs.com/EricaMIN1987_IT/p/3837436...
    yuantao123434閱讀 8,420評論 6 152
  • Http協(xié)議詳解 標簽(空格分隔): Linux 聲明:本片文章非原創(chuàng),內容來源于博客園作者MIN飛翔的HTTP協(xié)...
    Sivin閱讀 5,252評論 3 82
  • 本文整理自MIN飛翔博客 [1] 1. 概念 協(xié)議是指計算機通信網絡中兩臺計算機之間進行通信所必須共同遵守的規(guī)定或...
    HoyaWhite閱讀 2,704評論 2 20
  • 作為志愿者,我被安排做自閉癥小朋友行為觀察記錄的工作。我見到了然然。然然是一個很可愛很漂亮的小女生,上天卻選擇讓她...
    小鯨魚Lee閱讀 274評論 0 0