HTTP協(xié)議精講

Http 1.0 與 Http 1.1的區(qū)別:

  • 1.0協(xié)議,客戶端與web服務(wù)器建立連接后,只能獲得一個(gè)web資源!

  • 1.1協(xié)議,允許客戶端與web服務(wù)器建立連接后,在一個(gè)連接上獲取多個(gè)web資源!

Http請(qǐng)求的工作流程:

SYN和ACK

  • SYN(synchronous):TCP/IP建立連接時(shí)使用的握手信號(hào)

  • ACK(Acknowledgement):確認(rèn)字符,確認(rèn)發(fā)來(lái)的數(shù)據(jù)已經(jīng)接受無(wú)誤

TCP/IP三次握手的概念:

1、客戶端發(fā)送syn包(syn = j)到服務(wù)器,進(jìn)入SYN_SEND狀態(tài),然后等待服務(wù)器確認(rèn)

2、服務(wù)器收到syn包,確認(rèn)客戶的syn(ack = j + 1),同時(shí)在自己也發(fā)送一個(gè)SYN包(syn=k), 即SYN + ACK包,服務(wù)器進(jìn)入SYN_RECV狀態(tài)

3、客戶端收到SYN + ACK包,想服務(wù)器發(fā)送確認(rèn)包ACK(ack = k +1),發(fā)送完畢后,客戶端與服務(wù)端 進(jìn)入ESTABLISHED狀態(tài),完成三次握手,然后兩者開始傳送數(shù)據(jù)

TCP建立連接要進(jìn)行3次握手,而斷開連接要進(jìn)行4次

1 當(dāng)主機(jī)A完成數(shù)據(jù)傳輸后,將控制位FIN置1,提出停止TCP連接的請(qǐng)求

2 主機(jī)B收到FIN后對(duì)其作出響應(yīng),確認(rèn)這一方向上的TCP連接將關(guān)閉,將ACK置1

3 由B 端再提出反方向的關(guān)閉請(qǐng)求,將FIN置1

4 主機(jī)A對(duì)主機(jī)B的請(qǐng)求進(jìn)行確認(rèn),將ACK置1,雙方向的關(guān)閉結(jié)束.

TCP三次握手過(guò)程

1 主機(jī)A通過(guò)向主機(jī)B 發(fā)送一個(gè)含有同步序列號(hào)的標(biāo)志位的數(shù)據(jù)段給主機(jī)B ,向主機(jī)B 請(qǐng)求建立連接,通過(guò)這個(gè)數(shù)據(jù)段,

主機(jī)A告訴主機(jī)B 兩件事:我想要和你通信;你可以用哪個(gè)序列號(hào)作為起始數(shù)據(jù)段來(lái)回應(yīng)我.

2 主機(jī)B 收到主機(jī)A的請(qǐng)求后,用一個(gè)帶有確認(rèn)應(yīng)答(ACK)和同步序列號(hào)(SYN)標(biāo)志位的數(shù)據(jù)段響應(yīng)主機(jī)A,也告訴主機(jī)A兩件事:

我已經(jīng)收到你的請(qǐng)求了,你可以傳輸數(shù)據(jù)了;你要用哪個(gè)序列號(hào)作為起始數(shù)據(jù)段來(lái)回應(yīng)我

3 主機(jī)A收到這個(gè)數(shù)據(jù)段后,再發(fā)送一個(gè)確認(rèn)應(yīng)答,確認(rèn)已收到主機(jī)B 的數(shù)據(jù)段:"我已收到回復(fù),我現(xiàn)在要開始傳輸實(shí)際數(shù)據(jù)了

這樣3次握手就完成了,主機(jī)A和主機(jī)B 就可以傳輸數(shù)據(jù)了

"傳輸層"的功能,就是建立"端口到端口"的通信。相比之下,"網(wǎng)絡(luò)層"的功能是建立"主機(jī)到主機(jī)"的通信。只要確定主機(jī)和端口,我們就能實(shí)現(xiàn)程序之間的交流。因此,Unix系統(tǒng)就把主機(jī)+端口,叫做"套接字"(socket)。有了它,就可以進(jìn)行網(wǎng)絡(luò)應(yīng)用程序開發(fā)了。

一、HTTP關(guān)系密切的協(xié)議:IP、TCP和DNS

1、負(fù)責(zé)傳輸?shù)腎P協(xié)議

IP網(wǎng)際協(xié)議位于網(wǎng)絡(luò)層。IP的作用的就是把各種數(shù)據(jù)包傳送給對(duì)方。確保傳送到隨訪的兩個(gè)條件:IP地址和MAC地址

