Web應用與HTTP協議


  網絡應用隨處可見。任何時候瀏覽web,發送E-mail或者彈出一個X window,就是在使用一個網絡應用。


客戶端-服務器編程模型

  每個網絡應用都是基於客戶端-服務器模型的。采用這個模型,一個服務器進程和一個或者多個客戶端進程組成。服務器管理某種資源,並且通過操作這種來為它的客戶端提供某種服務。

  認識到客戶端和服務器是進程,而不是常常提到的機器或者主機,這是很重要的。一台主機可以同時運行許多不同的客戶端和服務器,而且一個客戶端和服務器的事務可以再同一台(X Window)或者不同的主機上運行。無論客戶端和服務器是怎樣映射到主機上的,客戶端-服務器模型是相同的。

  客戶端和服務器通過因特網這個全球網絡來通信。從一個程序員的觀點來看,我們可以把因特網看成一個全球范圍內的主機集合,具有如下幾個屬性:1)每個因特網主機都有一個唯一的32位名字,稱它為的IP地址。2)IP地址的集合被映射為一個因特網域名的集合。3)不同因特網主機上的進程能夠通過連接互相通信。

  客戶端和服務器通過使用套接字接口建立連接。一個套接字是連接的一個端點。每個套接字都有相應的套接字地址,是由一個因特網地址和一個16位的證書端口組成的,用“地址:端口”來表示。當客戶端發起一個連接請求時,客戶端套接字地址中的端口是由內核自動分配的,稱為臨時端口。然而,服務器套接字地址中的端口通常是某個知名的端口,是和這個服務相對應的。例如,Web服務器通常使用端口80,而電子郵件服務器(SMTP)使用端口25.

 

HTTP概況

  Web客戶端和服務器之間的交互用的是一個基於文本的應用級協議,叫做HTTP(Hypertext Transfer Protocol,超文本傳輸協議)。HTTP協議由兩部分程序實現:一個客戶端程序和一個服務器程序,它們運行在不同的端系統當中,通過交換HTTP報文進行會話。HTTP定義了這些報文的格式以及客戶端和服務器是如何進行報文交換的。Web服務和常規的文件檢索服務(例如FTP)有什么區別?主要的區別是Web內容可以用一種叫做HTML(Hypertext Markup Language,超文本標記語言)的語言來編寫。一個HTML程序(頁)包含(標記),它們告訴瀏覽器如何顯示這頁中的各種文本和圖形對象。

  Web頁面(Web page,也叫文檔)是由對象組成,對象簡單來說就是文件,如HTML頁面、JPEG圖形文件、Java小程序或視頻片段文件,這些文件可以通過一個URL地址尋址。多數Web頁面含有一個基本HTML文件(base HTML file)以及幾個引用對象。在基本HTML文件中通過對象的URL地址對對象進行引用。每個URL地址由兩部分組成:存放對象的服務器主機名和對象的路徑名。Web瀏覽器實現了HTTP的客戶端。Web服務器用於存儲Web對象,每個對象由URL尋址。Web實現了HTTP的服務器端,流行的Web服務器有Apache和Mircosoft Internet Information Sever。

  HTTP使用TCP(而不是UDP)作為它的支撐運輸層協議,默認的端口號是80.

 

HTTP事務

  

                                                                             一個服務靜態內容的HTTP事務

  因為HTTP是基於在因特網連接上傳送的文本行,我們可以使用Unix的TELNET程序和因特網上的任何Web服務器執行事務。對於調試在連接上通過文本行來與客戶端對話的服務器來說,TELNET十分便利。例如,上圖是使用TELNET向AOL Web服務器請求主頁。

  在第一行,我們從Unix外殼運行TELNET,要求它打開一個到AOL Web服務器的連接。TELNET向終端服務器打印三行輸出,打開連接,然后等待我們輸入文本行(第五行)。我們每次輸入一個文本行,並鍵入回車鍵,TELNET會讀取該行,在后面加上回車和換行符號,並將這一行發送到服務器。

 

