什么是HTTP
1、概述
HTTP全稱是HyperText Transfer Protocal,即超文本傳輸協議,從1990年開始就在WWW上廣泛應用,是現今在WWW上應用最多的協議,HTTP是應用層協議,當你上網瀏覽網頁的時候,瀏覽器和web服務器之間就會通過HTTP在Internet上進行數據的發送和接收。HTTP是一個基於請求/響應模式的、無狀態的協議。即我們通常所說的Request/Response。
2、特點
支持客戶端/服務器模式
簡單快速:客戶向服務器請求服務時,只需傳送請求方法和路徑。由於HTTP協議簡單,使得HTTP服務器的程序規模小,因而通信速度很快
靈活:HTTP允許傳輸任意類型的數據對象,正在傳輸的類型由Content-Type加以標記
無連接:無連接的含義是限制每次鏈接只處理一個請求。服務器處理完客戶的請求,並收到客戶的應答后,即斷開鏈接,采用這種方式可以節省時間
無狀態:HTTP協議是無狀態協議。無狀態是指協議對於事務處理沒有記憶能力。缺少狀態意味着如果后續處理需要前面的信息,則它必須重傳,這樣可能會導致每次連接傳送的數據量增大。另一方面,在服務器不需要先前信息時它的應答就比較快
3、http請求報文由3部分組成:請求行、請求頭、請求體;
4、請求行包括:請求方法、url、協議版本
其中請求方法:get,post,head,put,delete,options,trace,connect.
5、請求頭包括:user-Agent:產生請求的瀏覽器類型
Accept:客戶端可識別的內容類型列表
Host:主機地址
6、請求數據:post方法中,會把數據以key value形式發送請求
7、空行:發送回車符和換行符,通知服務器以下不再有請求頭。
http請求和響應報文
在HTTP連接中報文分為請求(request)和響應(response)兩種。每種報文在HTTP首部都有不同的字段來標識不同的用途。
1. 請求報文:HTTP協議使用TCP協議進行傳輸,在應用層協議發起交互之前,首先是TCP的三次握手。完成了TCP三次握手后,客戶端會向服務器發出一個請求報文。請求報文的格式如下圖抓包所示:
前三行為請求行,其余部分稱為request-header。請求行中的method表示這次請求使用的是get方法。請求方法的種類比較多,如option,get,post,head,put,delete,trace等,常用的主要是get,pos。Get表示請求頁面信息,返回頁面實體;post是請求服務器將指定文檔作為請求的url中的從屬實體,簡單說,我們常用的在網頁中填寫表單然后申請等動作就是使用了post方法,填寫用戶名密碼登錄站點就使用了post方法,如下圖:
方法之后是URI,表示請求的頁面地址,圖中的“/”表示服務器的根目錄。之后是表示http的版本。
請求行之后是請求首部。首部常見的部分有如下幾個:
l Accept:請求的對象類型。如果是“/”表示任意類型,如果是指定的類型,則會變成“type/”。
l Accept-Language:使用的語言種類。
l Accept-Encording:頁面編碼種類。
l Accept-Charset:頁面字符集。說到這里,需要解釋以下字符集和編碼的區別。字符集通常對應着一種語言,將語言中的所有字符集合起來就可以視為一種字符集,這樣我們可以看出,中文並非是一種字符集,因為中文無法使用一些字符來進行表示;而編碼則是將字符轉換為計算機所能識別的2進制數的一種方式,例如常說的unicode,UTF-8,ANSI等等,我們在訪問一些國外網站會出現亂碼的原因就是因為我們瀏覽器所使用的編碼與頁面所使用的編碼不能互相識別。我們常說的BIG5和GB2312都是編碼。
l User-Agent:提供了客戶端瀏覽器的類型和版本。
l Host:連接的目標主機,如果連接的服務器是非標准端口,在這里會出現使用的非標准端口。
l Connection:對於HTTP連接的處理,keep-alive表示保持連接,如果是在響應報文中發送頁面完畢就會關閉連接,狀態變為close。
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后,不會將通過認證的客戶端的頁面返回給該客戶端。
