HTTP基本架構
用一張簡單的流程圖來展示HTTP協議的基本架構,以便先有個基礎的了解。
1)Web Client可以是瀏覽器、搜索引擎等等一切基於HTTP協議發起http請求的工具。
2)Web Server可以是任何的能解析http請求,並返回給Web Client可識別的響應的服務,常見
的有apache、nginx、IIS等等web服務器。
濃縮的都是精華,看下最簡潔的HTTP交互圖:
HTTP報文結構
1)請求報文
HTTP請求報文由請求行、請求頭、空行和請求內容4個部分構成。
請求行:
由請求方法字段、URL字段、協議版本字段三部分構成,它們之間由空格隔開。常用
的請求方法有:GET、POST、HEAD、PUT、DELETE等等。
請求頭:
請求頭由key/value對組成,每行為一對,key和value之間通過冒號(:)分割。請求頭的
作用主要用於通知服務端有關於客戶端的請求信息。
典型的請求頭有:
User-Agent:生成請求的瀏覽器類型
Accept:客戶端可識別的響應內容類型列表;星號*用於按范圍將類型分組。*/*表示可
接受全部類型,type/*表示可接受type類型的所有子類型。
Accept-Language:客戶端可接受的自然語言
Accept-Encoding:客戶端可接受的的編碼壓縮格式
Accept-Charset:可接受的字符集
Host:請求的主機名,允許多個域名綁定同一IP地址
connection:連接方式(close或keeplive)
Cookie:存儲在客戶端的擴展字段
空行:
最后一個請求頭之后就是空行,用於告訴服務端以下內容不再是請求頭的內容了。
請求內容:
請求內容主要用於POST請求,與POST請求方法配套的請求頭一般有
Content-Type(標識請求內容的類型)和Content-Length(標識請求內容的長度)
2)響應報文
HTTP響應報文由狀態行、響應頭、空行和響應內容4個部分組成。
狀態行:
由HTTP協議版本、狀態碼、狀態碼描述三部分構成,它們之間由空格隔開。
狀態碼由3位數字組成,第一位標識響應的類型,常用的5大類型狀態碼如下:
1xx:表示服務器已經接收了客戶端的請求,客戶端可以繼續發送請求
2xx:表示服務器已經成功接收到請求並進行處理
3xx:表示服務器要求客戶端重定向
4xx:表示客戶端的請求有非法內容
5xx:表示服務器未能正常處理客戶端的請求而出現意外的錯誤
常見狀態碼說明:
200 OK:表示客戶端請求成功
400 Bad Request:表示客戶端請求有語法錯誤,不能被服務器端解析
401 Unauthonzed:表示請求未經授權,該狀態碼必須與WWW-Authenticate報文頭一起使用
404 Not Found:請求的資源不存在,例如輸入錯誤的url
500 Internal Server Error:表示服務器發生了不可預期的錯誤,導致無法完成客戶端的請求
503 Service Unavailable:表示服務器當前不能處理客戶端的請求,在一段時間后服務器可能恢復正常。
響應頭:
一般情況下,響應頭會包含以下,甚至更多的信息。
Location:服務器返回給客戶端,用於重定向到新的位置
Server:包含服務器用來處理請求的軟件信息及版本信息
Vary:標識不可緩存的請求頭列表
Connection:連接方式。
對於請求端來講:close來告訴服務端,斷開連接,不用等待后續的請求了。keeplive則是告訴服務端,
在完成本次請求的響應后,保持連接,等待本次連接后的后續請求。
對於響應端來講:close表示連接已經關閉。keeplive則表示連接保持中,可以繼續處理后續請求。
Keep-Alive表示如果請求端保持連接,則該請求頭部信息表明期望服務端保持連接多長時間(秒),
例如300秒,應該這樣寫Keep-Alive:300
空行:
最后一個響應頭之后就是空行,用於告訴請求端以下內容不再是響應頭的內容了。
響應內容:
服務端返回給請求端的文本信息。
HTTP報文示例
在Firefox下用firebug隨意抓取一個HTTP包和上文的報文結構做下一一對應的關系圖,以便了解實際的
包和標准報文結構的對應關系。