HTTP報文

  http報文包括以下三部分:

  1. 起始行(請求行)

   報文的第一樣就是起始行,在請求報文中用來說明要做些什么,在響應報文中說明出現了什么情況。

  2. 首部字段 

    起始行后面有零個或多個首部字。每個首部字段都包含一個名字和一個值,為了便於解析,兩個之間用冒號(:)來分隔。首部行以一個空行結束。添加一個首部字段和添加新行一樣簡單。

  3. 主體

    空行之后就是可選的報文主體了,其中包含了所有類型的數據。請求主體中包括了要發送給Web服務器的數據,響應主體中裝載了要返回給客戶端的數據。起始行和首部都是文本形式且都是結構化的,而主體則不同,主體中可以包含任意的二進制數據(比如圖片、視頻、音軌、軟件程序)。當然,主體中也可以包含文本。

 

HTTP請求

  一個HTTP請求的組成是這樣的:一個請求行(request line)(第5行),后面跟零個或更多個請求報頭(request header)(第六行),再跟隨一個空的文本行來終止報頭列表(第7行)。請求行有3個字段:方法字段,URI字段和HTTP協議版本字段,即有如下的形式是:

    <method><uri><version>

  HTTP支持許多不同的方法,方法字段可以取值GET、POST、HEAD、PUT和DELETE絕大部分的HTTP請求報文使用GET方法和POST方法。當瀏覽器請求一個對象時,使用GET方法,在URL底端填寫該對象的URL地址。例子中使用的是 '/',它是最小的URL后綴,所有服務器將其擴展為某個默認的主頁,例如,/index.html’

  HEAD方法類似於GET方法。當服務器收到使用HEAD方法的請求時,會有一個HTTP報文進行響應,但是不返回請求對象。應用程序開發者常用HEAD進行故障跟蹤。

  PUT方法也被應用程序用來向web服務器上傳對象。利用DELETE方法,用戶或者應用程序可以刪除web服務器上的對象。

  總的來說,第5行的請求行要求服務器取出並返回HTML文件/index.html.它也告知服務器請求剩下的部分是HTTP/1.1格式的。

  請求報頭為服務器提供了額外的信息,例如瀏覽器的商標名,或者瀏覽器理解的MIME類型。請求報頭的格式為:

    <header name>:<header data>

  針對我們的目的,唯一需要關注的報頭是Host報頭(第6行),這個報頭在HTTP/1.1請求中是需要的,而在HTTP/1.0請求中是不需要的。代理緩存(proxy cache)會使用Host報頭,這個代理緩存有時作為瀏覽器和管理被請求文件的原始服務器(origin server)的中介。客戶端和原始服務器之間,可以有多個代理,即所謂的代理鏈(proxy chain)。Host報頭中的數據指示了原始服務器的域名,使得代理鏈中的代理能夠判斷它是否可以在本地緩存中擁有一個被請求內容的副本。

  第7行的空文本行(通過在鍵盤上鍵入回車鍵生成)終止了報頭,並指示服務器發送被請求的HTML文件。

  

  當用戶點擊超鏈接時,瀏覽器在瀏覽器和Web服務器之間發起一個TCP連接,這涉及一個“三次握手”過程,即客戶機向服務器發送一個小TCP報文段,服務器用一個小TCP報文段做出確認和響應,最后,客戶端向服務器返回確認。完成了三次握手的前兩個部分后,客戶端將三次握手第三個部分(客戶端確認)和一個HTTP請求結合起來發送給該TCP鏈接。一旦該請求報文到達服務器,服務器向該TCP鏈接發送HTML文件。

 

  由於絕大部分HTTP請求是用GET方法或POST方法。所有有必要清楚這兩者之間的定義以及區別。

  GET - 用來獲取遠程數據。

  POST - 用來插入/更新遠程數據,比如密碼。

 

  根據HTTP規范,GET用於信息獲取,而且應該是安全的和冪等的。

  (1).所謂安全的意味着該操作用於獲取信息而非修改信息。換句話說,GET 請求一般不應產生副作用。就是說,它僅僅是獲取資源信息,就像數據庫查詢一樣,不會修改,增加數據,不會影響資源的狀態。

  * 注意:這里安全的含義僅僅是指是非修改信息。

  (2).冪等的意味着對同一URL的多個請求應該返回同樣的結果。這里我再解釋一下冪等這個概念:

   冪等(idempotent、idempotence)是一個數學或計算機學概念,常見於抽象代數中。
  冪等有一下幾種定義:
  對於單目運算,如果一個運算對於在范圍內的所有的一個數多次進行該運算所得的結果和進行一次該運算所得的結果是一樣的,那么我們就稱該運算是冪等的。比如絕對值運算就是一個例子,在實數集中,有abs(a)=abs(abs(a))。
  對於雙目運算,則要求當參與運算的兩個值是等值的情況下,如果滿足運算結果與參與運算的兩個值相等,則稱該運算冪等,如求兩個數的最大值的函數,有在在實數集中冪等,即max(x,x) = x。