使用ARP協(xié)議憑借MAC地址進(jìn)行通行。

2、確??煽啃缘腡CP協(xié)議

TCP位于傳輸層,提供可靠的字節(jié)流服務(wù)。

所謂字節(jié)流的服務(wù),是為了方便傳輸,將大塊數(shù)據(jù)分割成報(bào)文段為單位的數(shù)據(jù)包進(jìn)行管理。

確保數(shù)據(jù)能到達(dá)目標(biāo)

TCP協(xié)議采用了三次握手策略。握手過(guò)程中使用了TCP的標(biāo)志---SYN(synchronize)和ACK(acknowledment)

發(fā)送端首先發(fā)送一個(gè)帶SYN標(biāo)志得瑟數(shù)據(jù)包給對(duì)方,接收端收到后,會(huì)傳一個(gè)帶有SYN/ACK標(biāo)志的數(shù)據(jù)包以示傳達(dá)確認(rèn)信息,最后,發(fā)送端再傳回一個(gè)帶ACK標(biāo)志的數(shù)據(jù)包,代表握手結(jié)束。

3、負(fù)責(zé)域名解析的DNS服務(wù)

DNS服務(wù)是和Http協(xié)議一樣位于應(yīng)用層的協(xié)議。它提供域名到IP地址之間的解析服務(wù)。

二、HTTP協(xié)議

1、HTTP協(xié)議用于客戶端和服務(wù)器端之間的通信。

2、通過(guò)請(qǐng)求和響應(yīng)的交換達(dá)成通信。

3、HTTP是不保存狀態(tài)的協(xié)議。

HTTP可使用的方法

1、GET:獲取資源

GET方法用來(lái)請(qǐng)求訪問已被URI識(shí)別的的資源。

2、POST:傳輸實(shí)體主體

POST方法用來(lái)傳輸實(shí)體的主體。

3、PUT:傳輸文件

4、HEAD:獲取報(bào)文首部

HEAD方法和GET方法一樣,只是不返回報(bào)文主題部分。

5、DELETE:刪除文件

6、OPTION:詢問支持的方法。

7、TRACE:追蹤路徑

8、CONNECT:要求喲過(guò)隧道協(xié)議連接代理

CONNECT方法要求與代理服務(wù)器通信是建立隧道,實(shí)現(xiàn)用隧道協(xié)議進(jìn)行TCP通信。主要使用SSL(安全套接字)和TLS(傳輸層安全)協(xié)議把通信內(nèi)容加密后經(jīng)網(wǎng)絡(luò)隧道傳輸。

持久連接:

HTTP keep-alive:只要任意一端有明確提出斷開連接,則保持TCP連接狀態(tài)。

持久連接的好處在于減少TCP連接的重復(fù)建立和斷開造成的額外開銷,減少了服務(wù)器的負(fù)載。

在Http/1.1,所有的連接默認(rèn)都是持久化連接。

管線化

持久連接使得多數(shù)請(qǐng)求以管線化方式發(fā)送成為可能。從前發(fā)送請(qǐng)求后序等待并得到響應(yīng),才能發(fā)送下一個(gè)請(qǐng)求。管線化技術(shù)出現(xiàn)后,不用等待響應(yīng)亦可直接發(fā)送下一個(gè)請(qǐng)求。

使用Cookie的狀態(tài)管理

HTTP是無(wú)狀態(tài)協(xié)議,它不對(duì)以前發(fā)生過(guò)的請(qǐng)求和響應(yīng)的狀態(tài)進(jìn)行管理。

Cookie技術(shù)通過(guò)在請(qǐng)求和響應(yīng)報(bào)文中寫入coo kie信息來(lái)控制客戶端的狀態(tài)。

HTTP報(bào)文

用于HTTP協(xié)議交互的信息被稱為HTTP報(bào)文。請(qǐng)求端的HTTP報(bào)文叫做請(qǐng)求報(bào)文,相應(yīng)端的叫做響應(yīng)段的報(bào)文。

HTTP報(bào)文大致可以分為報(bào)文首部和報(bào)文主題兩個(gè)主體。

請(qǐng)求報(bào)文和響應(yīng)報(bào)文的首部?jī)?nèi)容有以下數(shù)據(jù)組成

1、請(qǐng)求行

包含用于請(qǐng)求的方法,請(qǐng)求URI和HTTP的版本

2、狀態(tài)行

包含表明響應(yīng)結(jié)果的狀態(tài)碼,原因短語(yǔ)和HTTP版本

3、首部字段

