在許多大公司的面試中霸琴,經常會重點考察面試者的計算機基礎知識闯第。所以對于在計算機網絡、數據結構旺聚、操作系統(tǒng)上花費更多的時間和精力织阳,是完全值得的眶蕉。HTTP 作為應用最為廣泛的網絡協議砰粹,不論前端和后端都需要經常接觸。最近決定對 HTTP 進行了一些學習造挽,所以整理一份筆記并分享給大家碱璃。
HTTP (HyperText Transfer Protocol) 通常被我們稱為超文本傳輸協議,又譯為超文本轉移協議饭入。它的命名如何嵌器,不需要過于糾結,我們更應該重視它的內容谐丢。
HTTP 與 TCP/IP
OSI 模型與 TCP/IP 模型對比
OSI | TCP/IP |
---|---|
應用層 表示層 會話層 |
應用層 |
傳輸層 | 傳輸層 |
網絡層 | 網絡層 |
數據鏈路層 物理層 |
鏈路層 |
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鸠补,用戶數據報協議)
網絡層
網絡層規(guī)定了通過什么樣的方式將數據包傳遞給對方萝风。
網絡層協議的代表包括:
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)和一些其他信息诅愚。放一幅在網上找的圖給大家展示一下寒锚。
一個訪問百度網站的例子
- 在瀏覽器輸入 http://www.baidu.com。
- DNS 通過你輸入的地址违孝,找到百度的 IP 地址 14.215.177.38刹前。
- 通過 ARP 協議尋找 MAC 地址,建立 TCP 連接雌桑。
- 三次握手
- 發(fā)送端:發(fā)送帶有 SYN 的數據包
- 接收端:應答喇喉,發(fā)送帶有 SYN/ACK 的數據包
- 發(fā)送端:應答,發(fā)送帶有 ACK 的數據包
- 通過返回的數據包顯示網頁
這個例子簡單總結一下校坑,深入的話也寫不完(攤手)拣技。
常見的 HTTP 方法
方法 | 說明 |
---|---|
GET | 獲取資源 |
POST | 傳輸實體主體 |
PUT | 傳輸替換目標資源 |
DELETE | 刪除目標資源 |
HEAD | 獲取報文首部 |
OPTIONS | 獲取支持的方法 |
常見方法分析
GET 與 POST 的區(qū)別
這也算是面試比較常問的問題了,這里放上一個表格耍目。
GET | POST | |
---|---|---|
后退按鈕/刷新 | 無害 | 數據會被重新提交(瀏覽器會提示) |
書簽/緩存/歷史 | √ | X |
編碼類型 | application/x-www-form-urlencoded | application/x-www-form-urlencoded 或 multipart/form-data膏斤。為二進制數據使用多重編碼 |
數據長度限制 | URL 的最大長度是 2048 個字符 | 無限制 |
數據類型限制 | 只允許 ASCII 字符 | 無限制 |
可見性 | 數據在 URL 中對所有人可見、請求會保存在歷史記錄 | 數據保存在主體中制妄、請求不會保存在歷史記錄 |
PUT 請求
PUT
與 POST
方法的區(qū)別在于掸绞,PUT方法是冪等的:調用一次與連續(xù)調用多次是等價的(即沒有副作用),而連續(xù)調用多次POST方法可能會有副作用,比如將一個訂單重復提交多次衔掸。
DELETE 請求
如果 DELETE
方法成功執(zhí)行烫幕,那么可能會有以下幾種狀態(tài)碼:
- 狀態(tài)碼
202
(Accepted) 表示請求的操作可能會成功執(zhí)行,但是尚未開始執(zhí)行敞映。 - 狀態(tài)碼
204
(No Content) 表示操作已執(zhí)行较曼,但是無進一步的相關信息。 - 狀態(tài)碼
200
(OK) 表示操作已執(zhí)行振愿,并且響應中提供了相關狀態(tài)的描述信息捷犹。
HEAD 請求
HEAD 請求就如同前面表格所說的是獲取報文首部,該請求方法的一個使用場景是在下載一個大文件前先獲取其大小再決定是否要下載, 以此可以節(jié)約帶寬資源冕末。
OPTIONS 請求
OPTIONS 請求就是用于獲取目的資源所支持的通信選項萍歉,平時在做 ionic、Angular 的時候档桃,它就經常會在請求前自動調用一個 OPTIONS 方法枪孩。
HTTP 狀態(tài)碼
簡單的說,HTTP 狀態(tài)碼就是描述返回的請求結果藻肄。
這里還是拿一個表格展示一下蔑舞,由于種類比較多,所以只列舉種類嘹屯,不進行完全列舉攻询。
類別 | 原因 | |
---|---|---|
1xx | Informational(信息性狀態(tài)碼) | 接收的請求正在處理 |
2xx | Success(成功狀態(tài)碼) | 請求正常處理完畢 |
3xx | Redirection(重定向狀態(tài)碼) | 需要進行附加操作以完成請求 |
4xx | Client Error(客戶端錯誤狀態(tài)碼) | 服務器無法處理請求 |
5xx | Server Error(服務端錯誤狀態(tài)碼) | 服務器處理請求出錯 |
HTTP 報文首部字段
HTTP 報文的首部字段,主要是用來傳遞額外的重要信息州弟。
一個簡單的請求例子
前面講了這么多钧栖,這里結合請求方法、狀態(tài)碼等舉一個例子呆馁。
發(fā)起請求:
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
現在我們分析一下這個例子桐经。
發(fā)起請求
// 請求方法 / HTTP 版本號
GET / HTTP/1.1
// 請求地址
Request URL: https://www.baidu.com/favicon.ico
// 請求資源所在服務器
Host: www.baidu.com
// 優(yōu)先選擇的語言(自然語言)
Accept-Language: zh-CN
服務端返回
// HTTP 版本毁兆、HTTP 狀態(tài)碼 200
HTTP/1.1 200 OK
// 創(chuàng)建報文的日期
Date: Sat, 07 Apr 2018 02:17:48 GMT
// HTTP 服務器的安裝信息
Server: Apache
// 資源的最后修改時間
Last-Modified: Mon, 02 Apr 2018 09:39:34 GMT
// 支持字節(jié)范圍請求
Accept-Ranges: bytes
// 實體主體的大小
Content-Length: 984
// 實體主體的類型
Content-Type: image/x-icon
HTTP 首部字段種類非常多浙滤,該例子舉例了常用的一部分,想了解更多可以研究 MDN HTTP Headers 文檔 气堕。
目前里面中文翻譯不夠完整纺腊,翻譯水平高的朋友可以點擊幫忙完善一下,為開源事業(yè)出一份力:)
這次就總結到這里了茎芭,由于水平有限揖膜,難免有些許紕漏。有什么錯誤請指出梅桩,不勝感激壹粟。
參考文章
為何HTTP被翻譯為“超文本傳輸協議”是一次歷史上的重大翻譯錯誤?
HTTP 協議入門-阮一峰
TCP/IP 協議 百度百科
ping 原理與ICMP協議
漫談網絡通信——從OSI網絡模型到TCP/IP協議族
HTTP 方法-w3school
HTTP 請求方法-MDN
《圖解HTTP》