作者:Vamei 出處:http://www.cnblogs.com/vamei 嚴禁任何形式轉載。
*** 超文本文檔中包含有超連結,指向其他的資源。超文本文檔是網際網路(World Wide Web,即www)的基礎。
HTTP協定解決檔案傳輸的問題。HTTP是應用層協定,主要建立在TCP協定之上(偶爾也可以UDP為底層)。它随着網際網路的發展而流行。HTTP協定目的是,如何在網際網路的網絡環境下,更好的利用TCP協定,以實作檔案,特别是超文本檔案的傳輸。
早期的HTTP協定主要傳輸靜态檔案,即真實存儲在伺服器上的檔案。随着網際網路的發展,HTTP協定被用于傳輸“動态檔案”,伺服器上的程式根據HTTP請求即時生成的動态檔案。我們将HTTP的傳輸對象統稱為資源(resource)。
HTTP實作了資源的訂購和傳送。其工作方式類似于快餐點單。
請求(request): 顧客向服務員提出請求:“來個雞腿漢堡”。
回複(response):服務員根據情況,回應顧客的請求

根據情況的不同,服務員的回應可能有很多,比如:
服務員準備雞腿漢堡,将雞腿漢堡交給顧客。(一切OK)
服務員發現自己隻是個甜品站。他讓顧客前往正式櫃台點單。(重新定向)
服務員告訴顧客雞腿漢堡沒有了。(無法找到)
交易結束後,服務員就将剛才的交易抛到腦後,準備服務下一位顧客。
下面來看一下HTTP是如何具體實作的。
HTTP協定的通信是一次request-responce交流。用戶端(guest)向伺服器送出請求(request),伺服器(server)回複(response)用戶端。
HTTP協定規定了請求和回複的格式:
起始行隻有一行。它包含了請求/回複最重要的資訊。請求的起始行表示(顧客)“想要什麼”。回複的起始行表示(後廚)“發生什麼”。
頭資訊可以有多行。每一行是一對鍵值對(key-value pair),比如:
它表示,包含有一個名為Content-type的參數,該參數的值為text/plain。頭資訊是對起始行的補充。請求的頭資訊對伺服器有指導意義 (好像在菜單上注明: 雞腿不要辣)。回複的頭資訊則是提示用戶端(比如,在盒子上注明: 小心燙)
主體部分包含了具體的資源。上圖的請求中并沒有主體,因為我們隻是在下單,而不用管後廚送什麼東西 (請求是可以有主體内容的)。回複中包含的主體是一段文本文字(Hello World!)。這段文本文字正是顧客所期待的,雞腿漢堡。
我們深入一些細節。先來看一下請求:
在起始行中,有三段資訊:
GET 方法。用于說明想要伺服器執行的操作。
/index.html 資源的路徑。這裡指向伺服器上的index.html檔案。
HTTP/1.1 協定的版本。HTTP第一個廣泛使用的版本是1.0,目前版本為1.1。
早期的HTTP協定隻有GET方法。遵從HTTP協定,伺服器接收到GET請求後,會将特定資源傳送給客戶。這類似于客戶點單,并獲得漢堡的過程。使用GET方法時,是客戶向伺服器索取資源,是以請求往往沒有主體部分。
GET方法也可以用于傳輸一些不重要的資料。它是通過改寫URL的方式實作的。GET的資料利用URL?變量名=變量值的方法傳輸。比如向http://127.0.0.1發送一個變量“q”,它的值為“a”。那麼,實際的URL為http://127.0.0.1?q=a。伺服器收到請求後,就可以知道"q"的值為"a"。
GET方法之外,最常用的是POST方法。它用于從用戶端向伺服器送出資料。使用POST方法時,URL不再被改寫。資料位于http請求的主體。POST方法最用于送出HTML的form資料。伺服器往往會對POST方法送出的資料進行一定的處理,比如存入伺服器資料庫。
伺服器在接收到請求之後,會根據程式,生成對應于該請求的回複,比如:
回複的起始行同樣包含三段資訊
HTTP/1.1 協定版本
200 狀态碼(status code)。
OK 狀态描述
OK是對狀态碼200的文字描述,它隻是為了便于人類的閱讀。電腦隻關心三位的狀态碼(status code),即這裡的200。200表示一切OK,資源正常傳回。狀态碼代表了伺服器回應動作的類型。
其它常見的狀态碼還有:
302,重新定向(redirect): 我這裡沒有你想要的資源,但我知道另一個地方xxx有,你可以去那裡找。
404,無法找到(not found): 我找不到你想要的資源,無能為力。
(重新定向時,用戶端可以根據302的建議前往xxx尋找資源,也可以忽略該建議。)
Content-type說明了主體所包含的資源的類型。根據類型的不同,用戶端可以啟動不同的處理程式(比如顯示圖像檔案,播放聲音檔案等等)。下面是一些常見的資源
text/plain 普通文本
text/html HTML文本
image/jpeg jpeg圖檔
image/gif gif圖檔
Content-length說明了主體部分的長度,以位元組(byte)為機關。
回應的主體部分為一段普通文本,即
Hello World!
根據早期的HTTP協定,每次request-reponse時,都要重建立立TCP連接配接。TCP連接配接每次都重建立立,是以伺服器無法知道上次請求和本次請求是否來自于同一個用戶端。是以,HTTP通信是無狀态(stateless)的。伺服器認為每次請求都是一個全新的請求,無論該請求是否來自同一位址。
想象進階餐廳和快餐店。進階餐廳會知道客人所在的位置,如果新增點單,那麼服務員知道這和上一單同一桌。而在快餐店中,不好意思,服務員并不記錄客人的特征。想再次點單?請重新排隊……
随着HTTP協定的發展,HTTP協定允許TCP連接配接複用,以節省建立連接配接所耗費的時間。但HTTP協定依然保持無狀态的特性。
HTTP協定實作了網際網路上的資源傳輸,采用request-response的工作方式。
GET, POST
無狀态