包含表示請(qǐng)求和響應(yīng)的各種條件和屬性的各類首部。

編碼提升傳輸效率

1、壓縮傳輸?shù)膬?nèi)容編碼(常用)

gzip

compress

deflate

identity

2、分割發(fā)送的分塊傳輸編碼

把主體分塊的功能稱為分塊傳輸編碼(chunked tranfer coding)

3、發(fā)送多種數(shù)據(jù)的多部分對(duì)象集合

多部分對(duì)象集合包含:

1、multipart/form-data

在web表單文件上傳時(shí)使用

2、multipart/byteranges

狀態(tài)碼206響應(yīng)報(bào)文包含了多個(gè)范圍的內(nèi)容時(shí)使用。


content-Type:mutipart/form-data;

獲取部分內(nèi)容的范圍請(qǐng)求

指定范圍發(fā)送風(fēng)格的請(qǐng)求叫做范圍請(qǐng)求(range request)


Range:bytes=5001-10000

另外多重范圍的范圍請(qǐng)求,響應(yīng)會(huì)在首部字段Content-Type標(biāo)明multipart/byteranges后返回響應(yīng)報(bào)文。

內(nèi)容協(xié)商返回最合適的內(nèi)容

內(nèi)容協(xié)商機(jī)制是指客戶端和服務(wù)器端就響應(yīng)的資源內(nèi)容進(jìn)行交涉,然后提供給客戶端最為合適的資源


Accept

Accept-Charset

Accept-Encoding

Accept-Language

Accept-Language

用單臺(tái)虛擬主機(jī)實(shí)現(xiàn)多個(gè)域名

由于虛擬主機(jī)可以寄存多個(gè)不同主機(jī)名和域名的Web網(wǎng)站,因此在發(fā)送HTTP請(qǐng)求時(shí),必須在Host首部?jī)?nèi)容完整指定主機(jī)名或域名的URI

通信數(shù)據(jù)轉(zhuǎn)發(fā)程序:代理,網(wǎng)關(guān),隧道

1、代理

代理是一種有轉(zhuǎn)發(fā)功能的應(yīng)用程序,它扮演了位于服務(wù)器和客戶端“中間人”的角色,接收由客戶端的請(qǐng)求并轉(zhuǎn)發(fā)給服務(wù)器,同時(shí)也接受服務(wù)器返回的響應(yīng)并轉(zhuǎn)發(fā)給客戶端。

緩存代理

代理轉(zhuǎn)發(fā)響應(yīng),緩存代理回預(yù)先將資源的副本保存在代理服務(wù)器上。

當(dāng)代理再次接收到對(duì)相同資源的請(qǐng)求時(shí),就可以不從源服務(wù)器那里獲取資源,而是將之前的緩存的資源作為響應(yīng)返回。

緩存的有效期

即使存在緩存,也會(huì)因?yàn)榭蛻舳说囊?,緩存的有效期等因素,向源服?wù)器確認(rèn)資源的有效性。若判斷緩存失效,緩存服務(wù)器將會(huì)再次從源服務(wù)器上獲取資源。

客戶端緩存

緩存不僅可以緩存在服務(wù)器中,還可以緩存在客戶端瀏覽器。

2、隧道

隧道可按要求建立起一條與其他服務(wù)器的通信線路,屆時(shí)使用SSL等加密手段進(jìn)行通行。隧道的目的是確??蛻舳伺c服務(wù)器進(jìn)行安全的通信。

HTTP首部

HTTP請(qǐng)求報(bào)文

HTTP協(xié)議的請(qǐng)求和響應(yīng)報(bào)文必定包含HTTP首部。

HTTP請(qǐng)求報(bào)文:方法,URI,HTTP版本,HTTP首部字段等部分構(gòu)成

HTTP響應(yīng)報(bào)文:

在響應(yīng)中,HTTP報(bào)文由HTTP版本,狀態(tài)碼,HTTP首部字段3部分構(gòu)成

HTTP首部字段結(jié)構(gòu)

HTTP首部字段是由首部字段和字段值構(gòu)成:

首部字段:字段值


Content-Type:text/html

keep-Alive:timeout=15,max=100

四種HTTP首部字段類型:

1、通用首部字段

請(qǐng)求報(bào)文和響應(yīng)報(bào)文都會(huì)使用的首部

2、請(qǐng)求首部字段

3、響應(yīng)首部字段

4、實(shí)體首部字段

通用首部字段

首部字段名 | 說(shuō)明

---------------- | -------------------

Cache-Control | 控制緩存的行為

connection | 逐跳首部,連接的管理

