在許多大公司的面試中,常常會重點考察面試者的計算機基礎知識。因此對於在計算機網絡、數據結構、操做系統上花費更多的時間和精力,是徹底值得的。HTTP 做爲應用最爲普遍的網絡協議,不論前端和後端都須要常常接觸。最近決定對 HTTP 進行了一些學習,因此整理一份筆記並分享給你們。html
HTTP (HyperText Transfer Protocol) 一般被咱們稱爲超文本傳輸協議,又譯爲超文本轉移協議。它的命名如何,不須要過於糾結,咱們更應該重視它的內容。前端
OSI | TCP/IP | |
---|---|---|
應用層 表示層 會話層 |
應用層 | |
傳輸層 | 傳輸層 | |
網絡層 | 網絡層 | |
數據鏈路層 物理層 |
鏈路層 |
HTTP 是 TCP/IP 協議內部的一個子集,在瞭解它以前咱們須要先了解一下 TCP/IP 相關的知識。TCP/IP(Transmission Control Protocol/Internet Protocol)協議分爲應用層、傳輸層、網絡層、鏈路層四層,我簡單的來總結舉例一下。面試
應用層
應用層向用戶提供一系列的應用服務。
好比咱們熟悉的 DNS(Domain Name Service,域名解析)、FTP(File Transfer Protocol,文件傳輸協議),固然還有咱們要講的 HTTP 協議。
有時在 App Store
沒法下載應用時,就常常會把 DNS 設置爲谷歌的 8.8.8.8
或者國內的 114.114.114.114
,這些都是比較常見的服務。後端
傳輸層
傳輸層提供鏈接兩臺計算機之間的數據傳輸。
傳輸層有兩種協議:
TCP(Transmission Control Protocol,傳輸控制協議)
UDP(User Datagram protocol,用戶數據報協議)瀏覽器
網絡層
網絡層規定了經過什麼樣的方式將數據包傳遞給對方。
網絡層協議的表明包括:
IP(Internet Protocol,互聯網協議)
ICMP(Internet Control Message Protocol,互聯網消息控制協議) 緩存
由於 IP 並非徹底可靠,沒法保證數據被送達。因此須要 ICMP 傳輸出錯報告控制信息。ICMP 最著名的應用應該就是 ping 了,好比咱們上不去某個網站,就能夠在終端輸入測試一下。服務器
ping www.baidu.com // 而後就能夠看到一些返回值 PING www.a.shifen.com (180.149.132.151): 56 data bytes 64 bytes from 180.149.132.151: icmp_seq=0 ttl=55 time=31.431 ms Request timeout for icmp_seq 1 64 bytes from 180.149.132.151: icmp_seq=2 ttl=55 time=30.530 ms 64 bytes from 180.149.132.151: icmp_seq=3 ttl=55 time=30.233 ms
鏈路層
鏈路層用來連接網絡的硬件部分。
網絡層傳過來的數據在這裏被加工成了可被物理層傳輸的結構包——幀。幀中包括 MAC 地址(Media Access Control)和一些其餘信息。放一幅在網上找的圖給你們展現一下。網絡
三次握手數據結構
這個例子簡單總結一下,深刻的話也寫不完(攤手)。app
方法 | 說明 | |
---|---|---|
GET | 獲取資源 | |
POST | 傳輸實體主體 | |
PUT | 傳輸替換目標資源 | |
DELETE | 刪除目標資源 | |
HEAD | 獲取報文首部 | |
OPTIONS | 獲取支持的方法 |
GET 與 POST 的區別
這也算是面試比較常問的問題了,這裏放上一個表格。
GET | POST | ||
---|---|---|---|
後退按鈕/刷新 | 無害 | 數據會被從新提交(瀏覽器會提示) | |
書籤/緩存/歷史 | √ | X | |
編碼類型 | application/x-www-form-urlencoded | application/x-www-form-urlencoded 或 multipart/form-data。爲二進制數據使用多重編碼 | |
數據長度限制 | URL 的最大長度是 2048 個字符 | 無限制 | |
數據類型限制 | 只容許 ASCII 字符 | 無限制 | |
可見性 | 數據在 URL 中對全部人可見、請求會保存在歷史記錄 | 數據保存在主體中、請求不會保存在歷史記錄 |
PUT 請求
PUT
與 POST
方法的區別在於,PUT方法是冪等的:調用一次與連續調用屢次是等價的(即沒有反作用),而連續調用屢次POST方法可能會有反作用,好比將一個訂單重複提交屢次。
DELETE 請求
若是 DELETE
方法成功執行,那麼可能會有如下幾種狀態碼:
202
(Accepted) 表示請求的操做可能會成功執行,可是還沒有開始執行。204
(No Content) 表示操做已執行,可是無進一步的相關信息。200
(OK) 表示操做已執行,而且響應中提供了相關狀態的描述信息。HEAD 請求
HEAD 請求就如同前面表格所說的是獲取報文首部,該請求方法的一個使用場景是在下載一個大文件前先獲取其大小再決定是否要下載, 以此能夠節約帶寬資源。
OPTIONS 請求
OPTIONS 請求就是用於獲取目的資源所支持的通訊選項,平時在作 ionic、Angular 的時候,它就常常會在請求前自動調用一個 OPTIONS 方法。
簡單的說,HTTP 狀態碼就是描述返回的請求結果。
這裏仍是拿一個表格展現一下,因爲種類比較多,因此只列舉種類,不進行徹底列舉。
類別 | 緣由 | ||
---|---|---|---|
1xx | Informational(信息性狀態碼) | 接收的請求正在處理 | |
2xx | Success(成功狀態碼) | 請求正常處理完畢 | |
3xx | Redirection(重定向狀態碼) | 須要進行附加操做以完成請求 | |
4xx | Client Error(客戶端錯誤狀態碼) | 服務器沒法處理請求 | |
5xx | Server Error(服務端錯誤狀態碼) | 服務器處理請求出錯 |
HTTP 報文的首部字段,主要是用來傳遞額外的重要信息。
前面講了這麼多,這裏結合請求方法、狀態碼等舉一個例子。
發起請求:
GET / HTTP/1.1 Request URL: https://www.baidu.com/favicon.ico Host: www.baidu.com Accept-Language: zh-CN
服務端返回:
HTTP/1.1 200 OK Date: Sat, 07 Apr 2018 02:17:48 GMT Server: Apache Last-Modified: Mon, 02 Apr 2018 09:39:34 GMT Accept-Ranges: bytes Content-Length: 984 Content-Type: image/x-icon
如今咱們分析一下這個例子。
發起請求
// 請求方法 / HTTP 版本號 GET / HTTP/1.1 // 請求地址 Request URL: https://www.baidu.com/favicon.ico // 請求資源所在服務器 Host: www.baidu.com // 優先選擇的語言(天然語言) Accept-Language: zh-CN
服務端返回
// HTTP 版本、HTTP 狀態碼 200 HTTP/1.1 200 OK // 建立報文的日期 Date: Sat, 07 Apr 2018 02:17:48 GMT // HTTP 服務器的安裝信息 Server: Apache // 資源的最後修改時間 Last-Modified: Mon, 02 Apr 2018 09:39:34 GMT // 支持字節範圍請求 Accept-Ranges: bytes // 實體主體的大小 Content-Length: 984 // 實體主體的類型 Content-Type: image/x-icon
HTTP 首部字段種類很是多,該例子舉例了經常使用的一部分,想了解更多能夠研究 MDN HTTP Headers 文檔 。
目前裏面中文翻譯不夠完整,翻譯水平高的朋友能夠點擊幫忙完善一下,爲開源事業出一份力:)
此次就總結到這裏了,因爲水平有限,不免有些許紕漏。有什麼錯誤請指出,不勝感激。
爲什麼HTTP被翻譯爲「超文本傳輸協議」是一次歷史上的重大翻譯錯誤?
HTTP 協議入門-阮一峯
TCP/IP 協議 百度百科
ping 原理與ICMP協議
漫談網絡通訊——從OSI網絡模型到TCP/IP協議族
HTTP 方法-w3school
HTTP 請求方法-MDN
《圖解HTTP》