HTTP 協(xié)議知識(shí)點(diǎn)總結(jié)(一)

HTTP

在許多大公司的面試中,經(jīng)常會(huì)重點(diǎn)考察面試者的計(jì)算機(jī)基礎(chǔ)知識(shí)。所以對(duì)于在計(jì)算機(jī)網(wǎng)絡(luò)、數(shù)據(jù)結(jié)構(gòu)、操作系統(tǒng)上花費(fèi)更多的時(shí)間和精力,是完全值得的。HTTP 作為應(yīng)用最為廣泛的網(wǎng)絡(luò)協(xié)議,不論前端和后端都需要經(jīng)常接觸。最近決定對(duì) HTTP 進(jìn)行了一些學(xué)習(xí),所以整理一份筆記并分享給大家。

HTTP (HyperText Transfer Protocol) 通常被我們稱為超文本傳輸協(xié)議,又譯為超文本轉(zhuǎn)移協(xié)議。它的命名如何,不需要過于糾結(jié),我們更應(yīng)該重視它的內(nèi)容。

HTTP 與 TCP/IP

OSI 模型與 TCP/IP 模型對(duì)比
OSI TCP/IP
應(yīng)用層
表示層
會(huì)話層
應(yīng)用層
傳輸層 傳輸層
網(wǎng)絡(luò)層 網(wǎng)絡(luò)層
數(shù)據(jù)鏈路層
物理層
鏈路層
TCP/IP 四層模型分析

HTTP 是 TCP/IP 協(xié)議內(nèi)部的一個(gè)子集,在了解它之前我們需要先了解一下 TCP/IP 相關(guān)的知識(shí)。TCP/IP(Transmission Control Protocol/Internet Protocol)協(xié)議分為應(yīng)用層、傳輸層、網(wǎng)絡(luò)層、鏈路層四層,我簡(jiǎn)單的來總結(jié)舉例一下。

應(yīng)用層

應(yīng)用層向用戶提供一系列的應(yīng)用服務(wù)。
比如我們熟悉的 DNS(Domain Name Service,域名解析)、FTP(File Transfer Protocol,文件傳輸協(xié)議),當(dāng)然還有我們要講的 HTTP 協(xié)議。
有時(shí)在 App Store 無法下載應(yīng)用時(shí),就經(jīng)常會(huì)把 DNS 設(shè)置為谷歌的 8.8.8.8 或者國內(nèi)的 114.114.114.114,這些都是比較常見的服務(wù)。

傳輸層

傳輸層提供連接兩臺(tái)計(jì)算機(jī)之間的數(shù)據(jù)傳輸。
傳輸層有兩種協(xié)議:
TCP(Transmission Control Protocol,傳輸控制協(xié)議)
UDP(User Datagram protocol,用戶數(shù)據(jù)報(bào)協(xié)議)

網(wǎng)絡(luò)層

網(wǎng)絡(luò)層規(guī)定了通過什么樣的方式將數(shù)據(jù)包傳遞給對(duì)方。
網(wǎng)絡(luò)層協(xié)議的代表包括:
IP(Internet Protocol,互聯(lián)網(wǎng)協(xié)議)
ICMP(Internet Control Message Protocol,互聯(lián)網(wǎng)消息控制協(xié)議)

因?yàn)?IP 并不是完全可靠,無法保證數(shù)據(jù)被送達(dá)。所以需要 ICMP 傳輸出錯(cuò)報(bào)告控制信息。ICMP 最著名的應(yīng)用應(yīng)該就是 ping 了,比如我們上不去某個(gè)網(wǎng)站,就可以在終端輸入測(cè)試一下。

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    

鏈路層

鏈路層用來鏈接網(wǎng)絡(luò)的硬件部分。
網(wǎng)絡(luò)層傳過來的數(shù)據(jù)在這里被加工成了可被物理層傳輸?shù)慕Y(jié)構(gòu)包——幀。幀中包括 MAC 地址(Media Access Control)和一些其他信息。放一幅在網(wǎng)上找的圖給大家展示一下。