看完上述解釋后,應該可以理解GET冪等的含義了。

  但在實際應用中,以上2條規定並沒有這么嚴格。引用別人文章的例子:比如,新聞站點的頭版不斷更新。雖然第二次請求會返回不同的一批新聞,該操作仍然被認為是安全的和冪等的,因為它總是返回當前的新聞。從根本上說,如果目標是當用戶打開一個鏈接時,他可以確信從自身的角度來看沒有改變資源即可。

  2.根據HTTP規范,POST表示可能修改變服務器上的資源的請求。繼續引用上面的例子:還是新聞以網站為例,讀者對新聞發表自己的評論應該通過POST實現,因為在評論提交后站點的資源已經不同了,或者說資源被修改了。

 

 

HTTP響應

  HTTP響應也是由三個部分組成,分別是:響應報頭、終止報頭的空行以及響應主體。


  1、響應行格式如下:
  <version> <Status-Code> <Reason-Phrase CRLF>
  其中,HTTP-Version表示服務器HTTP協議的版本;Status-Code表示服務器發回的響應狀態代碼;Reason-Phrase表示狀態代碼的文本描述。
  狀態代碼有三位數字組成,第一個數字定義了響應的類別,且有五種可能取值:
  1xx:指示信息--表示請求已接收,繼續處理
  2xx:成功--表示請求已被成功接收、理解、接受
  3xx:重定向--要完成請求必須進行更進一步的操作
  4xx:客戶端錯誤--請求有語法錯誤或請求無法實現
  5xx:服務器端錯誤--服務器未能實現合法的請求


  常見狀態代碼、狀態描述、說明:
  200 OK  //客戶端請求成功
  400 Bad Request  //客戶端請求有語法錯誤,不能被服務器所理解
  401 Unauthorized  //請求未經授權,這個狀態代碼必須和WWW-Authenticate報頭域一起使用
  403 Forbidden  //服務器收到請求,但是拒絕提供服務
  404 Not Found  //請求資源不存在,eg:輸入了錯誤的URL
  500 Internal Server Error  //服務器發生不可預期的錯誤

  502 Bad Gateway  //對用戶訪問請求的響應超時造成的
  503 Server Unavailable  //服務器當前不能處理客戶端的請求,一段時間后,可能恢復正常
  eg:HTTP/1.1 200 OK (CRLF)

  2、響應正文就是服務器返回的資源的內容

 

參考資料:

  1. http://blog.csdn.net/gueter/article/details/1524447

  2.《計算機網絡-自頂向下方法》

  3. http://www.liaoxuefeng.com/wiki/001374738125095c955c1e6d8bb493182103fac9270762a000/001386832653051fd44e44e4f9e4ed08f3e5a5ab550358d000

  4.  http://www.w3school.com.cn/tags/html_ref_httpmethods.asp

  5.  http://www.cnblogs.com/hyddd/archive/2009/03/31/1426026.html

  6. 《深入理解計算機系統>(第二版)  機械工業出版社

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM