前言
從事性能測試必不可繞過的就是協(xié)議呆馁,對基本知識的了解也還,還是深入掌握協(xié)議的機制豌蟋,都能讓你在從事性能測試實施時顯得更加順手驶俊。
下面我們就HTTP協(xié)議及性能測試過程必須掌握的一些分析工具來進行分享。
重點分享性能測試實施過程中必須掌握的關(guān)鍵技術(shù)嬉探、工具擦耀。更細(xì)節(jié)的請參考HTTP相關(guān)書籍或RFC文檔。
HTTP基本架構(gòu)
下面我們用一張簡單的流程圖來展示HTTP協(xié)議基本架構(gòu)涩堤,以便大家先有個基本的了解眷蜓。
- Web Client可以是瀏覽器、搜索引擎定躏、機器人等等一切基于HTTP協(xié)議發(fā)起http請求的工具账磺。
- Web Server可以是任何的能解析HTTP請求,并返回給Web Client可識別的響應(yīng)的服務(wù)痊远,常見的有apache垮抗、nginx、IIS等等web服務(wù)器碧聪。
濃縮就是精華冒版,看下最簡潔的HTTP交互圖:
HTTP報文結(jié)構(gòu)
- 請求報文
HTTP請求報文由請求行、請求頭逞姿、空行和請求內(nèi)容4個部分構(gòu)成辞嗡。
如下圖所示:
下面對上圖進行簡單的分析:
請求行
由請求方法字段、URL字段滞造、協(xié)議版本字段三部分構(gòu)成续室,它們之間由空格隔開。常用的請求方法有:GET谒养、POST挺狰、HEAD、PUT、DELETE丰泊、OPTIONS薯定、TRACE、CONNECT瞳购。
請求頭
請求頭由key/value對組成话侄,每行為一對,key和value之間通過冒號(:)分割学赛。請求頭的作用主要用于通知服務(wù)端有關(guān)于客戶端的請求信息年堆。
典型的請求頭有:
User-Agent:生成請求的瀏覽器類型
Accept:客戶端可識別的響應(yīng)內(nèi)容類型列表;星號*
用于按范圍將類型分組罢屈。*/*
表示可接受全部類型嘀韧,type/*
表示可接受type類型的所有子類型。
Accept-Language: 客戶端可接受的自然語言
Accept-Encoding: 客戶端可接受的編碼壓縮格式
Accept-Charset: 可接受的字符集
Host: 請求的主機名缠捌,允許多個域名綁定同一IP地址
connection:連接方式(close或keeplive)
Cookie: 存儲在客戶端的擴展字段
空行
最后一個請求頭之后就是空行,用于告訴服務(wù)端以下內(nèi)容不再是請求頭的內(nèi)容了译蒂。
請求內(nèi)容
請求內(nèi)容主要用于POST請求曼月,與POST請求方法配套的請求頭一般有Content-Type(標(biāo)識請求內(nèi)容的類型)和Content-Length(標(biāo)識請求內(nèi)容的長度)
- 響應(yīng)報文
HTTP響應(yīng)報文由狀態(tài)行、響應(yīng)頭柔昼、空行和響應(yīng)內(nèi)容4個部分構(gòu)成哑芹。
如下圖所示:
下面對響應(yīng)報文格式進行簡要的分析說明:
狀態(tài)行
由HTTP協(xié)議版本、狀態(tài)碼捕透、狀態(tài)碼描述三部分構(gòu)成聪姿,它們之間由空格隔開。
狀態(tài)碼由3位數(shù)字組成乙嘀,第一位標(biāo)識響應(yīng)的類型末购,常用的5大類狀態(tài)碼如下:
1xx:表示服務(wù)器已接收了客戶端的請求,客戶端可以繼續(xù)發(fā)送請求
2xx:表示服務(wù)器已成功接收到請求并進行處理
3xx:表示服務(wù)器要求客戶端重定向
4xx:表示客戶端的請求有==非法內(nèi)容==
5xx:標(biāo)識服務(wù)器未能正常處理客戶端的請求而出現(xiàn)意外錯誤
常見狀態(tài)碼說明:
200 OK: 表示客戶端請求成功
400 Bad Request: 表示客戶端請求有語法錯誤虎谢,不能被服務(wù)器端解析
401 Unauthonzed: 表示請求未經(jīng)授權(quán)盟榴,該狀態(tài)碼必須與WWW-Authenticate報文頭一起使用
404 Not Found:請求的資源不存在,例如輸入了錯誤的url
500 Internal Server Error: 表示服務(wù)器發(fā)生了不可預(yù)期的錯誤婴噩,導(dǎo)致無法完成客戶端的請求
503 Service Unavailable:表示服務(wù)器當(dāng)前不能處理客戶端的請求擎场,在一段時間后服務(wù)器可能恢復(fù)正常
響應(yīng)頭
一般情況下,響應(yīng)頭會包含以下几莽,甚至更多的信息迅办。
Location:服務(wù)器返回給客戶端,用于重定向到新的位置
Server: 包含服務(wù)器用來處理請求的軟件信息及版本信息
Vary:標(biāo)識不可緩存的請求頭列表
Connection: 連接方式章蚣。
對于==請求端==來講:close是告訴服務(wù)端站欺,斷開連接,不用等待后續(xù)的求請了。keeplive則是告訴服務(wù)端镊绪,在完成本次請求的響應(yīng)后匀伏,保持連接,等待本次連接后的后續(xù)請求蝴韭。
對于==響應(yīng)端==來講:close表示連接已經(jīng)關(guān)閉够颠。keeplive則表示連接保持中,可以繼續(xù)處理后續(xù)請求榄鉴。Keep-Alive表示如果請求端保持連接履磨,則該請求頭部信息表明期望服務(wù)端保持連接多長時間(秒),例如300秒庆尘,應(yīng)該這樣寫Keep-Alive: 300
空行
最后一個響應(yīng)頭之后就是空行剃诅,用于告訴請求端以下內(nèi)容不再是響應(yīng)頭的內(nèi)容了。
響應(yīng)內(nèi)容
服務(wù)端返回給請求端的文本信息驶忌。
HTTP報文示例
在這里我們在Firefox下用firebug隨意抓取一個HTTP包和上文的報文結(jié)構(gòu)做下一一對應(yīng)關(guān)系圖矛辕,以便大家了解實際的包和標(biāo)準(zhǔn)報文結(jié)構(gòu)的對應(yīng)關(guān)系。
總結(jié)
對于HTTP協(xié)議的交互過程這里就不再進行說明了付魔,大家可以搜索下相關(guān)的資料進行學(xué)習(xí)聊品,上述的內(nèi)容請務(wù)必熟練掌握、深刻了解几苍。更詳細(xì)的內(nèi)容推薦大家學(xué)習(xí)RFC 2616(http協(xié)議1.1版本翻屈,有中文版本)