http協議總結
一、www的簡單構成:
- html:文本如何標記
- http:文本在不同機子之間如何傳輸
- url:標記如何定位
二、uri和url
- uri:統一資源標示符,由某種協議表示的資源的定位符,協議可以是http,ftp,mailto,urn。其表示的資源可以是絕對路徑也可以是相對路徑。其核心是資源的標識。
- mailto:zzy@example.com
- http://www.cnblogs.com/zengzy/
- /index.html
- urn:isbn:0-486-27557-4
- url:統一資源定位符,是一種具體的uri,表示能夠在互聯網中使用從而能定位到資源的標識符,必須是絕對路徑。其核心是定位
。
三、簡單的http
- 請求報文結構,下面這個請求報文的意思是:請求hacker.jp這台主機上的form/entry這個資源
- 響應報文結構
四、http八大方法
- 八大方法
- get:從指定的資源請求數據,即查找資源
- post:向指定資源提交需要被處理的數據,即修改資源
- put:上傳uri標識的資源到某個主機
- delete:刪除uri指定的資源
- head:與get方法相同,但是不返回實體的主體,只返回首部
- trace:路徑追蹤,讓http服務器端將請求報文環回給客戶端
- connect:要求在與代理服務器通信時建立隧道,用隧道協議進行tcp通信。主要是使用SSL(Secure Sockets Layer,安全套階層)和TLS(Transport Layer Security,傳輸層安全)協議把通信內容加密后經網絡隧道傳輸。
格式:CONNECT 代理服務器名:端口號 HTTP 版本
eg:
請求:CONNECT proxy.hackr.jp:80 HTTP/1.1
相應:HTTP/1.1 200 OK(之后進入網絡隧道) - options:http服務器返回支持的http方法
- get與post區別
GET | POST | |
---|---|---|
后退按鈕/刷新 | 無害 | 數據會被重新提交(瀏覽器應該告知用戶數據會被重新提交)。 |
書簽 | 可收藏為書簽 | 不可收藏為書簽 |
緩存 | 能被緩存 | 不能緩存 |
編碼類型 | application/x-www-form-urlencoded | application/x-www-form-urlencoded 或 multipart/form-data。為二進制數據使用多重編碼。 |
歷史 | 參數保留在瀏覽器歷史中。 | 參數不會保存在瀏覽器歷史中。 |
對數據長度的限制 | 是的。當發送數據時,GET 方法向 URL 添加數據;URL 的長度是受限制的(URL 的最大長度是 2048 個字符)。 | 無限制。 |
對數據類型的限制 | 只允許 ASCII 字符。 | 沒有限制。也允許二進制數據。 |
安全性 | 與 POST 相比,GET 的安全性較差,因為所發送的數據是 URL 的一部分。 在發送密碼或其他敏感信息時絕不要使用 GET ! |
POST 比 GET 更安全,因為參數不會被保存在瀏覽器歷史或 web 服務器日志中。 |
可見性 | 數據在 URL 中對所有人都是可見的。 | 數據不會顯示在 URL 中。 |
五、http報文格式
1).請求報文: 2).響應報文
請求行 狀態行
請求首部字段 響應首部字段
通用首部字段 通用首部字段
實體首部字段 實體首部字段
空行(用CR+LF表示,回車換行) 空行(用CR+LF表示,回車換行)
報文主體 報文主體
可見請求報文和響應報文只有綠色部分是不一樣的。
3).請求行:請求方法 URI http版本號 get /index.html HTTP/1.1
4).狀態行:http版本號 狀態碼 原因短語 HTTP/1.1 200 ok
5).常見的狀態碼:
類型 | 原因短語 | |
1xx | Informational,信息性的狀態碼 | 接受的請求正在處理 |
2xx | Success,成功狀態碼 | 請求正常處理完畢 |
3xx | Redirection,重定向狀態碼 | 可能需要新的請求才能能完成操作 |
4xx | Client Error,客戶端錯誤 | 錯誤的客戶端請求,uri拼寫錯誤等 |
5xx | Server Error,服務器端錯誤 | 服務器出現錯誤,可能是web的bug等 |
- 2xx:
200 Ok:表示請求正常處理
204 No Content :表示服務器成功處理請求,但返回的相應報文中不含實體的主體部分,就是上面報文結構中的紅色部分
206 Partial Content:表示客戶端進行了范圍請求,而服務器成功執行了這部分請求
- 3xx:
301 Moved Permanently:永久性重定向。也就是說原來請求的uri被分配了新的uri,以后就使用這個新的uri。如果之前的uri被保存為了書簽,那么把uri替換為新的uri
302 Found:臨時性的重定向。與301不同之處在於不更新書簽等。其在收到302后馬上用新的uri進行第二次請求,並將方法改為get,但規范本身是禁止這么做的,只是大多數瀏覽器都沒有遵守規范。
303 See Other:表示請求的資源有多個uri,明確規定應使用get方法定向獲取請求的資源。在現在的使用中302與其有一致的含義。
307 Temporary Redirect:與302有一致的含義,禁止post方法轉成get方法
304 Not Modified:與附帶條件的請求配合使用(例如if-None-Match,if-Range等,下文請求首部字段將會講到),表示請求的資源找到了,但是沒有滿足請求的附帶條件。
- 4xx
400 Bad Request:表示請求報文中存在語法錯誤,當發生錯誤是,需要修改請求的內容再次發送請求,另外,客戶端瀏覽器會像對待200 0k一樣對待該狀態碼
401 Unauthorized:表示發送的請求需要通過HTTP認證的認證信息,響應報文必須包含一個使用與被請求資源的www-authenticate首部用以質詢用戶信息,當瀏覽器初次接收401時,會彈出認證用的窗口
403 Forbidden
404 Not Found
- 5xx
500 Internal Server Error:表示服務器端在執行請求時發生了錯誤,也有可能是web的bug
503 Service Unavailable:服務器可能正超負荷或暫停維護無法訪問
6)HTTP的四種首部類型
四大首部類型分別是通用首部字段,請求首部字段,響應首部字段,實體首部字段
- 通用首部字段:指既能在請求報文中使用,又能在響應報文中使用的字段
-
- Cache-Control:控制緩存的行為,常見的值有No-Cache,No-Store。No-Cache:請求報文出現它表示不希望獲取緩存過的資源,響應報文出現它表示不希望代理緩存請求,No-Store表示不緩存請求或響應的任何一部分
- Connection:控制連接的管理,常見的值為Keep-Alive
- Date:報文的創建日期
- Trailer:表示實現說明在報文主體后記錄了哪些首部字段,看下面這個例子
HTTP/1.1 200 OK
....
Trailer:Expires
...
(報文主體)
Expires:Tue, 28 Sep 2015 22:13:34 GMT
- Transfer-Encoding:報文主體的傳輸編碼方式(並沒有搞明白和請求首部字段Te有什么區別)
- Upgrade:向服務器指定某種傳輸協議以便服務器進行轉換
- Via:代理服務器相關的信息,報文經過代理或網關時,會把該代理或網關信息寫入via字段
- 請求首部字段
Accept首部:
Accept : 瀏覽器可以處理的媒體類型
Accept-Charset:優先的字符集,比如utf-8,gb2312,gbk等等
Accept-Encoding:優先的內容編碼,比如deflate,zlib,gzip等
Accept-Language:優先的語言,en-us等
If首部:
If-Match:比較實體標記Etag,服務器端會給每一個資源標記Etag,客戶端請求的時候可能帶上此條件,表示服務器端有If-Match值對應的資源就處理請求
If-None-Match:與If-Match對應,表示服務器端沒有其對應的值就處理請求
If-Modified-Since:如果服務器資源自某個時間點之后修改了,就處理該請求
If-Unmodified-Since:如果服務器資源自某個時間點之后沒有改動,就處理該請求
If-Range:告知服務器若制定的If-Range字段值(Etag或者時間)和請求資源的Etag和時間相同時,則作為范圍請求處理,反之,返回全體資源。請看下面這個例子:
其他:
Range:表示請求的字節范圍
User-Agent:Http客戶端程序的信息
Max-Forwards:最大的傳輸逐跳數,可以有Traces方法配合使用
Host:請求的資源所在的服務器
From:用戶的電子郵件
Te:表示優先的傳輸編碼,比如deflate,gzip等,與Accept-Encoding不一樣,A-E是指能接受的壓縮方式,而Te是指請求報文實體的壓縮方式
- 響應首部字段
Accept-Ranges:表示服務器端是否接受范圍請求
Age:告知客戶端服務器端多長時間之前創建了請求,單位是秒
Etag:服務器端資源的標識
Location:重定向后uri
Proxy-Authenticate:服務器端要求代理的認證信息
WWW-Authentivate:服務器端要求客戶端的認證信息
Retry-After:告知客戶端再次發起請求的時間
Server:服務器端的信息
- 實體首部字段
Content首部
Content-Encoding:實體使用的編碼
Content-Language:實體的自然語言
Content-Length:實體的大小
Content-MD5:實體的MD5校驗碼
Content-Range:實體的字節范圍
Conten-Type:實體的媒體類比
其他首部
Expire:實體的過期日期
Allow:允許的方法,可與Options方法共同使用
參考資料:
1.《圖解HTTP》,上野宣著,人民郵電出版社
2.http://www.w3school.com.cn/tags/html_ref_httpmethods.asp