數(shù)據(jù)幀結(jié)構(gòu)
一個(gè)訪問百度網(wǎng)站的例子
  1. 在瀏覽器輸入 http://www.baidu.com。
  2. DNS 通過你輸入的地址,找到百度的 IP 地址 14.215.177.38。
  3. 通過 ARP 協(xié)議尋找 MAC 地址,建立 TCP 連接。
  4. 三次握手
    • 發(fā)送端:發(fā)送帶有 SYN 的數(shù)據(jù)包
    • 接收端:應(yīng)答,發(fā)送帶有 SYN/ACK 的數(shù)據(jù)包
    • 發(fā)送端:應(yīng)答,發(fā)送帶有 ACK 的數(shù)據(jù)包
  5. 通過返回的數(shù)據(jù)包顯示網(wǎng)頁

這個(gè)例子簡(jiǎn)單總結(jié)一下,深入的話也寫不完(攤手)。

常見的 HTTP 方法

方法 說明
GET 獲取資源
POST 傳輸實(shí)體主體
PUT 傳輸替換目標(biāo)資源
DELETE 刪除目標(biāo)資源
HEAD 獲取報(bào)文首部
OPTIONS 獲取支持的方法
常見方法分析

GET 與 POST 的區(qū)別

這也算是面試比較常問的問題了,這里放上一個(gè)表格。

GET POST
后退按鈕/刷新 無害 數(shù)據(jù)會(huì)被重新提交(瀏覽器會(huì)提示)
書簽/緩存/歷史 X
編碼類型 application/x-www-form-urlencoded application/x-www-form-urlencoded 或 multipart/form-data。為二進(jìn)制數(shù)據(jù)使用多重編碼
數(shù)據(jù)長(zhǎng)度限制 URL 的最大長(zhǎng)度是 2048 個(gè)字符 無限制
數(shù)據(jù)類型限制 只允許 ASCII 字符 無限制
可見性 數(shù)據(jù)在 URL 中對(duì)所有人可見、請(qǐng)求會(huì)保存在歷史記錄 數(shù)據(jù)保存在主體中、請(qǐng)求不會(huì)保存在歷史記錄

PUT 請(qǐng)求

PUTPOST 方法的區(qū)別在于,PUT方法是冪等的:調(diào)用一次與連續(xù)調(diào)用多次是等價(jià)的(即沒有副作用),而連續(xù)調(diào)用多次POST方法可能會(huì)有副作用,比如將一個(gè)訂單重復(fù)提交多次。

DELETE 請(qǐng)求

如果 DELETE方法成功執(zhí)行,那么可能會(huì)有以下幾種狀態(tài)碼:

  • 狀態(tài)碼 202 (Accepted) 表示請(qǐng)求的操作可能會(huì)成功執(zhí)行,但是尚未開始執(zhí)行。
  • 狀態(tài)碼 204 (No Content) 表示操作已執(zhí)行,但是無進(jìn)一步的相關(guān)信息。
  • 狀態(tài)碼 200 (OK) 表示操作已執(zhí)行,并且響應(yīng)中提供了相關(guān)狀態(tài)的描述信息。

HEAD 請(qǐng)求

HEAD 請(qǐng)求就如同前面表格所說的是獲取報(bào)文首部,該請(qǐng)求方法的一個(gè)使用場(chǎng)景是在下載一個(gè)大文件前先獲取其大小再?zèng)Q定是否要下載, 以此可以節(jié)約帶寬資源。

OPTIONS 請(qǐng)求

OPTIONS 請(qǐng)求就是用于獲取目的資源所支持的通信選項(xiàng),平時(shí)在做 ionic、Angular 的時(shí)候,它就經(jīng)常會(huì)在請(qǐng)求前自動(dòng)調(diào)用一個(gè) OPTIONS 方法。

HTTP 狀態(tài)碼

簡(jiǎn)單的說,HTTP 狀態(tài)碼就是描述返回的請(qǐng)求結(jié)果
這里還是拿一個(gè)表格展示一下,由于種類比較多,所以只列舉種類,不進(jìn)行完全列舉。

類別 原因
1xx Informational(信息性狀態(tài)碼) 接收的請(qǐng)求正在處理
2xx Success(成功狀態(tài)碼) 請(qǐng)求正常處理完畢
3xx Redirection(重定向狀態(tài)碼) 需要進(jìn)行附加操作以完成請(qǐng)求
4xx Client Error(客戶端錯(cuò)誤狀態(tài)碼) 服務(wù)器無法處理請(qǐng)求
5xx Server Error(服務(wù)端錯(cuò)誤狀態(tài)碼) 服務(wù)器處理請(qǐng)求出錯(cuò)

