HTTP深入淺出

HTTP(HyperText Transfer Protocol)是一套計算機通過網絡進行通信的規則。

計算機專家設計出HTTP,使HTTP客戶(如Web瀏覽器)能夠從HTTP服務器(Web服務器)請求信息和服務,HTTP目前協議的版本是1.1.HTTP是一種無狀態的協議,無狀態是指Web瀏覽器和Web服務器之間不需要建立持久的連接,這意味着當一個客戶端向服務器端發出請求,然後Web服務器返回響應(response),連接就被關閉了,在服務器端不保留連接的有關信息.HTTP遵循請求(Request)/應答(Response)模型。Web瀏覽器向Web服務器發送請求,Web服務器處理請求並返回適當的應答。所有HTTP連接都被構造成一套請求和應答。

HTTP使用內容類型,是指Web服務器向Web瀏覽器返回的文件都有與之相關的類型。所有這些類型在MIME Internet郵件協議上模型化,即Web服務器告訴Web瀏覽器該文件所具有的種類,是HTML文檔、GIF格式圖像、聲音文件還是獨立的應用程序。大多數Web瀏覽器都擁有一系列的可配置的輔助應用程序,它們告訴瀏覽器應該如何處理Web服務器發送過來的各種內容類型。

HTTP通信機制是在一次完整的HTTP通信過程中,

Web瀏覽器與Web服務器之間將完成下列7個步驟:

(1)    建立TCP連接
在HTTP工作開始之前,Web瀏覽器首先要通過網絡與Web服務器建立連接,該連接是通過TCP來完成的,該協議與IP協議共同構建Internet,即著名的TCP/IP協議族,因此Internet又被稱作是TCP/IP網絡。HTTP是比TCP更高層次的應用層協議,根據規則,只有低層協議建立之後才能,才能進行更層協議的連接,因此,首先要建立TCP連接,一般TCP連接的端口號是80
(2)    Web瀏覽器向Web服務器發送請求命令
一旦建立了TCP連接,Web瀏覽器就會向Web服務器發送請求命令
例如:GET/sample/hello.jsp HTTP/1.1
(3)    Web瀏覽器發送請求頭信息
瀏覽器發送其請求命令之後,還要以頭信息的形式向Web服務器發送一些別的信息,之後瀏覽器發送了一空白行來通知服務器,它已經結束了該頭信息的發送。
(4)    Web服務器應答
客戶機向服務器發出請求後,服務器會客戶機回送應答,
HTTP/1.1 200 OK
應答的第一部分是協議的版本號和應答狀態碼
(5)    Web服務器發送應答頭信息
正如客戶端會隨同請求發送關於自身的信息一樣,服務器也會隨同應答向用戶發送關於它自己的數據及被請求的文檔。
(6)    Web服務器向瀏覽器發送數據
Web服務器向瀏覽器發送頭信息後,它會發送一個空白行來表示頭信息的發送到此爲結束,接着,它就以Content-Type應答頭信息所描述的格式發送用戶所請求的實際數據
(7)    Web服務器關閉TCP連接
一般情況下,一旦Web服務器向瀏覽器發送了請求數據,它就要關閉TCP連接,然後如果瀏覽器或者服務器在其頭信息加入了這行代碼
Connection:keep-alive
TCP連接在發送後將仍然保持打開狀態,於是,瀏覽器可以繼續通過相同的連接發送請求。保持連接節省了爲每個請求建立新連接所需的時間,還節約了網絡帶寬。
    
