天天看點

協定森林15 先生,要點單嗎? (HTTP協定概覽)

作者:Vamei 出處:http://www.cnblogs.com/vamei 嚴禁任何形式轉載。

*** 超文本文檔中包含有超連結,指向其他的資源。超文本文檔是網際網路(World Wide Web,即www)的基礎。

HTTP協定解決檔案傳輸的問題。HTTP是應用層協定,主要建立在TCP協定之上(偶爾也可以UDP為底層)。它随着網際網路的發展而流行。HTTP協定目的是,如何在網際網路的網絡環境下,更好的利用TCP協定,以實作檔案,特别是超文本檔案的傳輸。

早期的HTTP協定主要傳輸靜态檔案,即真實存儲在伺服器上的檔案。随着網際網路的發展,HTTP協定被用于傳輸“動态檔案”,伺服器上的程式根據HTTP請求即時生成的動态檔案。我們将HTTP的傳輸對象統稱為資源(resource)。

HTTP實作了資源的訂購和傳送。其工作方式類似于快餐點單。

請求(request): 顧客向服務員提出請求:“來個雞腿漢堡”。

回複(response):服務員根據情況,回應顧客的請求

協定森林15 先生,要點單嗎? (HTTP協定概覽)

根據情況的不同,服務員的回應可能有很多,比如:

服務員準備雞腿漢堡,将雞腿漢堡交給顧客。(一切OK)

服務員發現自己隻是個甜品站。他讓顧客前往正式櫃台點單。(重新定向)

服務員告訴顧客雞腿漢堡沒有了。(無法找到)

交易結束後,服務員就将剛才的交易抛到腦後,準備服務下一位顧客。

下面來看一下HTTP是如何具體實作的。

HTTP協定的通信是一次request-responce交流。用戶端(guest)向伺服器送出請求(request),伺服器(server)回複(response)用戶端。

協定森林15 先生,要點單嗎? (HTTP協定概覽)

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

無狀态

繼續閱讀