我們在用Asp.net技術開發Web應用程式後,當使用者在瀏覽器輸入一個網址時就是再向伺服器發送一個HTTP請求,此時就使用了應用程式層的HTTP協議,在上一個專題我們簡單介紹了網路通訊協定的知識,主要是為了後面講HTTP協議做一個鋪墊的,只有對HTTP協議有一個清楚的認識,這樣當我們用Asp.net技術開發Web應用程式時,我們可以多從網路通訊協定的方面去思考我們的應用程式,而不是只是單單停留在對伺服器控制項的拖拉的使用,這樣也可以協助我們開發一個自己的自訂web伺服器。在這裡我想同時把我對Asp.net的本質的理解和大家分享下,如果有什麼不對的地方,還請大家指出,首先,當我們設計一個演算法的時候要明確輸入參數和演算法的返回(演算法也就是也就是一個處理常式),其實Asp.net開發的web網頁可以理解為一個處理常式,因為我們在web瀏覽器中所看到的都是HTML文檔(HTML也就是Asp.net網頁處理後程式的輸出,即演算法的返回),然而輸入參數也就是使用者通過瀏覽器輸入的一個Http請求(可以說是請求的一個URI地址),asp.net這門技術就協助我們把請求的aspx頁面翻譯為HTML文檔,然後HTML文檔通過HTTP協議把HTML文檔發送給瀏覽器,瀏覽器再把這麼標籤(HTML文檔只是一串字串,如果沒有瀏覽器的解析我們看到的也是一些字串,而不是可視化的介面了)解析為可視化的介面。這樣一次web請求也就結束。後面也會和大家分享下Asp.net中背後替我們所做事情的一些對象,這裡還是回到Http協議的介紹吧。
一、HTTP協議的簡介
HTTP中文為超文字傳輸通訊協定 (HTTP),從名字上很容易理解,Http協議就是將超文字標記語言 (HTML)的文檔(即Html文檔)從web服務傳送到用戶端的瀏覽器。它屬於一個應用程式層的協議。
二、網路的工作過程
當使用者要訪問網路中的某個網頁時,大致要經過以下幾個步驟:
- 使用者首先要確定網頁檔案所在的URL(統一資源定位器,也就是網頁在網路上的家庭住址,通過這個地址就可以找到這個網頁)如www.cnblogs.com
- 瀏覽器向DNS(網域名稱伺服器)發出請求,告訴DNS說:"我要把www.cnblogs.com轉化為它所定義的IP地址",這裡可以簡單把DNS理解為一個字典,知道網域名稱就可以知道網域名稱對於的IP地址,他們有這個一個映射的關係
- DNS收到請求後就開始查詢,查到後向瀏覽器返回結果。如網域名稱為www.cnblogs.com對應的IP地址為61.155.169.116
- 知道IP地址後, 瀏覽器向IP地址為61.155.169.116的主機發出與連接埠號碼80建議一條TCP串連請求(HTTP協議是建立在傳輸層TCP的基礎上的),80連接埠是伺服器提供web服務的預設連接埠
- 建立串連後,瀏覽器發出一條HTTP請求,如 GET http://www.cnblogs.com/ HTTP/1.1
- 當網域名稱為www.cnblogs.com的伺服器接受到請求後,向瀏覽器發送一個html檔案
- 檔案發送完後,由伺服器主動關閉TCP串連。
- 瀏覽器接收傳送來的頁面並顯示
- 如果Html檔案中包含圖片,還要與伺服器再次建立一個TCP串連,以便可以下載圖片
上面介紹的步驟中,瀏覽器發出一個請求後,如何把一個伺服器上的HTML文檔下載到請求網頁的主機上呢? 這個過程就是由HTTP完成,即完成超文字檔的傳送,HTTP協議是web伺服器的基礎。
二、HTTP請求
Http請求由三部分組成:請求行、要求標頭和請求資料,一個HTTP請求的格式一般如下:
?
要求方法 URL HTTP版本號碼 要求標頭資訊 <一個空行> 請求資料 |
HTTP請求的方法如下表:
方法 |
描述 |
Get |
返回URL所指的文檔,一般用來請求下載Web網頁 |
Head |
請求文檔頭,它類似Get方法,只是Web伺服器返回指定文檔的首部資訊 |
Post |
它與Get方法相反,請求伺服器接受指定文檔,但它不替換已有的文檔,只是將新資料附加在它的後面 |
Put |
它與Get方法類似,用從用戶端傳送的資料取代指定文檔中的內容,使客戶可以向遠程Web伺服器傳送網頁等檔案 |
Delete |
請求伺服器刪除指定的頁面 |
Options |
允許用戶端查看伺服器的效能 |
Trace |
用於測試允許用戶端查看的訊息回收過程 |
經常使用的是Get和Post方法,當使用Get方法發出請求時,請求資料為空白,所以此時的HTTP請求行就由兩部分組成:請求行和要求標頭資訊,下面我們形象看看具體的HttP的執行個體:
當在瀏覽器中地址欄裡面輸入:www.cnblogs.com,此時我們相當於發出一個HTTP請求,具體為:
並且可以看出網頁中含有圖片指令碼等檔案時,用戶端會繼續與伺服器發出請求,請求所需要的圖片和指令檔。
補充:經一位朋友的留言中,在這裡我補充下,現在通常是只建立一個TCP串連,通過HTPP 要求標頭的Connetion欄位來指明,當伺服器收到附帶有Connection: Keep-Alive的請求時,它也會在回應標頭中添加一個同樣的欄位來使用Keep-Alive。這樣一來,用戶端和伺服器之間的HTTP串連就會被保持,不會斷開,(一些特殊情況除外)當用戶端發送另外一個請求時,就使用這條已經建立的串連。
下面介紹下要求標頭的資訊:
Accept:表示用戶端接收的資料類型。例如,Accept:text/html表示用戶端可接收HTML類型的文本
User Agent:表示用戶端軟體類型
Referer:表示的是上一串連的url,如跳轉到本頁面的上一頁面url。
是一個通過Get方法把一個HTML檔案下載到本例瀏覽器中顯示的過程,當我們在部落格園首頁面點登陸後輸入使用者名稱和密碼後點確認按鈕後,此時我們發出的HTTP的請求是通過Post方法,下面是一個:
可以看出, 通過Post方法發出的HTTP請求中有一個空行(空行後為請求資料),而Get方法發出的請求中沒有。
三、HTTP響應
同樣,Http響應也是由三部分組成:狀態行,回應標頭和響應資料群組成,Http響應格式如下:
?
狀態行以HTTP版本號碼開始,後面跟著3為數字,代表響應代碼,響應代碼用來告訴用戶端,伺服器是否產生了預期的響應。如HTTP/1.1 200 OK.
HTTP/1.1中定義五種響應代碼:
1xx:指示資訊--表示請求已接收,繼續處理
2xx:成功--表示請求已被成功接收、理解、接受
3xx:重新導向--要完成請求必須進行更進一步的操作
4xx:用戶端錯誤--請求有語法錯誤或請求無法實現
5xx:伺服器端錯誤--伺服器未能實現合法的請求
具體響應代碼的說明見下:
HTTP回應標頭用於伺服器向用戶端提供請求文檔資訊或服務端的狀態資訊,
四、總結
到這裡這篇文章也算是說完了,HTTP協議只是應用程式層中協議的其中之一,應用程式層還有其他的一些協議,比如FTP(檔案傳輸通訊協定),SMTP(電子郵件協議)等,這些協議在後面都會有所介紹。後面一個專題打算應用HTTP協議的只是自訂一個簡單的Web伺服器來類比我們平常在瀏覽器中輸入網址後發送Http請求和伺服器返迴響應的過程。