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)期待。。。。。。