HTTP 報(bào)文首部字段

HTTP 報(bào)文的首部字段,主要是用來傳遞額外的重要信息

一個(gè)簡(jiǎn)單的請(qǐng)求例子

前面講了這么多,這里結(jié)合請(qǐng)求方法、狀態(tài)碼等舉一個(gè)例子。

發(fā)起請(qǐng)求:

GET / HTTP/1.1
Request URL: https://www.baidu.com/favicon.ico
Host: www.baidu.com
Accept-Language: zh-CN

服務(wù)端返回:

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

現(xiàn)在我們分析一下這個(gè)例子。

發(fā)起請(qǐng)求

// 請(qǐng)求方法 / HTTP 版本號(hào)
GET / HTTP/1.1
// 請(qǐng)求地址
Request URL: https://www.baidu.com/favicon.ico
// 請(qǐng)求資源所在服務(wù)器
Host: www.baidu.com
// 優(yōu)先選擇的語言(自然語言)
Accept-Language: zh-CN

服務(wù)端返回

// HTTP 版本、HTTP 狀態(tài)碼 200
HTTP/1.1 200 OK
// 創(chuàng)建報(bào)文的日期
Date: Sat, 07 Apr 2018 02:17:48 GMT
// HTTP 服務(wù)器的安裝信息
Server: Apache
// 資源的最后修改時(shí)間
Last-Modified: Mon, 02 Apr 2018 09:39:34 GMT
// 支持字節(jié)范圍請(qǐng)求
Accept-Ranges: bytes
// 實(shí)體主體的大小
Content-Length: 984
// 實(shí)體主體的類型
Content-Type: image/x-icon

HTTP 首部字段種類非常多,該例子舉例了常用的一部分,想了解更多可以研究 MDN HTTP Headers 文檔 。

MDN HTTP Headers

目前里面中文翻譯不夠完整,翻譯水平高的朋友可以點(diǎn)擊幫忙完善一下,為開源事業(yè)出一份力:)

這次就總結(jié)到這里了,由于水平有限,難免有些許紕漏。有什么錯(cuò)誤請(qǐng)指出,不勝感激。

參考文章

為何HTTP被翻譯為“超文本傳輸協(xié)議”是一次歷史上的重大翻譯錯(cuò)誤?
HTTP 協(xié)議入門-阮一峰
TCP/IP 協(xié)議 百度百科
ping 原理與ICMP協(xié)議
漫談網(wǎng)絡(luò)通信——從OSI網(wǎng)絡(luò)模型到TCP/IP協(xié)議族
HTTP 方法-w3school
HTTP 請(qǐng)求方法-MDN
《圖解HTTP》

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 簡(jiǎn)介 用簡(jiǎn)單的話來定義tcpdump,就是:dump the traffic on a network,根據(jù)使用者...
    保川閱讀 6,077評(píng)論 1 13
  • 版本記錄 前言 在互聯(lián)網(wǎng)行業(yè)中,不管你是客戶端前端還是后臺(tái),只要是與網(wǎng)絡(luò)相關(guān),你就必須了解一些基礎(chǔ)知識(shí),包括這里的...
    刀客傳奇閱讀 1,989評(píng)論 0 16
  • 1.這篇文章不是本人原創(chuàng)的,只是個(gè)人為了對(duì)這部分知識(shí)做一個(gè)整理和系統(tǒng)的輸出而編輯成的,在此鄭重地向本文所引用文章的...
    SOMCENT閱讀 13,360評(píng)論 6 174
  • 個(gè)人認(rèn)為,Goodboy1881先生的TCP /IP 協(xié)議詳解學(xué)習(xí)博客系列博客是一部非常精彩的學(xué)習(xí)筆記,這雖然只是...
    貳零壹柒_fc10閱讀 5,193評(píng)論 0 8
  • 網(wǎng)絡(luò)概念第一天 兩臺(tái)電腦怎么通過網(wǎng)絡(luò)傳輸數(shù)據(jù)?怎樣才能知道傳輸?shù)氖菙?shù)據(jù)?誰摸過網(wǎng)線? 看電影,怎么看的?通過電流,...
    小吖朱閱讀 1,647評(píng)論 0 1

友情鏈接更多精彩內(nèi)容