微信公眾號(hào)創(chuàng)建平臺(tái)seo網(wǎng)絡(luò)優(yōu)化
1. HTTP常見狀態(tài)碼
2. 3開頭重定向,4開頭客戶端錯(cuò)誤,5開頭服務(wù)端錯(cuò)誤
2. HTTP 報(bào)文
1. start-line:請(qǐng)求行,可以為以下兩者之一:
- 請(qǐng)求行: GET /hello-world2.html HTTP/1.1
- 狀態(tài)行:HTTP/1.1 200 OK
- 請(qǐng)求行由方法字段、URL字段和HTTP協(xié)議版本字段。其中,方法字段嚴(yán)格區(qū)分大小寫,當(dāng)前HTTP協(xié)議中的方法都是大寫
- 狀態(tài)行包括三個(gè)字段:協(xié)議版本、狀態(tài)碼與原因短語。
2 . 請(qǐng)求頭
Host: 請(qǐng)求的主機(jī)名和端口號(hào),虛擬主機(jī)環(huán)境下用于不同的虛擬主機(jī)
Referer:指明了請(qǐng)求當(dāng)前資源的原始資源的URL
User-Agent: 用戶代理,使用什么工具發(fā)出的請(qǐng)求
1、Accept首部:用戶標(biāo)明客戶自己更傾向于支持的能力
Accept: 指明服務(wù)器能發(fā)送的媒體類型
Accept-Charset: 支持使用的字符集
Accept-Encoding: 支持使用的編碼方式
Accept-Language: 支持使用語言
2、條件請(qǐng)求首部:
Expect: 告訴服務(wù)器能夠發(fā)送來哪些媒體類型
If-Modified-Since: 是否在指定時(shí)間以來修改過此資源
If-None-Match:如果提供的實(shí)體標(biāo)記與當(dāng)前文檔的實(shí)體標(biāo)記不符,就獲取此文檔
跟安全相關(guān)的請(qǐng)求首部:
Authorization: 客戶端提交給服務(wù)端的認(rèn)證數(shù)據(jù),如帳號(hào)和密碼
Cookie: 客戶端發(fā)送給服務(wù)器端身份標(biāo)識(shí)
3. 響應(yīng)頭
Date標(biāo)頭:消息產(chǎn)生的時(shí)間
Age標(biāo)頭:(從最初創(chuàng)建開始)響應(yīng)持續(xù)時(shí)間
Server標(biāo)頭: 向客戶端標(biāo)明服務(wù)器程序名稱和版本
ETage標(biāo)頭:不透明驗(yàn)證者
Location標(biāo)頭:URL備用的位置
Content-Length標(biāo)頭:實(shí)體的長度
Content-Tyep標(biāo)頭:實(shí)體的媒體類型
4.GET 和 POST 有什么區(qū)別?
- GET 的語義是從服務(wù)器獲取指定的資源
- POST 的語義是根據(jù)請(qǐng)求負(fù)荷(報(bào)文body)對(duì)指定的資源做出處理。
- 兩者都可以帶數(shù)據(jù),GET請(qǐng)求的數(shù)據(jù)拼接到url上,POST在body上
- 由于GET放在url上,故攜帶的數(shù)據(jù)覽器會(huì)對(duì) URL 的長度有限制(HTTP協(xié)議本身對(duì) URL長度并沒有做任何規(guī)定),POST能攜帶的資源更多。
- 安全: 請(qǐng)求方法不會(huì)「破壞」服務(wù)器上的資源。GET安全, POST不一定。
- 冪等:多次執(zhí)行相同的操作,結(jié)果都是「相同」的。GET冪等, POST不一定。
- GET只接受ASCII字符,而POST沒有限制。.
5. HTTP 緩存技術(shù)
強(qiáng)緩存指的是只要瀏覽器判斷緩存沒有過期,則直接使用瀏覽器的本地緩存,決定是否使用緩存的主動(dòng)性在于瀏覽器這邊,原理:
- 當(dāng)瀏覽器第一次請(qǐng)求訪問服務(wù)器資源時(shí),服務(wù)器會(huì)在返回這個(gè)資源的同時(shí),在 Response 頭部加上 Cache-Control,Cache-Control 中設(shè)置了過期時(shí)間大小;
- 瀏覽器再次請(qǐng)求訪問服務(wù)器中的該資源時(shí),先從瀏覽器找,會(huì)先通過請(qǐng)求資源的時(shí)間與 Cache-Control 中設(shè)置的過期時(shí)間大小,來計(jì)算出該資源是否過期,如果沒有,則使用該緩存,否則重新請(qǐng)求服務(wù)器;
- 服務(wù)器再次收到請(qǐng)求后,會(huì)再次更新 Response 頭部的 Cache-Control。
5. 協(xié)商緩存
- 協(xié)商緩存是指通過服務(wù)端告知客戶端是否可以使用緩存的方式,即與服務(wù)端協(xié)商之后,通過協(xié)商結(jié)果來判斷是否使用本地緩存。
- 第一種(基于時(shí)間實(shí)現(xiàn)的):請(qǐng)求頭部中的 If-Modified-Since 字段與響應(yīng)頭部中的 Last-Modified 字段實(shí)現(xiàn),這兩個(gè)字段的意思是:
響應(yīng)頭部中的 Last-Modified:標(biāo)示這個(gè)響應(yīng)資源的最后修改時(shí)間;
請(qǐng)求頭部中的 If-Modified-Since:
當(dāng)資源過期了,發(fā)現(xiàn)響應(yīng)頭中具有 Last-Modified 聲明,則再次發(fā)起請(qǐng)求的時(shí)候帶上 Last-Modified 的時(shí)間,
服務(wù)器收到請(qǐng)求后發(fā)現(xiàn)有 If-Modified-Since 則與被請(qǐng)求資源的最后修改時(shí)間進(jìn)行對(duì)比(Last-Modified),
如果最后修改時(shí)間較新(大),說明資源又被改過,則返回最新資源,HTTP 200 OK;如果最后修改時(shí)間較舊(小),說明資源無新修改,響應(yīng) HTTP 304 走緩存。
- 第二種(基于唯一標(biāo)識(shí)實(shí)現(xiàn)的):請(qǐng)求頭部中的 If-None-Match 字段與響應(yīng)頭部中的 ETag 字段,這兩個(gè)字段的意思是:
響應(yīng)頭部中 Etag:唯一標(biāo)識(shí)響應(yīng)資源;
請(qǐng)求頭部中的 If-None-Match:
當(dāng)資源過期時(shí),瀏覽器發(fā)現(xiàn)響應(yīng)頭里有 Etag,則再次向服務(wù)器發(fā)起請(qǐng)求時(shí),會(huì)將請(qǐng)求頭 If-None-Match 值設(shè)置為 Etag 的值。
服務(wù)器收到請(qǐng)求后進(jìn)行比對(duì),如果資源沒有變化返回 304,如果資源變化了返回 200。
可以理解一個(gè)是用修改時(shí)間來比較,一個(gè)直接比較是否修改比較的是Etag唯一標(biāo)識(shí)
注意:協(xié)商緩存這兩個(gè)字段都需要配合強(qiáng)制緩存中 Cache-Control 字段來使用,只有在未能命中強(qiáng)制緩存的時(shí)候,才能發(fā)起帶有協(xié)商緩存字段的請(qǐng)求。
可知:
- 緩存始終在瀏覽器
- 如果沒有命中強(qiáng)制緩存的情況,可能是因?yàn)闉g覽器設(shè)置的cache-control失效了(因?yàn)橹皇且粋€(gè)時(shí)間斷),但是注意并不代表瀏覽器的緩存真的失效。
- 真正判斷是否失效時(shí)服務(wù)端再次協(xié)商緩存來判斷的。
6. HTTPS 與 HTTP
HTTP 與 HTTPS 的區(qū)別
· HTTP 是超文本傳輸協(xié)議,信息是**明文傳輸,**存在安全風(fēng)險(xiǎn)的問題。HTTPS 則解決 HTTP 不安全的缺陷,在 TCP 和 HTTP 網(wǎng)絡(luò)層之間加入了 SSL/TLS 安全協(xié)議,使得報(bào)文能夠加密傳輸。
· HTTP 連接建立相對(duì)簡單, TCP 三次握手之后便可進(jìn)行 HTTP 的報(bào)文傳輸。而 HTTPS 在 TCP 三次握手之后,還需進(jìn)行 SSL/TLS 的握手過程,才可進(jìn)入加密報(bào)文傳輸。
· 兩者的默認(rèn)端口不一樣,HTTP 默認(rèn)端口號(hào)是 80,HTTPS 默認(rèn)端口號(hào)是 443。
· HTTPS 協(xié)議需要向 CA(證書權(quán)威機(jī)構(gòu))申請(qǐng)數(shù)字證書,來保證服務(wù)器的身份是可信的。
7. SSL/TSL四次握手
- 客戶端發(fā)送請(qǐng)求(ClientHello)
客戶端(通常是瀏覽器)先向服務(wù)器發(fā)出加密通信的請(qǐng)求,這被叫做ClientHello請(qǐng)求??蛻舳颂峁┝?#xff1a;
- 支持的協(xié)議版本,比如TLS 1.0版。
- 一個(gè)客戶端生成的隨機(jī)數(shù),用于后面生成“對(duì)話密鑰”
- 支持的加密方法,如rsa公鑰加密
- 服務(wù)器回應(yīng)(SeverHello)
- 確認(rèn)使用的加密通信協(xié)議版本,比如TLS 1.0版本。如果瀏覽器與服務(wù)器支持的版本不一致,服務(wù)器關(guān)閉加密通信
- 確認(rèn)加密方法,比如RSA公鑰加密。
- 返回加密公鑰服務(wù)器證書
- 客戶端回應(yīng)
- 驗(yàn)證證書的合法性(頒發(fā)證書的機(jī)構(gòu)是否合法,證書中包含的網(wǎng)站地址是否與正在訪問的地址一致等),如果證書受信任,則瀏覽器欄里面會(huì)顯示一個(gè)小鎖頭,否則會(huì)給出證書不受信的提示。
- 如果證書受信任,或者是用戶接受了不受信的證書,瀏覽器會(huì)生成一串隨機(jī)數(shù)的密碼,并用證書中提供的公鑰加密。
- 使用約定好的HASH計(jì)算握手消息,并使用生成的隨機(jī)數(shù)對(duì)消息進(jìn)行加密,最后將之前生成的所有信息發(fā)送給網(wǎng)站。
- 服務(wù)器
- 使用自己的私鑰將信息解密取出密碼,使用密碼解密瀏覽器發(fā)來的握手消息,并驗(yàn)證HASH是否與瀏覽器發(fā)來的一致。
- 使用密碼加密一段握手消息,發(fā)送給瀏覽器。
下面這個(gè)圖比較清楚
需要注意的是:最后用的對(duì)稱加密是由, 客戶端生成的隨機(jī)字符串和服務(wù)端生成的隨機(jī)字符串以及 隨后用公鑰加密生成的隨機(jī)字符串,三者用約定的加密算法得到的一個(gè)密鑰。
8. HTTP明文傳輸?shù)娘L(fēng)險(xiǎn)以及解決方法
- 風(fēng)險(xiǎn):
- 信息加密:交互信息無法被竊取,但你的號(hào)會(huì)因?yàn)椤缸陨硗洝官~號(hào)而沒。
- 校驗(yàn)機(jī)制:無法篡改通信內(nèi)容,篡改了就不能正常顯示,但百度「競價(jià)排名」依然可以搜索垃圾廣告。
- 身份證書:證明淘寶是真的淘寶網(wǎng)還是冒充,但你的錢還是會(huì)因?yàn)椤付缡帧苟鴽]。
總結(jié): 竊取,篡改,冒充
- 解決:
- 混合加密的方式實(shí)現(xiàn)信息的機(jī)密性,解決了竊聽的風(fēng)險(xiǎn)。
- 摘要算法的方式來實(shí)現(xiàn)完整性,它能夠?yàn)閿?shù)據(jù)生成獨(dú)一無二的「指紋」,指紋用于校驗(yàn)數(shù)據(jù)的完整性,解決了篡改的風(fēng)險(xiǎn)。
- 將服務(wù)器公鑰放入到數(shù)字證書中,解決了冒充的風(fēng)險(xiǎn)。
數(shù)字簽名:
注意:
1 . 數(shù)字簽名里面,私鑰加密,公鑰解密
2 . 且加密和解密的一直是一個(gè)哈希值(由內(nèi)容計(jì)算出來,所謂的數(shù)字簽名),這個(gè)哈希值也會(huì)隨著內(nèi)容發(fā)出去,解密后的數(shù)字簽名和哈希值做比對(duì),判斷是否被篡改。
9.抓包原理
比如我用的Charles:
- Charles作為一個(gè)中間人代理,當(dāng)瀏覽器和服務(wù)器通信時(shí),Charles接收服務(wù)器的證書,但動(dòng)態(tài)生成一張證書發(fā)送給瀏覽器
- 也就是說Charles作為中間代理在瀏覽器和服務(wù)器之間通信,所以通信的數(shù)據(jù)可以被Charles攔截并解密。
- 由于Charles更改了證書,瀏覽器校驗(yàn)不通過會(huì)給出安全警告,必須安裝Charles的證書后才能進(jìn)行正常訪問。
總結(jié):Charles需要做的事情是對(duì)客戶端偽裝服務(wù)端,對(duì)服務(wù)端偽裝客戶端:
注意:前提是客戶端選擇信任并安裝Charles的CA證書。
10. 請(qǐng)求方法
-
get 方法
發(fā)送一個(gè)請(qǐng)求來取得服務(wù)器上的某一資源。 -
post 方法
向 url 指定的資源提交數(shù)據(jù)或附加新的數(shù)據(jù)。 -
put 方法
put 方法跟 post 方法很像,也是向服務(wù)器提交數(shù)據(jù),但是 put 方法指向了資源在服務(wù)器上的位置,而 post 方法沒有。 -
head 方法
只請(qǐng)求頁面的首部。 -
delete 方法
刪除服務(wù)器上的某資源。 -
options 方法
options 方法用于獲取當(dāng)前 url 所支持的方法。如果請(qǐng)求成功,會(huì)有一個(gè) allow 的頭包含類似 get、post 這樣的信息。 -
trace 方法
trace 方法被用于激發(fā)一個(gè)遠(yuǎn)程的,應(yīng)用層的請(qǐng)求消息回路。類似echo? -
connect 方法
把請(qǐng)求連接轉(zhuǎn)換到透明的 tcp/ip 通道。