HTTP協(xié)議是什么?詳細(xì)解讀HTTP看完還不懂你來找我
時(shí)間:2023-02-19 17:34:01 | 來源:建站知識(shí)
時(shí)間:2023-02-19 17:34:01 來源:建站知識(shí)
HTTP協(xié)議是什么?詳細(xì)解讀HTTP看完還不懂你來找我:
文章將包含以下幾方面內(nèi)容:
- HTTP協(xié)議解讀
- 與HTTP相關(guān)組件
- 與HTTP相關(guān)協(xié)議
- HTTP組成
- HTTP協(xié)議優(yōu)缺點(diǎn)
HTTP協(xié)議解讀
HTTP 是一種 超文本傳輸協(xié)議(Hypertext Transfer Protocol),超文本傳輸協(xié)議可以進(jìn)行文字分割:
超文本(Hypertext)、傳輸(Transfer)、協(xié)議(Protocol) ,它們之間的關(guān)系如下:
分別對(duì)這三個(gè)名次做一個(gè)解釋:
超文本
兩臺(tái)電腦之間只能傳輸簡單文字,后面還想要傳輸圖片、音頻、視頻,甚至點(diǎn)擊文字或圖片能夠進(jìn)行超鏈接的跳轉(zhuǎn),那么文本的語義就被擴(kuò)大了,這種語義擴(kuò)大后的文本就被稱為超文本(Hypertext)。
傳輸
兩臺(tái)計(jì)算機(jī)之間會(huì)形成互聯(lián)關(guān)系進(jìn)行通信,我們存儲(chǔ)的超文本會(huì)被解析成為二進(jìn)制數(shù)據(jù)包,由傳輸載體(例如同軸電纜,電話線,光纜)負(fù)責(zé)把二進(jìn)制數(shù)據(jù)包由計(jì)算機(jī)終端傳輸?shù)搅硪粋€(gè)終端的過程
協(xié)議
網(wǎng)絡(luò)協(xié)議就是網(wǎng)絡(luò)中(包括互聯(lián)網(wǎng))傳遞、管理信息的一些規(guī)范
與HTTP相關(guān)組件
網(wǎng)絡(luò)設(shè)計(jì)者以分層(layer)的方式組織協(xié)議,每個(gè)協(xié)議屬于層次模型之一。每一層都是向它的上一層提供服務(wù)(service),即所謂的服務(wù)模型(service model)。每個(gè)分層中所有的協(xié)議稱為 協(xié)議棧(protocol stack)。因特網(wǎng)的協(xié)議棧由五個(gè)部分組成:物理層、鏈路層、網(wǎng)絡(luò)層、傳輸層和應(yīng)用層。我們采用自上而下的方法研究其原理,也就是應(yīng)用層 -> 物理層的方式(了解)。
應(yīng)用層
應(yīng)用層是網(wǎng)絡(luò)應(yīng)用程序和網(wǎng)絡(luò)協(xié)議存放的分層,因特網(wǎng)的應(yīng)用層包括許多協(xié)議。比如HTTP,電子郵件傳送協(xié)議 SMTP、端系統(tǒng)文件上傳協(xié)議 FTP、還有為我們進(jìn)行域名解析的 DNS 協(xié)議
傳輸層
輸層在應(yīng)用程序斷點(diǎn)之間傳送應(yīng)用程序報(bào)文,在這一層主要有兩種傳輸協(xié)議 TCP和 UDP。
TCP 是面向連接的,它能夠控制并確認(rèn)報(bào)文是否到達(dá),并提供了擁塞機(jī)制來控制網(wǎng)絡(luò)傳輸,因此當(dāng)網(wǎng)絡(luò)擁塞時(shí),會(huì)抑制其傳輸速率。
UDP 協(xié)議向它的應(yīng)用程序提供了無連接服務(wù)。它是不具備可靠性的,沒有流量控制,也沒有擁塞控制。我們把運(yùn)輸層的分組稱為 報(bào)文段(segment)
網(wǎng)絡(luò)層
網(wǎng)絡(luò)層負(fù)責(zé)將稱為 數(shù)據(jù)報(bào)(datagram) 的網(wǎng)絡(luò)分層從一臺(tái)主機(jī)移動(dòng)到另一臺(tái)主機(jī)。網(wǎng)絡(luò)層一個(gè)非常重要的協(xié)議是 IP 協(xié)議,所有具有網(wǎng)絡(luò)層的因特網(wǎng)組件都必須運(yùn)行 IP 協(xié)議。
鏈路層
為了將分組從一個(gè)節(jié)點(diǎn)(主機(jī)或路由器)運(yùn)輸?shù)搅硪粋€(gè)節(jié)點(diǎn),網(wǎng)絡(luò)層必須依靠鏈路層提供服務(wù)。鏈路層的例子包括以太網(wǎng)、WiFi 和電纜接入的 DOCSIS 協(xié)議,因?yàn)閿?shù)據(jù)從源目的地傳送通常需要經(jīng)過幾條鏈路,一個(gè)數(shù)據(jù)包可能被沿途不同的鏈路層協(xié)議處理,我們把鏈路層的分組稱為 幀(frame)。
物理層
雖然鏈路層的作用是將幀從一個(gè)端系統(tǒng)運(yùn)輸?shù)搅硪粋€(gè)端系統(tǒng),而物理層的作用是將幀中的一個(gè)個(gè) 比特 從一個(gè)節(jié)點(diǎn)運(yùn)輸?shù)搅硪粋€(gè)節(jié)點(diǎn),,物理層的協(xié)議仍然使用鏈路層協(xié)議,這些協(xié)議與實(shí)際的物理傳輸介質(zhì)有關(guān),例如,以太網(wǎng)有很多物理層協(xié)議:關(guān)于雙絞銅線、關(guān)于同軸電纜、關(guān)于光纖等等。
五層網(wǎng)絡(luò)協(xié)議的示意圖如下:
與HTTP相關(guān)協(xié)議
HTTP 屬于應(yīng)用層的協(xié)議,需要其他層次協(xié)議的配合完成信息的交換,在完成一次 HTTP 請(qǐng)求和響應(yīng)的過程中,需要以下協(xié)議的配合:
TCP/IP
TCP/IP 我們一般稱之為協(xié)議簇,什么意思呢?就是 TCP/IP 協(xié)議簇中不僅僅只有 TCP 協(xié)議和 IP 協(xié)議,它是一系列網(wǎng)絡(luò)通信協(xié)議的統(tǒng)稱。而其中最核心的兩個(gè)協(xié)議就是 TCP / IP 協(xié)議,其他的還有 UDP、ICMP、ARP 等等,共同構(gòu)成了一個(gè)復(fù)雜但有層次的協(xié)議棧。
TCP 協(xié)議的全稱是 Transmission Control Protocol 的縮寫,意思是傳輸控制協(xié)議,HTTP 使用 TCP 作為通信協(xié)議,這是因?yàn)?TCP 是一種可靠的協(xié)議,而可靠能保證數(shù)據(jù)不丟失。
IP 協(xié)議的全稱是 Internet Protocol 的縮寫,它主要解決的是通信雙方尋址的問題。IP 協(xié)議使用 IP 地址 來標(biāo)識(shí)互聯(lián)網(wǎng)上的每一臺(tái)計(jì)算機(jī)。
DNS
DNS 的全稱是域名系統(tǒng)(Domain Name System,縮寫:DNS),它作為將域名和 IP 地址相互映射的一個(gè)分布式數(shù)據(jù)庫,能夠使人更方便地訪問互聯(lián)網(wǎng)。比如:
http://www.google.com ->
http://193.XXX.XXX.XXXURI / URL
可以通過輸入
http://www.google.com 地址來訪問谷歌的官網(wǎng),輸入的地址格式必須要滿足 URI 的規(guī)范。
URI的全稱是(Uniform Resource Identifier),中文名稱是統(tǒng)一資源標(biāo)識(shí)符,使用它就能夠唯一地標(biāo)記互聯(lián)網(wǎng)上資源。
URL的全稱是(Uniform Resource Locator),中文名稱是統(tǒng)一資源定位符,也就是我們俗稱的網(wǎng)址,它實(shí)際上是 URI 的一個(gè)子集。
HTTP報(bào)文
- 起始行(start line):描述請(qǐng)求或響應(yīng)的基本信息;
- 頭部字段(header):使用 key-value 形式更詳細(xì)地說明報(bào)文;
- 消息正文(entity):實(shí)際傳輸?shù)臄?shù)據(jù),它不一定是純文本,可以是圖片、視頻等二進(jìn)制數(shù)據(jù)。
起始行和頭部字段并成為 請(qǐng)求頭 或者 響應(yīng)頭,統(tǒng)稱為 Header;消息正文也叫做實(shí)體,稱為 body。HTTP 協(xié)議規(guī)定每次發(fā)送的報(bào)文必須要有 Header,但是可以沒有 body,在 header 和 body 之間必須要有一個(gè)空行(CRLF)。
舉個(gè)例子:
http://www.someSchool.edu/someDepartment/home.index 請(qǐng)求的請(qǐng)求頭:
報(bào)文的起始行都是由三個(gè)字段組成:
方法、URL 字段和 HTTP 版本字段。
HTTP 請(qǐng)求方法
- GET 獲取資源,GET 方法用來請(qǐng)求訪問已被 URI 識(shí)別的資源。指定的資源經(jīng)服務(wù)器端解析后返回響應(yīng)內(nèi)容。
- POST 傳輸實(shí)體,使用 POST 傳輸實(shí)體信息,提交表格內(nèi)容。
- PUT 傳輸文件,PUT 方法用來傳輸文件。就像 FTP 協(xié)議的文件上傳一樣,要求在請(qǐng)求報(bào)文的主體中包含文件內(nèi)容,然后保存到請(qǐng)求 URI 指定的位置。 但是,鑒于 HTTP 的 PUT 方法自身不帶驗(yàn)證機(jī)制,任何人都可以上傳文件 , 存在安全性問題,因此一般的 W eb 網(wǎng)站不使用該方法。若配合 W eb 應(yīng)用程序的驗(yàn)證機(jī)制,或架構(gòu)設(shè)計(jì)采用REST(REpresentational State Transfer,表征狀態(tài)轉(zhuǎn)移)標(biāo)準(zhǔn)的同類 Web 網(wǎng)站,就可能會(huì)開放使用 PUT 方法。
- HEAD 獲得響應(yīng)首部,HEAD 方法和 GET 方法一樣,只是不返回報(bào)文主體部分。用于確認(rèn) URI 的有效性及資源更新的日期時(shí)間等。
- DELETE 刪除文件,DELETE 方法用來刪除文件,是與 PUT 相反的方法。DELETE 方法按請(qǐng)求 URI 刪除指定的資源。
- OPTIONS 詢問支持的方法,OPTIONS 方法用來查詢針對(duì)請(qǐng)求 URI 指定的資源支持的方法。
- TRACE 追蹤路徑,TRACE 方法是讓 Web 服務(wù)器端將之前的請(qǐng)求通信環(huán)回給客戶端的方法。
- CONNECT 要求用隧道協(xié)議連接代理,CONNECT 方法要求在與代理服務(wù)器通信時(shí)建立隧道,實(shí)現(xiàn)用隧道協(xié)議進(jìn)行 TCP 通信。主要使用 SSL(Secure Sockets Layer,安全套接層)和 TLS(Transport Layer Security,傳輸層安全)協(xié)議把通信內(nèi)容加 密后經(jīng)網(wǎng)絡(luò)隧道傳輸。
一般最常用的方法也就是 GET 方法和 POST 方法,其他方法暫時(shí)了解即可。
HTTP 請(qǐng)求 URL
完整的域名解析一下 URL:
http://www.example.com:80/path/to/myfile.html?key1=value1&key2=value2#SomewhereInTheDocument- http://告訴瀏覽器使用何種協(xié)議。
- http://www.example.com 是域名、主機(jī),指示了需要向網(wǎng)絡(luò)上的哪一臺(tái)主機(jī)發(fā)起請(qǐng)求。也可以直接向主機(jī)的ip發(fā)起請(qǐng)求。
- 端口 兩個(gè)主機(jī)之間要發(fā)起 TCP 連接需要兩個(gè)條件,主機(jī) + 端口,表示用于訪問 Web 服務(wù)器上資源的入口,如果訪問的該 Web 服務(wù)器使用HTTP協(xié)議的標(biāo)準(zhǔn)端口(HTTP為80,HTTPS為443)授予對(duì)其資源的訪問權(quán)限,則通常省略此部分。否則端口就是 URI 必須的部分。
- 路徑 /path/to/myfile.html 是 Web 服務(wù)器上資源的路徑。以端口后面的第一個(gè) / 開始,到 ? 號(hào)之前結(jié)束,中間的 每一個(gè)/ 都代表了層級(jí)(上下級(jí))關(guān)系。
- 查詢參數(shù)
?key1=value1&key2=value2 是提供給 Web 服務(wù)器的額外參數(shù)。如果是 GET 請(qǐng)求,一般帶有請(qǐng)求 URL 參數(shù),如果是 POST 請(qǐng)求,則不會(huì)在路徑后面直接加參數(shù)。
- 錨點(diǎn) #SomewhereInTheDocument 是資源本身的某一部分的一個(gè)錨點(diǎn)。錨點(diǎn)代表資源內(nèi)的一種“書簽”。
請(qǐng)求頭部
比如
http://www.someSchool.edu/someDepartment/home.index,來看一下它的請(qǐng)求頭部
Host: www.someschool.eduConnection: closeUser-agent: Mozilla/5.0Accept-language: fr復(fù)制代碼
- Host :表示的是對(duì)象所在的主機(jī)
- Connection: close 表示的是瀏覽器需要告訴服務(wù)器使用的是非持久連接。它要求服務(wù)器在發(fā)送完響應(yīng)的對(duì)象后就關(guān)閉連接。
- User-agent: 這是請(qǐng)求頭用來告訴 Web 服務(wù)器,瀏覽器使用的類型是 Mozilla/5.0,即 Firefox 瀏覽器。
- Accept-language 告訴 Web 服務(wù)器,瀏覽器想要得到對(duì)象的法語版本。
HTTP 的請(qǐng)求標(biāo)頭分為四種: 通用標(biāo)頭、請(qǐng)求標(biāo)頭、響應(yīng)標(biāo)頭 和 實(shí)體標(biāo)頭
通用標(biāo)頭
通用標(biāo)頭主要有三個(gè),分別是 Date、Cache-Control 和 Connection
DateDate 出現(xiàn)在請(qǐng)求標(biāo)頭和響應(yīng)標(biāo)頭中,它的基本表示如下
Date: Wed, 21 Oct 2015 07:28:00 GMT 復(fù)制代碼
Cache-ControlCache-Control 可以出現(xiàn)在請(qǐng)求標(biāo)頭和響應(yīng)標(biāo)頭中,Cache-Control 的種類比較多,雖然說這是一個(gè)通用標(biāo)頭,但是又一些特性是請(qǐng)求標(biāo)頭具有的,有一些是響應(yīng)標(biāo)頭才有的。主要大類有 可緩存性、閾值性、 重新驗(yàn)證并重新加載 和其他特性
ConnectionConnection 決定當(dāng)前事務(wù)(一次三次握手和四次揮手)完成后,是否會(huì)關(guān)閉網(wǎng)絡(luò)連接。Connection 有兩種,一種是持久性連接,即一次事務(wù)完成后不關(guān)閉網(wǎng)絡(luò)連接
Connection: keep-alive復(fù)制代碼復(fù)制代碼
另一種是非持久性連接,即一次事務(wù)完成后關(guān)閉網(wǎng)絡(luò)連接
Connection: close復(fù)制代碼
實(shí)體標(biāo)頭
實(shí)體標(biāo)頭是描述消息正文內(nèi)容的 HTTP 標(biāo)頭。實(shí)體標(biāo)頭用于 HTTP 請(qǐng)求和響應(yīng)中。頭部Content-Length、 Content-Language、 Content-Encoding 是實(shí)體頭。
- Content-Length 實(shí)體報(bào)頭指示實(shí)體主體的大小,以字節(jié)為單位,發(fā)送到接收方。
- Content-Language 實(shí)體報(bào)頭描述了客戶端或者服務(wù)端能夠接受的語言,例如
Content-Language: de-DEContent-Language: en-USContent-Language: de-DE, en-CA復(fù)制代碼復(fù)制代碼
- Content-Encoding 這又是一個(gè)比較麻煩的屬性,這個(gè)實(shí)體報(bào)頭用來壓縮媒體類型。Content-Encoding 指示對(duì)實(shí)體應(yīng)用了何種編碼。 常見的內(nèi)容編碼有這幾種: gzip、compress、deflate、identity ,這個(gè)屬性可以應(yīng)用在請(qǐng)求報(bào)文和響應(yīng)報(bào)文中
Accept-Encoding: gzip, deflate //請(qǐng)求頭Content-Encoding: gzip //響應(yīng)頭復(fù)制代碼
請(qǐng)求標(biāo)頭
GET /home.html HTTP/1.1Host: developer.mozilla.orgUser-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:50.0) Gecko/20100101 Firefox/50.0Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8Accept-Language: en-US,en;q=0.5Accept-Encoding: gzip, deflate, brReferer: https://developer.mozilla.org/testpage.htmlConnection: keep-aliveUpgrade-Insecure-Requests: 1If-Modified-Since: Mon, 18 Jul 2016 02:36:04 GMTIf-None-Match: "c561c68d0ba92bbeb8b0fff2a9199f722e3a621a"Cache-Control: max-age=0 復(fù)制代碼
HostHost 請(qǐng)求頭指明了服務(wù)器的域名,以及(可選的)服務(wù)器監(jiān)聽的TCP端口號(hào)
RefererHTTP Referer 屬性是請(qǐng)求標(biāo)頭的一部分,告訴服務(wù)器該網(wǎng)頁是從哪個(gè)頁面鏈接過來的
If-Modified-SinceHTTP 的 If-Modified-Since 使其成為條件請(qǐng)求:
- 返回200,只有在給定日期的最后一次修改資源后,服務(wù)器才會(huì)以200狀態(tài)發(fā)送回請(qǐng)求的資源。
- 如果請(qǐng)求從開始以來沒有被修改過,響應(yīng)會(huì)返回304并且沒有任何響應(yīng)體
If-Modified-Since 通常會(huì)與 If-None-Match 搭配使用,If-Modified-Since 用于確認(rèn)代理或客戶端擁有的本地資源的有效性。獲取資源的更新日期時(shí)間,可通過確認(rèn)首部字段 Last-Modified 來確定。
大白話說就是如果在 Last-Modified 之后更新了服務(wù)器資源,那么服務(wù)器會(huì)響應(yīng)200,如果在 Last-Modified 之后沒有更新過資源,則返回 304。
If-Modified-Since: Mon, 18 Jul 2016 02:36:04 GMT復(fù)制代碼復(fù)制代碼
If-None-MatchIf-None-Match HTTP請(qǐng)求標(biāo)頭使請(qǐng)求成為條件請(qǐng)求。 對(duì)于 GET 和 HEAD 方法,僅當(dāng)服務(wù)器沒有與給定資源匹配的 ETag 時(shí),服務(wù)器才會(huì)以200狀態(tài)發(fā)送回請(qǐng)求的資源。 對(duì)于其他方法,僅當(dāng)最終現(xiàn)有資源的ETag與列出的任何值都不匹配時(shí),才會(huì)處理請(qǐng)求。
If-None-Match: "c561c68d0ba92bbeb8b0fff2a9199f722e3a621a"復(fù)制代碼復(fù)制代碼
內(nèi)容協(xié)商
內(nèi)容協(xié)商機(jī)制是指客戶端和服務(wù)器端就響應(yīng)的資源內(nèi)容進(jìn)行交涉,然后提供給客戶端最為適合的資源。內(nèi)容協(xié)商會(huì)以響應(yīng)資源的語言、字符集、編碼方式等作為判斷的標(biāo)準(zhǔn)。
內(nèi)容協(xié)商主要有以下3種類型:
- 服務(wù)器驅(qū)動(dòng)協(xié)商(Server-driven Negotiation)
這種協(xié)商方式是由服務(wù)器端進(jìn)行內(nèi)容協(xié)商。服務(wù)器端會(huì)根據(jù)請(qǐng)求首部字段進(jìn)行自動(dòng)處理
- 客戶端驅(qū)動(dòng)協(xié)商(Agent-driven Negotiation)
這種協(xié)商方式是由客戶端來進(jìn)行內(nèi)容協(xié)商。
- 透明協(xié)商(Transparent Negotiation)
是服務(wù)器驅(qū)動(dòng)和客戶端驅(qū)動(dòng)的結(jié)合體,是由服務(wù)器端和客戶端各自進(jìn)行內(nèi)容協(xié)商的一種方法。
內(nèi)容協(xié)商的分類有很多種,主要的幾種類型是
Accept、Accept-Charset、Accept-Encoding、Accept-Language、Content-Language。
Accept接受請(qǐng)求 HTTP 標(biāo)頭會(huì)通告客戶端其能夠理解的 MIME 類型
MIME: MIME (Multipurpose Internet Mail Extensions) 是描述消息內(nèi)容類型的因特網(wǎng)標(biāo)準(zhǔn)。MIME 消息能包含文本、圖像、音頻、視頻以及其他應(yīng)用程序?qū)S玫臄?shù)據(jù)。復(fù)制代碼
文本文件: text/html、text/plain、text/css、application/xhtml+xml、application/xml
圖片文件: image/jpeg、image/gif、image/png
視頻文件: video/mpeg、video/quicktime
應(yīng)用程序二進(jìn)制文件: application/octet-stream、application/zip
比如,如果瀏覽器不支持 PNG 圖片的顯示,那 Accept 就不指定image/png,而指定可處理的 image/gif 和 image/jpeg 等圖片類型。
一般 MIME 類型也會(huì)和 q 這個(gè)屬性一起使用,q 是什么?q 表示的是權(quán)重,來看一個(gè)例子
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8復(fù)制代碼
若想要給顯示的
媒體類型增加優(yōu)先級(jí),則使用 q= 來額外表示權(quán)重值,沒有顯示權(quán)重的時(shí)候默認(rèn)值是1.0。
Accept-Charsetaccept-charset 屬性規(guī)定服務(wù)器處理表單數(shù)據(jù)所接受的字符集。
accept-charset 屬性允許您指定一系列字符集,服務(wù)器必須支持這些字符集,從而得以正確解釋表單中的數(shù)據(jù)。
Accept-Language首部字段 Accept-Language 用來告知服務(wù)器用戶代理能夠處理的自然語言集(指中文或英文等),以及自然語言集的相對(duì)優(yōu)先級(jí)。
Accept-Language: en-US,en;q=0.5復(fù)制代碼
響應(yīng)標(biāo)頭
響應(yīng)標(biāo)頭是可以在 HTTP 響應(yīng)中使用的 HTTP 標(biāo)頭。并不是所有出現(xiàn)在響應(yīng)中的標(biāo)頭都是響應(yīng)標(biāo)頭。還有一些特殊的我們上面說過,有通用標(biāo)頭和實(shí)體標(biāo)頭也會(huì)出現(xiàn)在響應(yīng)標(biāo)頭中,比如 Content-Length 就是一個(gè)實(shí)體標(biāo)頭,但是,在這種情況下,這些實(shí)體請(qǐng)求通常稱為響應(yīng)頭。下面以一個(gè)例子為例和你探討一下響應(yīng)頭
200 OKAccess-Control-Allow-Origin: *Connection: Keep-AliveContent-Encoding: gzipContent-Type: text/html; charset=utf-8Date: Mon, 18 Jul 2016 16:06:00 GMTEtag: "c561c68d0ba92bbeb8b0f612a9199f722e3a621a"Keep-Alive: timeout=5, max=997Last-Modified: Mon, 18 Jul 2016 02:36:04 GMTServer: ApacheSet-Cookie: mykey=myvalue; expires=Mon, 17-Jul-2017 16:06:00 GMT; Max-Age=31449600; Path=/; secureTransfer-Encoding: chunkedVary: Cookie, Accept-Encodingx-frame-options: DENY復(fù)制代碼
響應(yīng)狀態(tài)碼以 2xx 為開頭的都表示請(qǐng)求成功響應(yīng)。
以 3xx 為開頭的都表示需要進(jìn)行附加操作以完成請(qǐng)求
以 4xx 的響應(yīng)結(jié)果表明客戶端是發(fā)生錯(cuò)誤的原因所在。
以 5xx 為開頭的響應(yīng)標(biāo)頭都表示服務(wù)器本身發(fā)生錯(cuò)誤
HTTP協(xié)議優(yōu)缺點(diǎn)
HTTP 的優(yōu)點(diǎn)
HTTP 的協(xié)議比較簡單,它的主要組成就是 header + body,頭部信息也是簡單的文本格式
HTTP 協(xié)議又多了靈活 和 易擴(kuò)展 的優(yōu)點(diǎn)。
HTTP 協(xié)議里的請(qǐng)求方法、URI、狀態(tài)碼、原因短語、頭字段等每一個(gè)核心組成要素都沒有被制定死,允許開發(fā)者任意定制、擴(kuò)充或解釋,給予了瀏覽器和服務(wù)器最大程度的信任和自由。
天然具有
跨語言、跨平臺(tái)的優(yōu)越性,而且,因?yàn)楸旧淼暮唵翁匦院苋菀讓?shí)現(xiàn),所以幾乎所有的編程語言都有 HTTP 調(diào)用庫和外圍的開發(fā)測試工具
既是優(yōu)點(diǎn)又是缺點(diǎn)。因?yàn)榉?wù)器沒有記憶能力,所以就不需要額外的資源來記錄狀態(tài)信息,不僅實(shí)現(xiàn)上會(huì)簡單一些,而且還能減輕服務(wù)器的負(fù)擔(dān),能夠把更多的 CPU 和內(nèi)存用來對(duì)外提供服務(wù)。
HTTP 的缺點(diǎn)
服務(wù)器沒有記憶能力,它就無法支持需要連續(xù)多個(gè)步驟的事務(wù)操作。每次都得問一遍身份信息,需要增加了不必要的數(shù)據(jù)傳輸量。由此出現(xiàn)了 Cookie 技術(shù)。
明文傳輸,協(xié)議里的報(bào)文(準(zhǔn)確地說是 header 部分)不使用二進(jìn)制數(shù)據(jù),而是用簡單可閱讀的文本形式。
對(duì)比 TCP、UDP 這樣的二進(jìn)制協(xié)議,它的優(yōu)點(diǎn)顯而易見,不需要借助任何外部工具,用瀏覽器、Wireshark 或者 tcpdump 抓包后,直接用肉眼就可以很容易地查看或者修改,為我們的開發(fā)調(diào)試工作帶來極大的便利。
當(dāng)然缺點(diǎn)也是顯而易見的,就是不安全,可以被監(jiān)聽和被窺探。因?yàn)闊o法判斷通信雙方的身份,不能判斷報(bào)文是否被更改過。
總結(jié)起來即:
- 明文,請(qǐng)求報(bào)文未加密;
- 未hash,即使報(bào)文被修改過也不知道;
- 未驗(yàn)證身份,容易導(dǎo)致中間人攻擊;
作者:captain_p
鏈接:
https://juejin.cn/post/7041744237905346568如果本文對(duì)你有幫助,麻煩點(diǎn)贊關(guān)注支持一下