什么是HTTP協議:
HTTP是一個屬於應用層的面向對象的協議,由於其簡捷、快速的方式,適用於分布式超媒體信息系統。它於1990年提出,經過幾年的使用與發展,得到
不斷地完善和擴展。目前在WWW中使用的是HTTP/1.0的第六版,HTTP/1.1的規范化工作正在進行之中,而且HTTP-NG(Next Generation of HTTP)的
建議已經提出。
HTTP協議的主要特點可概括如下:
1.支持客戶/服務器模式。
2.簡單快速:客戶向服務器請求服務時,只需傳送請求方法和路徑。請求方法常用的有GET、HEAD、POST。每種方法規定了客戶與服務器聯系的類型不同。
由於HTTP協議簡單,使得HTTP服務器的程序規模小,因而通信速度很快。
3.靈活:HTTP允許傳輸任意類型的數據對象。正在傳輸的類型由Content-Type加以標記。
4.無連接:無連接的含義是限制每次連接只處理一個請求。服務器處理完客戶的請求,並收到客戶的應答后,即斷開連接。采用這種方式可以節省傳輸時間。
5.無狀態:HTTP協議是無狀態協議。無狀態是指協議對於事務處理沒有記憶能力。缺少狀態意味着如果后續處理需要前面的信息,則它必須重傳,這樣可能
導致每次連接傳送的數據量增大。另一方面,在服務器不需要先前信息時它的應答就較快。
HTTP協議的URL
HTTP(超文本傳輸協議)是一個基於請求與響應模式的、無狀態的、應用層的協議,常基於TCP的連接方式,HTTP1.1版本中給出一種持續連接的機制,
絕大多數的Web開發,都是構建在HTTP協議之上的Web應用。
HTTP URL (URL是一種特殊類型的URI,包含了用於查找某個資源的足夠的信息)的格式如下:
http://host[":"port][abs_path]
http表示要通過HTTP協議來定位網絡資源;host表示合法的Internet主機域名或者IP地址;port指定一個端口號,為空則使用缺省端口80;abs_path
指定請求資源的URI;如果URL中沒有給出abs_path,那么當它作為請求URI時,必須以“/”的形式給出,通常這個工作瀏覽器自動幫我們完成。
舉個例子:
1、輸入:www.guet.edu.cn
瀏覽器自動轉換成:http://www.guet.edu.cn/
2、http:192.168.0.116:8080/index.jsp
HTTP報文分析
在HTTP連接中報文分為請求(request)和響應(response)兩種。每種報文在HTTP首部都有不同的字段來標識不同的用途。
報文結構如下:

1.請求報文:
HTTP協議使用TCP協議進行傳輸,在應用層協議發起交互之前,首先是TCP的三次握手。完成了TCP三次握手后,客戶端會向服務器發出一個請求
報文。一個HTTP請求報文由請求行(request line)、請求頭部(header)、空行和請求數據4個部分組成。
請求報文的格式如下圖抓包所示:

前三行為請求行,其余部分稱為request-header。請求行中的method表示這次請求使用的是get方法。請求方法的種類比較多,如option,get,
post,head,put,delete,trace等,常用的主要是get,post。Get表示請求頁面信息,返回頁面實體;post是請求服務器將指定文檔作為請求的
url中的從屬實體,簡單說,我們常用的在網頁中填寫表單然后申請等動作就是使用了post方法,填寫用戶名密碼登錄站點就使用了post方法,如下圖:

方法之后是URI,表示請求的頁面地址,圖中的“/”表示服務器的根目錄。之后是表示http的版本。
請求行之后是請求首部。首部常見的部分有如下幾個:
Accept:請求的對象類型。如果是“/”表示任意類型,如果是指定的類型,則會變成“type/”。
Accept-Language:使用的語言種類。
Accept-Encording:頁面編碼種類。
Accept-Charset:頁面字符集。
User-Agent:提供了客戶端瀏覽器的類型和版本。
Host:連接的目標主機,如果連接的服務器是非標准端口,在這里會出現使用的非標准端口。
Connection:對於HTTP連接的處理,keep-alive表示保持連接,如果是在響應報文中發送頁面完畢就會關閉連接,狀態變為close。
說到這里,需要解釋以下字符集和編碼的區別。字符集通常對應着一種語言,將語言中的所有字符集合起來就可以視為一種字符集,這樣我們
可以看出,中文並非是一種字符集,因為中文無法使用一些字符來進行表示;而編碼則是將字符轉換為計算機所能識別的2進制數的一種方式,例
如常說的unicode,UTF-8,ANSI等等,我們在訪問一些國外網站會出現亂碼的原因就是因為我們瀏覽器所使用的編碼與頁面所使用的編碼不能
互相識別。我們常說的BIG5和GB2312都是編碼。
2. 響應報文:
當收到get或post等方法發來的請求后,服務器就要對報文進行響應。同樣,響應報文也分為兩部分。前兩行稱為狀態行,狀態行給出了服務
器的http版本,以及一個響應代碼。響應代碼是服務器根據請求進行查找后得到的結果的一種反饋,共有5大類。分別以1、2、3、4、5開頭。

1**表示接收到請求,繼續進程,在發送post后可以收到該應答。
2**表示請求的操作成功,在發送get后返回。
3**表示重發,為了完成操作必須進一步動作。
4**表示客戶端出現錯誤。
5**表示服務器出現錯誤。
其余部分稱為應答實體。
其中的server表示服務器軟件版本,date標注了當前服務器的時間,connection標明連接關閉,抓包可以發現在響應返回后服務器向客
戶端發出fin包單向關閉了連接。Expires表示在某個時間以前可以不用重新緩存該頁面,而cache-control表示對頁面是否進行緩存。Pragma
的參數no-cache表示對頁面不進行緩存。而content-type表示了應答請求后返回的內容類型。Content還有內容長度和內容語言以及內容編
碼三個項,其中內容長度只有在請求報文中的connection值為keep-alive時才會用到。
3. Cookie:
cookie是一種類似緩存的機制,它保存在一個本地的文本文件中,其主要作用是在發送請求時將cookie放在請求首部中發送給服務器,服
務器收到cookie后查找自己已有的cookie信息,確定客戶端的身份,然后返回相應的頁面,cookie的方便之處在於可以保持一種已登錄的狀態,
例如:我們注冊一個論壇,每次訪問都需要進行填寫用戶名和密碼然后登錄。而使用了cookie后,如果cookie沒有到達過期時間,那么我們只需
在第一次登錄時填寫信息然后登錄,以后的訪問就可以省略這一步驟。
在HTTP協議中,cookie的交互過程是這樣的:首先是三次握手建立TCP連接,然后客戶端發出一個http request,這個request中不包含
任何cookie信息。

當服務器收到這個報文后,針對request method作出響應動作,在響應報文的實體部分,加入了set-cookie段,set-cookie段中給出
了cookie的id,過期時間以及參數path,path是表示在哪個虛擬目錄路徑下的頁面可以讀取使用該cookie,將這些信息發回給客戶端后,客
戶端在以后的http request中就會將自己的cookie段用這些信息填充。

如果用戶在連接中通過了服務器相應的認證程序,服務器會添加一個cdb_auth到set-cookie中,這個段表示了客戶端的認證信息,而客戶
端以后在訪問過程中也會將cdb_auth信息寫入自己的cookie字段。服務器每次收到http request后讀取cookie,然后根據cookie的信息返
回不同的頁面。例如,沒有通過認證的客戶端在request中不會有cdb_auth,因此服務器讀取cookie后,不會將通過認證的客戶端的頁面返回
給該客戶端。
