前言
http的概念,我相信只要是搞互聯網的都不陌生,好比說我,用http,用三方的開源庫調調接口,通常人均可以很順利作到,可是真正別人問我一些http實質性相關的一些東西的時候,每每就懵逼,更別談參加面試了,既然這樣,那就學習,記錄吧。html
HTTP方法有哪些
http請求方法有五種:POST,GET,HEAD,PUT,DELETE,TRACE,OPTIONS,CONNECTweb
- GET:向服務器發請求,但願獲得一些數據,通常作單向的獲取數據,很簡單。
- POST:也是向服務器發送請求,這時候咱們是post一個表單,數據比較多,例如上傳文件。
- HEAD:和get差很少,只是返回的數據沒有body,僅僅返回的是數據頭部信息。一個典型的使用場景,就是當咱們要下載一個文件的時候先判斷一下該文件的大小,這時候直接head一下就能夠了。
- PUT:add數據到服務器而且替換服務器中指定的資源。
- DELETE:用於刪除服務器指定的資源。
- TRACE:顯示服務器收到的請求信息,好比丟包率等,主要用於診斷和測試。
POST和GET比較
- 請求數據傳輸方式不一樣:GET是把請求信息放在url中,好比name,id等信息,POST是把包裝在請求體中,通常是form的形式提交給服務器。
/books/?sex=man&name=Professional HTTP/1.1
複製代碼
這就是一個get請求,咱們把一些數據信息直接放在url的後面。面試
- 安全性不一樣:POST請求的數據在請求的body裏面,而GET請求的數據在URL中,咱們經過緩存就能夠很容易拿到請求信息。
- 數據類型不一樣:GET請求只容許是ASCII字符,POST無限制。好比在請求數據的時候纔有GET請求,查看URL當裏面有中文的時候裏面會出現不少%%%這種符號,這都是通過base64轉換了的,由於get請求數據只能是ASCII字符,so。。。
- 提交的數據長度不一樣:GET提交的數據長度是有限制的(這個限制得看瀏覽器本身了),POST是表單,因此沒有限制。
- 特性:相對服務器來講GET請求更加安全,這裏的安全是指 1.冪等:客戶端發送一次和發送屢次請求效果同樣,不會形成服務器數據更改。 2,客戶端發送的數據不會改變服務器的狀態(咱們僅僅想獲得數據,不會修改服務器數據),冪等是個很重要的概念,能夠記住一下。
POST和PUT比較
這二者都是向服務器新增資源,區別在哪?最重要的區別就是冪等。PUT每每用於修改單一資源,而POST是向資源集合裏面加數據。好比:我如今想修改我博客的頭像爲小貓,那麼我就是發個請求,去修改頭像小貓,哪怕你提交一萬次,你的頭像最後仍是小貓,這就是冪等;然而若是你想發一篇博客,那麼你每次提交一次那文章確定是新增一篇咯,非冪等。瀏覽器
總結:PUT是冪等,POST是非冪,這也是二者最最重要的區別。
複製代碼
請求消息Request
看一個抓包數據緩存
GET /562f25980001b1b106000338.jpg HTTP/1.1
Host img.mukewang.com
User-Agent Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.106 Safari/537.36
Accept image/webp,image/*,*/*;q=0.8
Referer http://www.imooc.com/
Accept-Encoding gzip, deflate, sdch
Accept-Language zh-CN,zh;q=0.8
複製代碼
1.請求行:包含請求類型GET,須要請求的資源/562f25980001b1b106000338.jpg,HTTP的版本號 2.請求頭部:包含目的地址,使用的瀏覽器代理,編碼等信息。 3.空行 4.請求數據:這裏包含咱們的請求數據name,id啥的。 安全
響應消息Respone
狀態碼
2XX 成功bash
- 200 OK,表示從客戶端發來的請求在服務器端被正確處理
- 201 Created 請求已經被實現,並且有一個新的資源已經依據請求的須要而創建
- 202 Accepted 請求已接受,可是還沒執行,不保證完成請求
- 204 No content,表示請求成功,但響應報文不含實體的主體部分
- 206 Partial Content,進行範圍請求
3XX 重定向服務器
- 301 moved permanently,永久性重定向,表示資源已被分配了新的 URL
- 302 found,臨時性重定向,表示資源臨時被分配了新的 URL
- 303 see other,表示資源存在着另外一個 URL,應使用 GET 方法丁香獲取資源
- 304 not modified,表示服務器容許訪問資源,但因發生請求未知足條件的狀況
- 307 temporary redirect,臨時重定向,和302含義相同
4XX 客戶端錯誤tcp
- 400 bad request,請求報文存在語法錯誤
- 401 unauthorized,表示發送的請求須要有經過 HTTP 認證的認證信息
- 403 forbidden,表示對請求資源的訪問被服務器拒絕
- 404 not found,表示在服務器上沒有找到請求的資源
- 408 Request timeout, 客戶端請求超時
- 409 Confict, 請求的資源可能引發衝突
5XX 服務器錯誤post
- 500 internal sever error,表示服務器端在執行請求時發生了錯誤
- 501 Not Implemented 請求超出服務器能力範圍,例如服務器不支持當前請求所須要的某個功能,或者請求是服務器不支持的某個方法
- 503 service unavailable,代表服務器暫時處於超負載或正在停機維護,沒法處理請求
- 505 http version not supported 服務器不支持,或者拒絕支持在請求中使用的 HTTP 版本
Keep-Alive幹嗎的
在http1.0時代,每次發送http請求都要經歷tcp的握手建立鏈接,這種操做是很耗時的,也許傳送數據的時間尚未建立鏈接的時間長,這種狀況就得不償失了,因此就有了Keep-Alive,它告訴http此次請求結束後暫時不要關閉鏈接,等待有後續數據傳送直接利用現有鏈接就行。
HTTP工做原理--在瀏覽器地址欄鍵入URL,按下回車後的流程
- 1.瀏覽器首先根據url解析dns服務器中對應的ip地址。
- 2.根據ip地址和端口號,建立web鏈接。
- 3.瀏覽器發送數據包給服務器。
- 4.服務器根據數據包解析出數據,而後提取數據,定位資源,返回給客戶端,而且釋放資源。
- 5.客戶端拿到資源後,先判斷是否正常返回,而後解析出對應的html數據。
- 6,完畢,關閉資源。
HTTPS如何保證安全
https主要就是保證數據在鏈路上傳播安全的,主要原理採用:對稱加密+非對稱加密+CA技術。奇怪了,爲啥採用這麼複雜的方式啊。咱們作個簡單的總結性的分析:
- 對稱加密解密數據速度很快。
- 非對稱加密更加安全,可是效率不行。
- CA就是第三方的認證,防止密鑰被篡改。
https原理:加密解密真正的數據採用的是對稱加密,可是對稱加密的密鑰(密鑰A)通訊雙方都是同樣的,這是很不安全的,因此咱們採用了非對稱加密對密鑰A進行加密,此次加密僅僅是爲了傳輸密鑰A、只會傳一次,因此效率問題能夠忽略,至於CA技術嘛,要是第三方假冒了怎麼辦,這裏就有個數字簽名技術對CA作個認證咯,這樣就相對很安全了。