1、流程簡介
2、Telnet類比HTTP請求
這篇我們就來做一個簡單介紹。
先提個問題:當我們在瀏覽器的地址欄中輸入"http://www.baidu.com/",然後按"斷行符號",這之後發生了什麼事?這裡先不回答,大家接著往下看先。
我們來分析一下:
·HTTP請求流程
首先,http屬於Tcp/Ip模型中的應用程式層協議,而兩個應用程式(我們這裡指的就是瀏覽器與伺服器)之間要進行互相通訊,首先得建立Tcp串連,然後瀏覽器才能向伺服器發送請求資訊,伺服器在接受到請求資訊後,返回相應的應答資訊,瀏覽器接收到來自伺服器的應答資訊後,對這些資料進行解釋執行。
在http 1.0的版本中,瀏覽器的每次請求(也就是對每一個頁面的訪問)都要求建立一次單獨的串連,在處理完每一次的請求後,就自動釋放串連。(這點我們應該都有感覺,比如我們訪問一個頁面,當該頁面在瀏覽器中顯示出來的時候,我們可以拔掉網線,此時該頁面上的資訊並不會丟失。)而當我們請求的網頁檔案中有很多圖片、音樂、電影等資訊時,伺服器返回的資訊中並不直接包含圖片資料,而只是儲存該圖片的連結,當瀏覽器進行解釋的時候,遇到圖片的url時,才向伺服器發出對圖片的請求資訊。可見如果一個網頁中包含多個圖片資料時,將會頻繁的與伺服器建立串連,與釋放串連,這無疑會造成資源的浪費。
http 1.0 請求模式
而http 1.1則可以在一次串連中處理多個請求,並且多個請求可以重疊進行,不需要等待一個請求結束後再發送下一個請求。
·HTTP請求訊息
1次完整的http請求訊息包括:一個請求行、若干訊息頭以及實體內容,而訊息頭和實體內容可以沒有,訊息頭和實體內容間有一個空行。
我們來看一個例子(為了便於說明,我在每行前加了序號):
1 Get /mattmarg/ HTTP/1.0
2 User-Agent: Mozilla/2.0 (Macintosh; I; PPC)
3 Accept: text/html; */*
4 Cookie: name = value
5 Referer: http://www.XXX.com/a.html
其中,第1行就是請求行:請求方式為Get(除了Get之外,還有Post、Put、Delete方式),請求的檔案位於"根目錄/mattmarg/"下,當然也可以直接給出需要的頁面(如:/mattmarg/index.asp,也可以加上一些其它欄位 如:/mattmarg/index.asp?id=1&uid=xxx。當我們通過Get請求時,提交給伺服器的請求行長度不能超過1K,而如果利用Post方式,則是把所提交的資訊以實體內容形式發送給伺服器,所以如果伺服器沒有限制的話,原則上講可以傳輸無限大的內容),HTTP/1.0 表示了http的版本為1.0。其餘幾行就是訊息頭了,訊息頭主要是用來向伺服器傳達某種資訊或指示。如告訴伺服器自己的終端(User-Agent)是什麼(如果是瀏覽器則返回相應的瀏覽器型號),終端所可以解釋的類型(Accept)是什麼,是從哪個頁面提交的請求(Referer),以及瀏覽器所能解釋的語言(Accept-Language)等等。我們這裡拿Accept-Language來舉個例子,大家都知道google在中國大陸顯示的是簡體中文,而在其它的國家則顯示對應的語言,這個是怎麼做到的呢?其實就是瀏覽器向伺服器遞交的請求資訊中包含了Accept-Language,而我們的瀏覽器預設是zh-cn,然後伺服器在接受到該資訊時返回對應的頁面。
我們可以通過以下方法來驗證一下:
1、開啟瀏覽器->工具->internet選項->常規選項卡
2、選擇"語言",可見預設的語言是中文
3、選擇"添加",選擇一種語言,然後調節一下優先順序
4、確定之後,我們再訪問一下http://www.google.com/,是不是發現原來的簡體中文全都成了繁體字了。
·HTTP響應訊息
Http響應訊息的格式為:一個狀態行、若干訊息頭和實體內容,其中訊息頭和實體內容可以沒有,訊息頭和實體內容間有一個空行。
我們依舊先來看一個例子:
01 HTTP/1.1 200 OK
02 Server: Microsoft-IIS/5.1
03 X-Powered-By: ASP.NET
04 Date: Sun, 06 Jul 2008 11:01:21 GMT
05 Content-Type: text/html
06 Accept-Ranges: bytes
07 Last-Modified: Wed, 02 Jul 2008 01:01:26 GMT
08 ETag: "0f71527dfdbc81:ade"
09 Content-Length: 46
10
11 <html><head></head><body>adfasfa</body></html>
其中,01行是狀態行,用於顯示伺服器響應的狀態,HTTP/1.1顯示了對應的http協議版本,200為狀態數字,OK為狀態資訊用於解釋狀態數字(這裡OK對應200,表示請求正常);02~09是訊息頭部分,10為空白行,11為實體內容(也就是伺服器返回的網頁內容)。
好了,相信大家應該已經對這個http請求的流程有了一個大概的瞭解了吧,那麼我們反過來回答下最初留下的問題:當我們在瀏覽器的地址欄中輸入 " http://www.baidu.com/ " ,然後按"斷行符號",這之後發生了什麼事?。
首先,瀏覽器找到該網址所指向的IP,然後與其建立TCP串連,接著向百度伺服器提出Get請求,當伺服器接收到我們的請求後,向我們傳送應答資訊--百度的頁面,然後中斷連線。
[補充]以上文章中主要是描述HTTP請求的大致流程,至於HTTP之前所建立的一系列串連,只用了"瀏覽器找到該網址所指向的IP,然後與其建立TCP串連"這句話或類似的話來帶過。根據朋友們的回複顯得這個說法不是很恰當。所以我在這裡再補充些東西。
1、擷取IP。瀏覽器地址欄中輸入"http://www.xxx.edu.cn/"並提交之後,首先它會在DNS本機快取表中尋找,如果有則直接告訴IP地址。如果沒有則要求網關DNS進行尋找,如此下去,當找到對應的ip後,則返回給瀏覽器。
2、建立TCP串連。當擷取到IP之後,就開始與所請求的伺服器建立TCP串連,你可以在中發現syn,ack,這些標識符就是用來同步用的。
3、串連建立後,就向伺服器發出http請求(大家可以看出來)。如果是HTTP1.0的版本則,每一次請求結束後,就釋放TCP串連。
(中,由於是第一次訪問網站,無法在本地找到對應IP)
(短時間內,第二次訪問同一網站)
參考:
1.張孝祥老師的HTTP協議詳解
2.http://www.cnblogs.com/stg609/articles/1231832.html
瀏覽器一般是圖形介面的,因此我們並不瞭解在這華麗表面後面所發生的一切。當你點擊一個串連時,瀏覽器首先找到網站的IP地址,這是通過DNS來實現的。在找到IP地址後可以建立TCP串連了,串連建立後我們就可以發送請求了,但這個請求是什麼樣子呢?我們現在假設點擊了一個從WWW.WEBMONKEY.COM/HTML/96/47/INDEX2A.HTML點擊了WWW.GRIPY.ORG/MATTMARG/,這時瀏覽器會發出下面的請求: Get /mattmarg/ HTTP/1.0 User-Agent: Mozilla/2.0 (Macintosh; I; PPC) Accept: text/html; */* Cookie: name = value Referer: http://www.webmonkey.com/html/96/47/index2a.html Host: www.grippy.org 第一行稱為請求,它告訴伺服器從MATTMARG取得檔案,這裡的目錄一般是要加/的。下面幾行通知伺服器你所使用的瀏覽器是什麼類型,你所接收的資料是什麼類型。如果你以前訪問過這個網站,網站可能向你發送了cookie,如果你已經有了一個這樣的cookie,瀏覽器會將這個cookie返回給伺服器。referer行通知伺服器使用者從哪一頁到達此頁的。 下面伺服器就要返迴文件了,每次伺服器返迴文件時,都要返回一個http/1.0響應,同時帶有狀態代碼,在此之後是一些描述內部的頭資訊。下面就是一個響應: HTTP/1.0 200 Found Date: Mon, 10 Feb 1997 23:48:22 GMT Server: Apache/1.1.1 HotWired/1.0 Content-type: text/html Last-Modified: Tues, 11 Feb 1997 22:45:55 GMT 不同資料可能返回不同的content-type,因此不同的內容需要不同的content-type,因此有時候這個過程是很慢
本文來自CSDN部落格,轉載請標明出處:http://blog.csdn.net/okman1214/archive/2009/08/04/4404628.aspx