一烦粒、HTTP工作過程
1.客戶端連接到Web服務(wù)器
一個(gè)HTTP客戶端休溶,通常是瀏覽器,與Web服務(wù)器的HTTP端口(默認(rèn)為80)建立一個(gè)TCP套接字連接扰她。
2. 發(fā)送HTTP請(qǐng)求
通過TCP套接字兽掰,客戶端向Web服務(wù)器發(fā)送一個(gè)文本的請(qǐng)求報(bào)文,一個(gè)請(qǐng)求報(bào)文由請(qǐng)求行徒役、請(qǐng)求頭部孽尽、空行和請(qǐng)求數(shù)據(jù)4部分組成。
3. 服務(wù)器接受請(qǐng)求并返回HTTP響應(yīng)
Web服務(wù)器解析請(qǐng)求廉涕,定位請(qǐng)求資源泻云。服務(wù)器將資源復(fù)本寫到TCP套接字艇拍,由客戶端讀取狐蜕。一個(gè)響應(yīng)由狀態(tài)行、響應(yīng)頭部卸夕、空行和響應(yīng)數(shù)據(jù)4部分組成层释。
4. 釋放連接TCP連接
若connection 模式為close,則服務(wù)器主動(dòng)關(guān)閉TCP連接快集,客戶端被動(dòng)關(guān)閉連接贡羔,釋放TCP連接;若connection 模式為keepalive廉白,則該連接會(huì)保持一段時(shí)間,在該時(shí)間內(nèi)可以繼續(xù)接收請(qǐng)求;
5. 客戶端瀏覽器解析HTML內(nèi)容
客戶端瀏覽器首先解析狀態(tài)行乖寒,查看表明請(qǐng)求是否成功的狀態(tài)代碼猴蹂。然后解析每一個(gè)響應(yīng)頭,響應(yīng)頭告知以下為若干字節(jié)的HTML文檔和文檔的字符集楣嘁“跚幔客戶端瀏覽器讀取響應(yīng)數(shù)據(jù)HTML,根據(jù)HTML的語法對(duì)其進(jìn)行格式化逐虚,并在瀏覽器窗口中顯示聋溜。
二、請(qǐng)求報(bào)文(request)
HTTP協(xié)議使用TCP協(xié)議進(jìn)行傳輸叭爱,在應(yīng)用層協(xié)議發(fā)起交互之前撮躁,首先是TCP的三次握手。完成了TCP三次握手后买雾,客戶端會(huì)向服務(wù)器發(fā)出一個(gè)請(qǐng)求報(bào)文把曼。請(qǐng)求報(bào)文的格式如下圖抓包所示:
2.1注釋:
字段意義
Method:表示這次請(qǐng)求使用的是方法。常用方法有:GET/POST
URI:表示請(qǐng)求的頁(yè)面地址漓穿,圖中的“/”表示服務(wù)器的根目錄祝迂。
Version:表示http的版本。
Accept:請(qǐng)求的對(duì)象類型器净。如果是“/”表示任意類型型雳,如果是指定的類型,則會(huì)變成“type/”山害。
Accept-Language:使用的語言種類纠俭。
Accept-Encording:頁(yè)面編碼種類。
Accept-Charset:頁(yè)面字符集浪慌。例如常說的unicode冤荆,UTF-8,ANSI权纤,BIG5和GB2312都是編碼钓简。
User-Agent:提供了客戶端瀏覽器的類型和版本與操作系統(tǒng)版本。
Host:連接的目標(biāo)主機(jī)汹想,如果連接的服務(wù)器是非標(biāo)準(zhǔn)端口外邓,在這里會(huì)出現(xiàn)使用的非標(biāo)準(zhǔn)端口。
Connection:對(duì)于HTTP連接的處理古掏,keep-alive表示保持連接损话,如果是在響應(yīng)報(bào)文中發(fā)送頁(yè)面完畢就會(huì)關(guān)閉連接,狀態(tài)變?yōu)閏lose。
Content-Length:發(fā)送給HTTP服務(wù)器數(shù)據(jù)的長(zhǎng)度丧枪。即請(qǐng)求消息正文的長(zhǎng)度光涂;
x-forward-for:簡(jiǎn)稱XFF頭,代表客戶端真實(shí)IP拧烦,通過修改該值忘闻,可以進(jìn)行偽造客戶端IP。XFF注入是SWL注入的一種恋博。
2.2其中涉及到請(qǐng)求方法:
1.GET
get方法請(qǐng)求指定的頁(yè)面信息服赎,返回實(shí)體主體。該請(qǐng)求是向服務(wù)器請(qǐng)求信息交播,請(qǐng)求參數(shù)會(huì)跟在url后面重虑,因此,對(duì)傳參長(zhǎng)度有限制的秦士,而且不同瀏覽器的上限是不同的(2k, 7~8k及其他)缺厉。由于get請(qǐng)求直接將參數(shù)暴露在url中,因此對(duì)于一些帶有重要信息的請(qǐng)求可能并不完全合適(不安全)隧土。
2.POST
post請(qǐng)求是向指定資源提交數(shù)據(jù)進(jìn)行處理請(qǐng)求提针,例如提交表單或者上傳文件等。數(shù)據(jù)被包含在請(qǐng)求體中曹傀,POST請(qǐng)求可能會(huì)導(dǎo)致新的資源的建立和/或已有資源的修改辐脖。post方法沒有對(duì)傳遞資源的大小進(jìn)行限制,往往是取決于服務(wù)器端的接受能力皆愉,而且嗜价,該方法傳參安全性稍高些
3.PUT
PUT方法是從客戶端向服務(wù)器傳送的數(shù)據(jù)取代指定的文檔的內(nèi)容。PUT方法的本質(zhì)是idempotent的方法幕庐,通過服務(wù)是否是idempotent來判斷用PUT 還是 POST更合理久锥,通常情況下這兩種方法并沒有刻意區(qū)分,根據(jù)語義使用即可
4.DELETE
請(qǐng)求服務(wù)器刪除指定的頁(yè)面异剥,DELETE請(qǐng)求一般會(huì)返回3種狀態(tài)碼:
200 (OK) - 刪除成功瑟由,同時(shí)返回已經(jīng)刪除的資源
202 (Accepted) - 刪除請(qǐng)求已經(jīng)接受,但沒有被立即執(zhí)行(資源也許已經(jīng)被轉(zhuǎn)移到了待刪除區(qū)域)
204 (No Content) - 刪除請(qǐng)求已經(jīng)被執(zhí)行冤寿,但是沒有返回資源(也許是請(qǐng)求刪除不存在的資源造成的)
5.OPTIONS
允許客戶端查看服務(wù)器的性能歹苦。(常見的是跨域預(yù)檢Preflighted Reqeusts方法會(huì)采用該方法)。一般來說督怜,開發(fā)中用到該方法是用來獲取服務(wù)器支持的請(qǐng)求類型或者查看服務(wù)器類型殴瘦,來確保接下來發(fā)送的請(qǐng)求夠安全。該請(qǐng)求方法的響應(yīng)不能緩存亮蛔。如果該URI是一個(gè)星號(hào)(“*”)痴施,OPTIONS請(qǐng)求將試圖應(yīng)用于服務(wù)器擎厢,而不是某個(gè)指定資源究流;如果該URI不是星號(hào)辣吃,則只能用來獲取該資源通信中可用的選項(xiàng)。
6.HEAD
類似于get請(qǐng)求芬探,只不過返回的響應(yīng)中沒有具體的內(nèi)容神得,用于獲取報(bào)頭
7.CONNECT
HTTP/1.1協(xié)議中預(yù)留給能夠?qū)⑦B接改為管道方式的代理服務(wù)器
8.TRACE
回顯服務(wù)器收到的請(qǐng)求,主要用于測(cè)試或診斷偷仿。
三哩簿、響應(yīng)報(bào)文(response)
當(dāng)收到get或post等方法發(fā)來的請(qǐng)求后,服務(wù)器就要對(duì)報(bào)文進(jìn)行響應(yīng)酝静。同樣节榜,響應(yīng)報(bào)文也分為兩部分。以下為抓包截圖:
3.1注釋:
字段名意義
響應(yīng)碼/狀態(tài)碼:響應(yīng)代碼是服務(wù)器根據(jù)請(qǐng)求進(jìn)行查找后得到的結(jié)果的一種反饋别智,有1xx 2xx 3xx 4xx 5xx
server:服務(wù)器軟件版本信息--即中間件宗苍。
date:標(biāo)注了當(dāng)前服務(wù)器的時(shí)間。
connection:標(biāo)明連接關(guān)閉薄榛,抓包可以發(fā)現(xiàn)在響應(yīng)返回后服務(wù)器向客戶端發(fā)出fin包單向關(guān)閉了連接讳窟。
Expires:表示在某個(gè)時(shí)間以前可以不用重新緩存該頁(yè)面
cache-control:表示對(duì)頁(yè)面是否進(jìn)行緩存。
content-type:表示了應(yīng)答請(qǐng)求后返回的內(nèi)容類型敞恋。Content還有內(nèi)容長(zhǎng)度和內(nèi)容語言以及內(nèi)容編碼三個(gè)內(nèi)容丽啡,其中內(nèi)容長(zhǎng)度只有在請(qǐng)求報(bào)文中的connection值為keep-alive時(shí)才會(huì)用到。
Cookiecookie:是一種類似緩存的機(jī)制硬猫,它保存在一個(gè)本地的文本文件中补箍,其主要作用是在發(fā)送請(qǐng)求時(shí)將cookie放在請(qǐng)求首部中發(fā)送給服務(wù)器,服務(wù)器收到cookie后查找自己已有的cookie信息啸蜜,確定客戶端的身份馏予,然后返回相應(yīng)的頁(yè)面,cookie的方便之處在于可以保持一種已登錄的狀態(tài)盔性。
set-cookie:給出了cookie的id霞丧,過期時(shí)間以及參數(shù)path,path是表示在哪個(gè)虛擬目錄路徑下的頁(yè)面可以讀取使用該cookie冕香。如果用戶在連接中通過了服務(wù)器相應(yīng)的認(rèn)證程序蛹尝,服務(wù)器會(huì)添加一個(gè)cdb_auth到set-cookie中,這個(gè)段表示了客戶端的認(rèn)證信息悉尾。
Refresh:服務(wù)器通過Refresh頭告訴瀏覽器定時(shí)刷新瀏覽器突那。
其他為響應(yīng)信息
3.2其中涉及到狀態(tài)碼:
1**:表示接收到請(qǐng)求,繼續(xù)進(jìn)程构眯,在發(fā)送post后可以收到該應(yīng)答愕难。
2**:表示請(qǐng)求的操作成功,在發(fā)送get后返回。常見200
3**:表示重發(fā)猫缭,為了完成操作必須進(jìn)一步動(dòng)作葱弟。
4**:表示客戶端出現(xiàn)錯(cuò)誤。
5**:表示服務(wù)器出現(xiàn)錯(cuò)誤猜丹。
200 OK ?????//客戶端請(qǐng)求成功
400 Bad Request ?//客戶端請(qǐng)求有語法錯(cuò)誤芝加,不能被服務(wù)器所理解
401 Unauthorized //請(qǐng)求未經(jīng)授權(quán),這個(gè)狀態(tài)代碼必須和WWW-Authenticate報(bào)頭域一起使用
403 Forbidden ?//服務(wù)器收到請(qǐng)求射窒,但是拒絕提供服務(wù)
404 Not Found ?//請(qǐng)求資源不存在藏杖,eg:輸入了錯(cuò)誤的URL
500 Internal Server Error //服務(wù)器發(fā)生不可預(yù)期的錯(cuò)誤
503 Server Unavailable ?//服務(wù)器當(dāng)前不能處理客戶端的請(qǐng)求,一段時(shí)間后可能恢復(fù)正常