1. 簡(jiǎn)介
HTTP是位于應(yīng)用層的一個(gè)無(wú)狀態(tài)的協(xié)議冰木,默認(rèn)HTTP的端口號(hào)為80柬甥,HTTPS的端口號(hào)為443灶轰。HTTP協(xié)議本身是不可靠的實(shí)現(xiàn)洲守,要實(shí)現(xiàn)可靠地?cái)?shù)據(jù)傳輸需要依靠底層的TCP協(xié)議疑务。
2. 實(shí)現(xiàn)
HTTP的報(bào)文包括請(qǐng)求報(bào)文和響應(yīng)報(bào)文兩種
請(qǐng)求報(bào)文
請(qǐng)求報(bào)文是瀏覽器向服務(wù)器發(fā)出請(qǐng)求的報(bào)文,由第一行的請(qǐng)求行和后面的首部行組成梗醇,每一行都由回車換行(\r\n)結(jié)尾知允,當(dāng)請(qǐng)求的方法是POST的時(shí)候,會(huì)在首部行結(jié)尾再回車換行加上POST攜帶的實(shí)體數(shù)據(jù)叙谨。
請(qǐng)求行 \r\n
首部行 \r\n
\r\n
實(shí)體行
請(qǐng)求行
- 方法字段:
- GET(主要方法)
- POST
- HEAD
- PUT
- DELETE
- URI字段:請(qǐng)求對(duì)象的標(biāo)識(shí)
- HTTP版本字段:有HTTP/1.0和HTTP/1.1兩種
首部行
- Host:要訪問(wèn)的主機(jī)名
- Connection:值為keep-alive表示該連接為持續(xù)連接温鸽,為close表示非持續(xù)連接。
- Accept: 可接受的MIME類型,即報(bào)文類型涤垫。
- User-Agent: 用戶代理姑尺, 表示請(qǐng)求的瀏覽器的類型。
- Referer: 表示發(fā)出請(qǐng)求時(shí)處于哪個(gè)頁(yè)面蝠猬,可用做反盜鏈切蟋。
- Accept-Encoding: 告訴服務(wù)器自己接受的頁(yè)面編碼。
- Accept-Language: 告訴服務(wù)器自己接受的網(wǎng)頁(yè)語(yǔ)言榆芦。
- Cookie: 將服務(wù)器存儲(chǔ)在瀏覽器本地的Cookie值發(fā)送給服務(wù)器柄粹,實(shí)現(xiàn)無(wú)狀態(tài)的。HTTP協(xié)議的會(huì)話跟蹤匆绣。
響應(yīng)報(bào)文
請(qǐng)求報(bào)文是服務(wù)器向?yàn)g覽器發(fā)出響應(yīng)報(bào)文驻右,由第一行的狀態(tài)行、接著首部行崎淳、最后的實(shí)體行組成堪夭,每一行都由回車換行(\r\n)結(jié)尾,其中實(shí)體行就是請(qǐng)求的數(shù)據(jù)拣凹。
狀態(tài)行 \r\n
首部行 \r\n
\r\n
實(shí)體行
狀態(tài)行
- 協(xié)議版本:有HTTP/1.0和HTTP/1.1兩種
- 狀態(tài)碼:
- 200:成功森爽。
- 301:內(nèi)容已經(jīng)永久移動(dòng),瀏覽器會(huì)重定向到響應(yīng)指定的新URI嚣镜。
- 302:內(nèi)容臨時(shí)移動(dòng)
- 304:內(nèi)容未被修改拗秘,響應(yīng)不包含內(nèi)容
- 400:請(qǐng)求不能被服務(wù)器理解。
- 403:無(wú)權(quán)訪問(wèn)該文件祈惶。
- 404:不能找到請(qǐng)求文件雕旨。
- 500:服務(wù)器內(nèi)部錯(cuò)誤。
- 501:服務(wù)器不支持請(qǐng)求的方法捧请。
- 505:服務(wù)器不支持請(qǐng)求的版本凡涩。
- 狀態(tài)信息:狀態(tài)碼的含義
首部行
- Connection:值為keep-alive表示該連接為持續(xù)連接,為close表示非持續(xù)連接疹蛉。
- Date:表示報(bào)文發(fā)送的時(shí)間活箕。
- Server:Web服務(wù)器用來(lái)處理請(qǐng)求的軟件信息。
- Cache-control:緩存控制
- ETag:響應(yīng)對(duì)象的標(biāo)識(shí)符
- Last-Modfied:對(duì)象創(chuàng)建或者最后修改的時(shí)間可款。
- Content-Encoding:Web服務(wù)器表明了自己用什么壓縮方法壓縮對(duì)象育韩。
- Content-Length:被發(fā)送的對(duì)象的字節(jié)數(shù)。
- Content-Type:表示響應(yīng)的實(shí)體行的對(duì)象類型闺鲸。
緩存機(jī)制
HTTP的緩存機(jī)制是通過(guò)Cache-control字段來(lái)控制筋讨,Cache-control是一個(gè)通用首部,請(qǐng)求和響應(yīng)的首部都可以使用摸恍,有幾個(gè)常見的值:
- private: 只允許發(fā)出請(qǐng)求的客戶端緩存
- public: 允許客戶端和代理服務(wù)器緩存
- max-age=x: 緩存的有效期為x秒
- no-cache: 不直接使用緩存悉罕,使用前得向服務(wù)器發(fā)出請(qǐng)求驗(yàn)證緩存有效性
- If-None-Match/Etag:當(dāng)緩存的內(nèi)容具有Etag標(biāo)識(shí)赤屋,就向服務(wù)器發(fā)送含有If-None-Match字段的請(qǐng)求報(bào)文以判斷緩存的內(nèi)存是否與服務(wù)器上的內(nèi)容一致,如果一致壁袄,服務(wù)器就會(huì)返回304狀態(tài)的響應(yīng)報(bào)文表示可以直接使用緩存类早,否則返回200狀態(tài)含有新資源實(shí)體的響應(yīng)報(bào)文。
- If-Modified-Since/Last-Modified:當(dāng)緩存的內(nèi)容具有Last-Modified(最后修改時(shí)間)嗜逻,就向服務(wù)器發(fā)送含有If-Modified-Since字段的請(qǐng)求報(bào)文以判斷緩存的內(nèi)存在服務(wù)器上的是否改變涩僻,如果時(shí)間一致,就會(huì)返回304狀態(tài)的響應(yīng)表示可以直接使用緩存栈顷,否則返回200狀態(tài)含有新資源實(shí)體的響應(yīng)報(bào)文令哟。
- no-store: 所有內(nèi)容都不會(huì)緩存
HTTPS
HTTPS中的S指的是SSL(安全套接字層)或TLS(傳輸層安全),TLS是基于SSL開發(fā)的妨蛹。
HTTP的缺點(diǎn)
HTTP屬于不安全的通信協(xié)議:
- 使用明文不加密,內(nèi)容容易被竊讀
- 不能驗(yàn)證對(duì)方身份晴竞,對(duì)方可能是一個(gè)偽裝的通訊方
- 無(wú)法驗(yàn)證報(bào)文的完整性蛙卤,報(bào)文可能被篡改
加密算法
要解決第一個(gè)問(wèn)題必須采用加密算法對(duì)報(bào)文進(jìn)行加密,常見的加密算法有對(duì)稱加密(AES算法噩死,加密解密使用同一把秘鑰)颤难、非對(duì)稱加密(RSA算法,加密和解密采用不同秘鑰)已维,HTTPS采用混合加密算法集合和兩者的優(yōu)點(diǎn)行嗤。由于非對(duì)稱加密開銷比對(duì)稱加密大,所以通信過(guò)程中報(bào)文的加密采用對(duì)稱加密垛耳,而非對(duì)稱加密用于一開始共享秘鑰的傳輸栅屏。
通信過(guò)程
客戶端發(fā)出請(qǐng)求報(bào)文,報(bào)文包含客戶端支持的SSL協(xié)議版本堂鲜、加密算法栈雳。
-
服務(wù)器發(fā)送數(shù)字證書,數(shù)字證書可以向數(shù)字證書認(rèn)證機(jī)構(gòu)申請(qǐng)缔莲,證書包含以下內(nèi)容:
- 證書的發(fā)布機(jī)構(gòu)CA
- 證書的有效期
- 證書所有人的名稱
- 公開秘鑰
- 簽名算法
- 數(shù)字簽名(證書內(nèi)容摘要值的加密結(jié)果)
客戶端收到證書后驗(yàn)證證書的合法性哥纫。數(shù)字簽名是數(shù)字證書機(jī)構(gòu)使用私鑰進(jìn)行加密的結(jié)果,得在瀏覽器本地可以找到對(duì)應(yīng)的公鑰進(jìn)行解密痴奏,為了保證證書沒(méi)有被篡改蛀骇,客戶端會(huì)根據(jù)簽名算法計(jì)算出證書內(nèi)容的摘要值(哈希算法),如與解密后的數(shù)字簽名一致的話就證明內(nèi)容沒(méi)有被篡改并且對(duì)方是一個(gè)合法通信方读拆。
隨后客戶端產(chǎn)生一個(gè)
pre-master secret
的隨機(jī)數(shù)用于對(duì)稱加密擅憔,使用數(shù)字證書里的公開秘鑰對(duì)隨機(jī)數(shù)加密并發(fā)送給服務(wù)器。服務(wù)器收到包含共享秘鑰的報(bào)文后用自己的私鑰解密得到共享秘鑰檐晕。