Http協議你都了解嗎?
1. HTTP協議
超文本傳輸協議(HyperText Transfer Protocol),縮寫HTTP。
通過 HTTP 或者 HTTPS 協議請求的資源由統一資源標識符(Uniform Resource Identifiers,URI)來標識。由 HTTP 客戶端發起一個請求,創建一個到服務器指定端口(默認是80端口)的 TCP連接。HTTP 服務器則在那個端口監聽客戶端的請求。一旦收到請求,服務器會向客戶端返回一個狀態,比如" HTTP/1.1 200 OK ",以及返回的內容,如請求的文件、錯誤消息、或者其它信息。
2. URI 和 URL
▐ 2.1 URI
Uniform Resource Identifier,統一資源標識符Web上可用的每種資源如HTML 文檔、圖像、視頻片段、程序等都是用URI來定位的;
URI 一般由三部分組成:
- 訪問資源的命名機制
- 存放資源的主機名
- 資源自身的名稱,由路徑表示,著重強調于資源
▐ 2.2 URL
Uniform Resource Location,統一資源定位符
URL 是 Internet 上用來描述信息資源的字符串,主要用在各種 WWW 客戶程序和服務器程序上。URL 是 URI 的一種。
采用 URL 可以用一種統一的格式來描述各種信息資源,包括文件、服務器的地址和目錄等。
URL 一般由三部組成
- 協議
- 可訪問該資源的主機IP地址(或帶有端口號)
- 主機資源的具體地址(目錄加文件名)
▐ 2.3 URL 的構成
- 協議部分:協議部分為 http:
- 域名部分:域名部分例如"www.jianshu.com",當然域名也可以用 IP 地址,IP 少 一步用DNS服務器解析
- 端口部分:域名和端口之間使用":"分隔。
- 端口不是URL必須的部分,如果端口省略,將采用默認端口號80,所以實際請求地址是http://www.jianshu.com:80
- 虛擬目錄部分:從域名后的第一個“/”開始到最后一個“/”為止,是虛擬目錄部分。虛擬目錄也不是一個URL必須的部分。
- 文件名部分:指在服務器中訪問的資源文件的路徑。
- 錨部分:從“#”開始到最后,都是錨部分,也不是必須的部分。
- 做過 html 的都知道,用于定位到頁面的滑動位置。
- 參數部分:從“?”開始到“#”為止之間的部分為參數部分,又稱搜索部分、查詢部分。例如?page=1。
3. 請求的種類
HTTP 協議中共定義了八種方法或者叫“動作”來表明對 Request-URI 指定的資源的不同操作方式。就類似操作數據庫和文件系統一樣,設計網絡的請求也是一樣。URL 用于定位了網絡資源,創造 PUT,DELETE,POST,GET 來對應增,刪,改,查操作。但是我們在實際應用中常用的也就是 get 和 post,其他請求方式也都可以通過這兩種方式間接的來實現。
GET
向指定資源發出“顯示“信息。使用GET方法只用于獲取數據,而不應該改變數據本身,即不對數據進行操作和提交信息。
POST
向指定資源提交數據,請求服務器進行處理(例如提交參數/表單,或者上傳文件)。可能會對數據進行操作和提交信心,創建資源。
PUT
向指定資源位置上傳其最新內容。
DELETE
顧名思義,請求服務器刪除 URI 所對應的資源。
HEAD
與 GET 方法一樣,都是向服務器發出指定資源的請求。只不過服務器將不傳回資源的本文部分。它的好處在于,使用這個方法可以在不必傳輸全部內容的情況下,就可以獲取其中“關于該資源的信息”(元信息或稱元數據)。
TRACE
回顯服務器收到的請求,主要用于測試或診斷。
OPTIONS
這個方法可使服務器傳回該資源所支持的所有 HTTP 請求方法。用'*'來代替資源名稱,向 Web 服務器發送 OPTIONS 請求,可以測試服務器功能是否正常運作。
CONNECT
HTTP/1.1 協議中預留給能夠將連接改為管道方式的代理服務器。通常用于 SSL 加密服務器的鏈接(經由非加密的 HTTP 代理服務器)。
4. GET 和 POST 的區別
1.參數攜帶位置不同。
GET 提交的數據會附加家 URL 之后(即把數據放在請求行中),會在地址欄中顯示,接?=傳值,多個參數用&連接。POST 提交的數據放在 HTTP 包體中,地址欄不顯示。
2.傳輸數據大小限制不同。
不同瀏覽器對 URL 的長度有限制,因此對于 GET 提交時,傳輸數據就會受到URL 長度的限制。POST 由于不是通過 URL 傳值,理論上數據不受限。
3.POST 的安全性要比 GET 的安全性高。因為瀏覽器可能對請求地址做歷史記錄的存儲,對于 GET 請求的登錄,那其他人就可以直接在 URL 上拿到你的賬號和密碼了,而 POST 拿不到參數。
5. HTTP 請求信息
客戶端發送一個 HTTP 請求到服務的請求信息包括以下格式:
請求行(request line)、請求頭(header,常用于存放 token)、空行和請求數據四個部分。
例如:
- GET /8669504-c2641e8e6eed5904.png HTTP/1.1
- Host www.jianshu.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 www.jianshu.com
- Accept-Encoding gzip, deflate, sdch
- Accept-Language zh-CN,zh;q=0.8
- name=Professional%20Ajax&publisher=lili
- 第一行請求行,用來說明請求類型,要訪問的資源以及所使用的HTTP版本。
- 第二部分,大括號之間的請求頭部,用于提交服務器的附加信息。
- 第三部分,空行,請求頭部后面的空行是必須的。
- 第四部分,請求數據也叫主體,可以添加任意的其他數據。
6. HTTP 響應信息
服務器接受請求回傳響應信息也由四分部組成:
狀態行,消息報頭,空行和響應正文。
例如:
- 第一行包括協議版本號,返回狀態碼
- 第二行為響應日期時間
- 第三行為響應消息報頭,Content-Type: 指定了 MIME 類型的 HTML(text/html),編碼類型是 UTF-8
- 響應正文,服務器返回給客戶端的文本信息。
7. HTTP 狀態碼
狀態碼有三位數字,第一數字表示當前相應的類型,各個類型有:
- 1xx消息——請求已被服務器接受,繼續處理
- 2xx成功——請求已成功被服務器接收(如見到就像親人的200,201)
- 3xx重定向——需要后續操作才能完成這一請求
- 4xx請求錯誤——客戶端錯誤:請求含有詞法錯誤或無法被執行(如見到就想暴走的404 Not Found)
- 5xx服務器錯誤——服務端錯誤:服務器在處理某個正確請求時發生錯誤(如一見到就想找后臺的500)
常見的狀態碼如下:
- 200 OK:客戶端請求成功
- 400 Bad Request:客戶端請求有語法錯誤,不能被服務器所理解
- 401 Unauthorized:請求未經授權,這個狀態代碼必須和 WWW-Authenticate 報頭域一起使用
- 403 Forbidden:服務器收到請求,但是拒絕提供服務
- 500 Internal Server Error:服務器發生不可預期的錯誤
- 503 Server Unavailable:服務器當前不能處理客戶端的請求,一段時間后可能恢復正常
8. 總結HTTP一次請求的完整過程
- 客戶端與服務端建立 TCP 連接
- 通過 TCP 套接字連接,發送 HTTP 請求
- 服務器解析請求,定位請求資源,將查詢資源然后返回 HTML 文本數據,由客戶端讀取。
- 釋放 TCP 連接
- 客戶端瀏覽器解析 HTML 內容
瀏覽器輸入網站發生的事件:
- 瀏覽器向 DNS 服務器請求解析該 URL 中的域名所對應的 IP 地址;
- 解析出 IP 地址后,根據該 IP 地址和默認端口 80,和服務器建立 TCP 連接;
- 瀏覽器發出讀取文件(URL 中域名后面部分對應的文件)的 HTTP 請求,該請求報文作為 TCP 三次握手的第三個報文的數據發送給服務器;
- 服務器對瀏覽器請求作出響應,并把對應的 html 文本發送給瀏覽器;
- 釋放 TCP 連接;
- 瀏覽器將該 html 文本并顯示內容;
以上是 Http 的全部總結,該篇文章不斷完善不斷更新。