HTTP請求格式
當瀏覽器向Web服務器發出請求時,它向服務器傳遞了一個數據塊,也就是請求信息,HTTP請求信息由3部分組成:
l   請求方法URI協議/版本
l   請求頭(Request Header)
l   請求正文
下面是一個HTTP請求的例子:
[plain] view plain copy
 在CODE上查看代碼片派生到我的代碼片
  1. GET/sample.jspHTTP/1.1  
  2. Accept:image/gif.image/jpeg,*/*  
  3. Accept-Language:zh-cn  
  4. Connection:Keep-Alive  
  5. Host:localhost  
  6. User-Agent:Mozila/4.0(compatible;MSIE5.01;Window NT5.0)  
  7. Accept-Encoding:gzip,deflate  

username=jinqiao&password=1234
 
(1)       請求方法URI協議/版本
請求的第一行是“方法URL議/版本”:GET/sample.jsp HTTP/1.1
以上代碼中“GET”代表請求方法,“/sample.jsp”表示URI,“HTTP/1.1代表協議和協議的版本。
根據HTTP標準,HTTP請求可以使用多種請求方法。例如:HTTP1.1支持7種請求方法:GET、POST、HEAD、OPTIONS、PUT、DELETE和TARCE。在Internet應用中,最常用的方法是GET和POST。
URL完整地指定了要訪問的網絡資源,通常只要給出相對於服務器的根目錄的相對目錄即可,因此總是以“/”開頭,最後,協議版本聲明瞭通信過程中使用HTTP的版本。
(2) 請求頭(Request Header)
請求頭包含許多有關的客戶端環境和請求正文的有用信息。例如,請求頭可以聲明瀏覽器所用的語言,請求正文的長度等。
[plain] view plain copy
 在CODE上查看代碼片派生到我的代碼片
  1. Accept:image/gif.image/jpeg.*/*  
  2. Accept-Language:zh-cn  
  3. Connection:Keep-Alive  
  4. Host:localhost  
  5. User-Agent:Mozila/4.0(compatible:MSIE5.01:Windows NT5.0)  
  6. Accept-Encoding:gzip,deflate.  

(3) 請求正文
請求頭和請求正文之間是一個空行,這個行非常重要,它表示請求頭已經結束,接下來的是請求正文。請求正文中可以包含客戶提交的查詢字符串信息:
username=jinqiao&password=1234
在以上的例子的HTTP請求中,請求的正文只有一行內容。當然,在實際應用中,HTTP請求正文可以包含更多的內容。
HTTP請求方法我這裏只討論GET方法與POST方法
l         GET方法
GET方法是默認的HTTP請求方法,我們日常用GET方法來提交表單數據,然而用GET方法提交的表單數據只經過了簡單的編碼,同時它將作爲URL的一部分向Web服務器發送,因此,如果使用GET方法來提交表單數據就存在着安全隱患上。例如
Http://127.0.0.1/login.jsp?Name=zhangshi&Age=30&Submit=%cc%E+%BD%BB
從上面的URL請求中,很容易就可以辯認出表單提交的內容。(?之後的內容)另外由於GET方法提交的數據是作爲URL請求的一部分所以提交的數據量不能太大
l         POST方法
POST方法是GET方法的一個替代方法,它主要是向Web服務器提交表單數據,尤其是大批量的數據。POST方法克服了GET方法的一些缺點。通過POST方法提交表單數據時,數據不是作爲URL請求的一部分而是作爲標準數據傳送給Web服務器,這就克服了GET方法中的信息無法保密和數據量太小的缺點。因此,出於安全的考慮以及對用戶隱私的尊重,通常表單提交時採用POST方法。
  從編程的角度來講,如果用戶通過GET方法提交數據,則數據存放在QUERY_STRING環境變量中,而POST方法提交的數據則可以從標準輸入流中獲取。
HTTP應答與HTTP請求相似,HTTP響應也由3個部分構成,分別是:
l 協議狀態版本代碼描述
l 響應頭(Response Header)
l 響應正文
下面是一個HTTP響應的例子:
[plain] view plain copy
 在CODE上查看代碼片派生到我的代碼片
  1. HTTP/1.1 200 OK  
  2. Server:Apache Tomcat/5.0.12  
  3. Date:Mon,6Oct2003 13:23:42 GMT  
  4. Content-Length:112  


[html] view plain copy
 在CODE上查看代碼片派生到我的代碼片
  1. <html>  
  2. <head>  
  3. <title>HTTP響應示例<title>  
  4. </head>  
  5. <body>  
  6. Hello HTTP!  
  7. </body>  
  8. </html>  


協議狀態代碼描述HTTP響應的第一行類似於HTTP請求的第一行,它表示通信所用的協議是HTTP1.1服務器已經成功的處理了客戶端發出的請求(200表示成功):
HTTP/1.1 200 OK
響應頭(Response Header)響應頭也和請求頭一樣包含許多有用的信息,例如服務器類型、日期時間、內容類型和長度等:
 
