http協議請求報文與響應報文分析

什麼是HTTP協議:

  HTTP是一個屬於應用層的面向對象的協議,因爲其簡捷、快速的方式,適用於分佈式超媒體信息系統。它於1990年提出,通過幾年的使用與發展,獲得瀏覽器

不斷地完善和擴展。目前在WWW中使用的是HTTP/1.0的第六版,HTTP/1.1的規範化工做正在進行之中,並且HTTP-NG(Next Generation of HTTP)的緩存

建議已經提出。服務器

HTTP協議的主要特色可歸納以下:

1.支持客戶/服務器模式。cookie

2.簡單快速:客戶向服務器請求服務時,只需傳送請求方法和路徑。請求方法經常使用的有GET、HEAD、POST。每種方法規定了客戶與服務器聯繫的類型不一樣。網絡

因爲HTTP協議簡單,使得HTTP服務器的程序規模小,於是通訊速度很快。jsp

3.靈活:HTTP容許傳輸任意類型的數據對象。正在傳輸的類型由Content-Type加以標記。分佈式

4.無鏈接:無鏈接的含義是限制每次鏈接只處理一個請求。服務器處理完客戶的請求,並收到客戶的應答後,即斷開鏈接。採用這種方式能夠節省傳輸時間。post

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時,必須以「/」的形式給出,一般這個工做瀏覽器自動幫咱們完成。

舉個例子:

一、輸入:www.guet.edu.cn

瀏覽器自動轉換成:http://www.guet.edu.cn/

二、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大類。分別以一、二、三、四、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後,不會將經過認證的客戶端的頁面返回

給該客戶端。

相關文章
相關標籤/搜索