Date |創(chuàng)建報(bào)文的日期時(shí)間

Pragma |報(bào)文指令

Transfer-Encoding|報(bào)文末端一覽

Upgrade|升級(jí)為其他協(xié)議

Via|代理服務(wù)器的相關(guān)信息

Warning|錯(cuò)誤通知

請(qǐng)求首部字段

首部字段名 | 說(shuō)明

-------- | --------

Accept|用戶代理可處理的媒體類型

Accept-Charset|優(yōu)先的字符集

Accept-Encoding|優(yōu)先的內(nèi)容編碼

Accept-Language|優(yōu)先的語(yǔ)言

Authorization|Web認(rèn)證信息

Expect|期待服務(wù)器的特定行為

From|用戶的電子郵箱地址

Host|請(qǐng)求資源所在的服務(wù)器

if-Match|比較實(shí)體標(biāo)記

if-Modified-Since|比較資源的更新時(shí)間

if-none-Match|比較實(shí)體標(biāo)記

if-Range|資源未更新時(shí)間發(fā)送實(shí)體Byte的范圍請(qǐng)求

if-Unmodified-Since|比較資源的更新時(shí)間

Range|實(shí)體的范圍請(qǐng)求

Referer|對(duì)請(qǐng)求中URI的原始獲取方

User-Agent|HTTP客戶端程序的信息

響應(yīng)首部字段

首部字段名 | 說(shuō)明

---------|-----------

Accept-Ranges|是否接受字節(jié)范圍的請(qǐng)求

Age|推算資源創(chuàng)建經(jīng)過(guò)時(shí)間

ETag|資源的匹配信息

Location|令客戶端重定向至指定URI

實(shí)體首部字段

首部字段名 | 說(shuō)明

---------|-----------

Allow|資源可支持的HTTP方法

Content-Encoding|實(shí)體主體適用的編碼方式

Content-Language|實(shí)體主體的自然語(yǔ)言

Content-Length|實(shí)體主體的大小

Content-Location|替代資源的URI

Content-Range|實(shí)體主體范圍

Content-Type|實(shí)體主體的媒體類型

Expires|實(shí)體主體過(guò)期的日期時(shí)間

Last-Modified|資源的最后修改時(shí)間

Cache-Control指令簡(jiǎn)要講

緩存請(qǐng)求指令

指令 |說(shuō)明

------|------

no-cache|強(qiáng)制向源服務(wù)器再次驗(yàn)證

no-store|不緩存請(qǐng)求或響應(yīng)的任何內(nèi)容

max-age=「秒」|響應(yīng)的最大age值

緩存響應(yīng)指令

指令|說(shuō)明

-------|------

public|可向任意的提供響應(yīng)的緩存

private|僅向特定的用戶返回響應(yīng)

no-cache|緩存前必須先確定其有效性

no-store|不緩存請(qǐng)求和響應(yīng)的任何內(nèi)容

使用no-cache指令的目的是為了防止從緩存中返回過(guò)期的資源

Connection字段

1、控制不在轉(zhuǎn)發(fā)給代理的首部字段

2、管理持久連接


控制不在轉(zhuǎn)發(fā)給代理的首部字段(代理服務(wù)器)

GET /HTTP/1.1

Upgrage:HTTP/1.1

Connection:Upgrade

Connection:close

不持續(xù)連接

Pragma指令

是HTTP/1.1之前版本的歷史遺留字段:等同于Cache-Control

Transfer-Encoding指令

HTTP/1.1的傳輸編碼方式僅對(duì)分塊傳輸編碼有效。


Transfer-Encoding:chunked

Via指令

使用首部字段Via是為了追蹤客戶端與服務(wù)器端之間的請(qǐng)求和響應(yīng)報(bào)文的傳輸路徑

請(qǐng)求首部字段

Host指令

首部字段Host會(huì)告訴服務(wù)器,請(qǐng)求的資源所處的互聯(lián)網(wǎng)主機(jī)名和端口號(hào)(必須)

if-Match指令

形如if-xxx這種樣式的請(qǐng)求首部字段,都可稱為條件強(qiáng)求

if-Match:”hansheng“

只有當(dāng)if-match的字段值更ETag值匹配一致時(shí),服務(wù)器才會(huì)接受請(qǐng)求

if-Modified-Since:Thu 10 Apr 2016 00:00:00 GET

只要是2016年4月10號(hào)之后更新過(guò)的資源,所以可以接受

Range指令

只需獲取部分資源的范圍請(qǐng)求,包含首部字段Range即可告知服務(wù)器資源的制定范圍