[plain] view plain copy
 在CODE上查看代碼片派生到我的代碼片
  1.   Server:Apache Tomcat/5.0.12  
  2. Date:Mon,6Oct2003 13:13:33 GMT  
  3. Content-Type:text/html  
  4. Last-Moified:Mon,6 Oct 2003 13:23:42 GMT  
  5. Content-Length:112  

 響應正文響應正文就是服務器返回的HTML頁面:
[html] view plain copy
 在CODE上查看代碼片派生到我的代碼片
  1.   <html>  
  2. <head>  
  3. <title>HTTP響應示例<title>  
  4. </head>  
  5. <body>  
  6. Hello HTTP!  
  7. </body>  
  8. </html>  


響應頭和正文之間也必須用空行分隔。  
l   HTTP應答碼
HTTP應答碼也稱爲狀態碼,它反映了Web服務器處理HTTP請求狀態。HTTP應答碼由3位數字構成,其中首位數字定義了應答碼的類型:
  1XX-信息類(Information),表示收到Web瀏覽器請求,正在進一步的處理中
  2XX-成功類(Successful),表示用戶請求被正確接收,理解和處理例如:200 OK
      3XX-重定向類(Redirection),表示請求沒有成功,客戶必須採取進一步的動作。
      4XX-客戶端錯誤(Client Error),表示客戶端提交的請求有錯誤 例如:404 NOT Found,意味着請求中所引用的文檔不存在。
      5XX-服務器錯誤(Server Error)表示服務器不能完成對請求的處理:如 500
      對於我們Web開發人員來說掌握HTTP應答碼有助於提高Web應用程序調試的效率和準確性。
 
安全連接
Web應用最常見的用途之一是電子商務,可以利用Web服務器端程序使人們能夠網絡購物,需要指出一點是,缺省情況下,通過Internet發送信息是不安全的,如果某人碰巧截獲了你發給朋友的一則消息,他就能打開它,假想在裏面有你的信用卡號碼,這會有多麼糟糕,幸運的是,很多Web服務器以及Web瀏覽器都有創立安全連接的能力,這樣它們就可以安全的通信了。
通過Internet提供安全連接最常見的標準是安全套接層(Secure Sockets layer,SSl)協議。SSL協議是一個應用層協議(和HTTP一樣),用於安全方式在Web上交換數據,SSL使用公開密鑰編碼系統。從本質講,這意味着業務中每一方都擁有一個公開的和一個私有的密鑰。當一方使用另一方公開密鑰進行編碼時,只有擁有匹配密鑰的人才能對其解碼。簡單來講,公開密鑰編碼提供了一種用於在兩方之間交換數據的安全方法,SSL連接建立之後,客戶和服務器都交換公開密鑰,並在進行業務聯繫之前進行驗證,一旦雙方的密鑰都通過驗證,就可以安全地交換數據。
GET
通過請求URI得到資源
POST,
用於添加新的內容
PUT
用於修改某個內容
DELETE,
刪除某個內容
CONNECT,
用於代理進行傳輸,如使用SSL
OPTIONS
詢問可以執行哪些方法
PATCH,
部分文檔更改
PROPFIND, (wedav)
查看屬性
PROPPATCH, (wedav)
設置屬性
MKCOL, (wedav)
創建集合(文件夾)
COPY, (wedav)
拷貝
MOVE, (wedav)
移動
LOCK, (wedav)
加鎖
UNLOCK (wedav)
解鎖
TRACE
用於遠程診斷服務器
HEAD
類似於GET, 但是不返回body信息,用於檢查對象是否存在,以及得到對象的元數據
apache2中,可使用Limit,LimitExcept進行訪問控制的方法包括:GETPOSTPUTDELETECONNECT,OPTIONSPATCHPROPFINDPROPPATCHMKCOLCOPYMOVELOCK, 和 UNLOCK.
其中, HEAD GET POST OPTIONS PROPFIND是和讀取相關的方法,MKCOL PUT DELETE LOCK UNLOCK COPY MOVE PROPPATCH是和修改相關的方法
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章