Referer指令

首部字段Referer會(huì)告知服務(wù)器請(qǐng)求的原始資源的URI

User-Agent指令

首部字段User-Agent將創(chuàng)建請(qǐng)求的瀏覽器和用戶代理告訴服務(wù)器

響應(yīng)首部字段

Accept-Ranges指令

首部字段Accept-Range是用來(lái)告知客戶端服務(wù)器是否能處理范圍請(qǐng)求,以指定獲取服務(wù)器某個(gè)部分的資源

ETag

首部字段ETag能告知客戶端實(shí)體表識(shí),資源更新時(shí),有統(tǒng)一的算法規(guī)則。

Location

使用首部字段Location可以將響應(yīng)接收方引導(dǎo)至某個(gè)與請(qǐng)求URI位置不同的資源。

確保Web安全的 HTTPS

HTTP的缺點(diǎn)

  • 通信使用明文(不加密),內(nèi)容可能會(huì)被竊聽;

  • 不驗(yàn)證通信方的身份,因此可能遭遇偽裝;

  • 無(wú)法證明報(bào)文的完整性,所以可能已遭篡改。

HTTP + 加密 + 認(rèn)證 + 完整性保護(hù) = HTTPS

HTTPS并非是應(yīng)用層的一種新協(xié)議。只是普通HTTP通信接口部分用SSL和TLS協(xié)議替代而已。

SSL是獨(dú)立于HTTP的協(xié)議,所以不光是HTTP協(xié)議,其他運(yùn)行在應(yīng)用層的SMTP和Telnet等協(xié)議均可配合SSL協(xié)議使用。所以說(shuō)SSL是當(dāng)今世界上應(yīng)用最為廣泛的網(wǎng)絡(luò)安全技術(shù)。

  • 由于HTTPS需要做服務(wù)器、客戶端雙方加密及解密處理,因此會(huì)消耗CPU和內(nèi)存等硬件資源;

  • 和HTTP相比,SSL通信部分消耗網(wǎng)絡(luò)資源。而SSL通信部分,又因?yàn)橐獙?duì)通信進(jìn)行處理,所以時(shí)間上有延遲了;

  • 和HTTP相比,網(wǎng)絡(luò)負(fù)載和速度上會(huì)變慢2~100倍。

  • http和https使用的是完全不同的連接方式,用的端口也不一樣,前者是80,后者是443。

HTTP狀態(tài)碼

1、100~199 : 成功接受請(qǐng)求,客戶端需提交下一次請(qǐng)求才能完成整個(gè)處理過(guò)程

2、200: OK,客戶端請(qǐng)求成功

3、300~399:請(qǐng)求資源已移到新的地址(302,307,304)

4、401:請(qǐng)求未授權(quán),改狀態(tài)代碼需與WWW-Authenticate報(bào)頭域一起使用

5、403:Forbidden,服務(wù)器收到請(qǐng)求,但是拒絕提供服務(wù)

6、404:Not Found,請(qǐng)求資源不存在,這個(gè)就不用說(shuō)啦

7、500:Internal Server Error,服務(wù)器發(fā)生不可預(yù)期的錯(cuò)誤

8、503:Server Unavailable,服務(wù)器當(dāng)前不能處理客戶端請(qǐng)求,一段時(shí)間后可能恢復(fù)正常

HTTP的功能追加協(xié)議

HTTP的瓶頸

  • 一條連接上只能發(fā)送一個(gè)請(qǐng)求;

  • 請(qǐng)求只能從客戶端開始,客戶端不可以接收除響應(yīng)以外的指令;

  • 請(qǐng)求/響應(yīng)首部未經(jīng)壓縮就發(fā)送,首部信息越多延遲越大;

  • 發(fā)送冗長(zhǎng)的首部,每次互相發(fā)送相同的首部造成的浪費(fèi)較多;

  • 可任意選擇數(shù)據(jù)壓縮格式,非強(qiáng)制壓縮發(fā)送。

SPDY

SPDY沒有完全改寫HTTP協(xié)議,而是在TCP/IP的應(yīng)用層與傳輸層之間通過(guò)新加會(huì)話層的形式運(yùn)作。同時(shí),考慮到安全問題,SDPY規(guī)定通信中使用SSL。

  • 多路復(fù)用流;

  • 賦予請(qǐng)求優(yōu)先級(jí);

  • 壓縮HTTP首部;

  • 推送功能;

  • 服務(wù)器提示功能。

下章講解:TCP/IP協(xié)議精講,敬請(qǐng)期待。。。。。。

最后編輯于
?著作權(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)容

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