1. TCP/IP分層
TCP/IP協(xié)議族分為四層:應(yīng)用層、傳輸層、網(wǎng)絡(luò)層和數(shù)據(jù)鏈路層。OSI模型將網(wǎng)絡(luò)通信分為七層:應(yīng)用層、表示層、會(huì)話層、傳輸層、網(wǎng)絡(luò)層、數(shù)據(jù)鏈路層、物理層。
利用TCP/IP協(xié)議族進(jìn)行網(wǎng)絡(luò)通信時(shí),會(huì)通過分層順序與對(duì)方進(jìn)行通信。發(fā)送端從應(yīng)用層往下走,接收端則往應(yīng)用層往上走。
發(fā)送端的客戶端在應(yīng)用層(HTTP協(xié)議)發(fā)送一個(gè)想看到某個(gè)Web頁面的Http請(qǐng)求。在傳輸層(TCP協(xié)議)把應(yīng)用層處接收到的數(shù)據(jù)(HTTP請(qǐng)求報(bào)文)進(jìn)行分割,并將各個(gè)報(bào)文打上標(biāo)記序號(hào)及端口號(hào)后轉(zhuǎn)發(fā)給網(wǎng)絡(luò)層。在網(wǎng)絡(luò)層(IP協(xié)議),增加作為通信目的地的MAC 地址后轉(zhuǎn)發(fā)給鏈路層,直至發(fā)送到接收端服務(wù)器。接收端服務(wù)器接收到數(shù)據(jù),按序往上層發(fā)送,一直到應(yīng)用層。
發(fā)送端在層與層傳輸數(shù)據(jù)時(shí),每經(jīng)過一層必定打上一個(gè)該層所屬的首部信息,例如http首部,TCP 首部,ip首部,以太網(wǎng)首部。接收端在層與層傳輸數(shù)據(jù)時(shí),每經(jīng)過一層會(huì)將對(duì)應(yīng)的首部消掉。
IP 地址指明了節(jié)點(diǎn)被分配的地址,MAC 地址是指網(wǎng)卡所屬固定的地址。IP地址可以與MAC 地址進(jìn)行配對(duì)。IP 地址可變換,但是MAC 地址基本上不會(huì)更改
使用ARP協(xié)議憑借MAC地址進(jìn)行通信。
2. TCP 三次握手
為準(zhǔn)確無誤的將數(shù)據(jù)送達(dá)目標(biāo)處,TCP 協(xié)議采用三次握手策略。握手過程使用TCP標(biāo)志(flag)-SYN(synchronize)和ACK(acknowledgement)。發(fā)送端首先發(fā)送一個(gè)帶有SYN標(biāo)志的數(shù)據(jù)包給對(duì)方。接收到后回傳一個(gè)帶有SYN/ACK標(biāo)志的數(shù)據(jù)包以示傳達(dá)確認(rèn)信息。最后發(fā)送端再回傳一個(gè)帶有ACK標(biāo)志的數(shù)據(jù)包,代表“握手”結(jié)束。
3. URI
URI(統(tǒng)一資源標(biāo)識(shí)符)用字符串標(biāo)識(shí)某一互聯(lián)網(wǎng)資源,而
URL(統(tǒng)一資源定位符)表示資源的地點(diǎn)(互聯(lián)網(wǎng)上所處的位置)??梢奤RL是URI的子集。
4. HTTP報(bào)文
- 請(qǐng)求報(bào)文是有請(qǐng)求方法、請(qǐng)求URL、協(xié)議版本、可選的請(qǐng)求首部字段 和內(nèi)容實(shí)體構(gòu)成。
- 響應(yīng)報(bào)文是有協(xié)議版本號(hào)、狀態(tài)碼、狀態(tài)碼原因短語、可選的響應(yīng)首部字段以及實(shí)體主體構(gòu)成。
- Http 是一種不保存狀態(tài)的協(xié)議,可通過cookie實(shí)現(xiàn)狀態(tài)管理
- HTTP 報(bào)文不一定有報(bào)文主體,例如HEAD 方法返回的報(bào)文。
- HTTP 報(bào)文本身是有多行(CR+LF作為換行符)數(shù)據(jù)構(gòu)成的字符串文本。 可以分為報(bào)文首部,及報(bào)文主體
5. 提高HTTP 效率
HTTP協(xié)議初始版本中,每進(jìn)行一次HTTP通信就要斷開一次TCP連接,協(xié)議后來提高效率方式有
- 持久連接,減少TCP重復(fù)建立和斷開所造成的額外開銷,減少服務(wù)器負(fù)載,提高響應(yīng)效率。
- 管線化。HTTP 初始版本,發(fā)送請(qǐng)求需等待并受到響應(yīng),才能發(fā)送下個(gè)請(qǐng)求。管線化后可不用等待,可同時(shí)并發(fā)多個(gè)請(qǐng)求。
HTTP/1.1 所以連接默認(rèn)都是持久連接。但在HTTP/1.0內(nèi)并未標(biāo)準(zhǔn)化。
6. 狀態(tài)碼
- 1XX,信息性狀態(tài)碼,接受請(qǐng)求正在處理
- 2XX,成功狀態(tài)碼,請(qǐng)求正常處理完畢
- 3XX, 重定向狀態(tài)碼,需要進(jìn)行附加操作以完成請(qǐng)求
- 4XX,客戶端錯(cuò)誤狀態(tài)碼,服務(wù)器無法處理請(qǐng)求
- 5XX,服務(wù)器錯(cuò)誤狀態(tài)碼,服務(wù)器處理請(qǐng)求出
- 301:永久重定向,表示該請(qǐng)求資源已被分配了新的URL,以后應(yīng)使用資源現(xiàn)在所指定的URI。
- 302:臨時(shí)性重定向,表示請(qǐng)求資源已被分配新的URL,希望用戶本次能使用新的URI訪問。
- 301、302標(biāo)準(zhǔn)是禁止將POST方法改變成GET方法
7、 首部
- 當(dāng)首部重復(fù),目前規(guī)范尚未明確,不同瀏覽器處理邏輯各部相同。
- 客戶端請(qǐng)求首部包含
Cache-Control:no-cache,則表明客戶端將不會(huì)接受緩存過的響應(yīng),于是中間的緩存服務(wù)器必須將客戶端請(qǐng)求轉(zhuǎn)發(fā)給源服務(wù)器。 - 客戶端請(qǐng)求頭包含max-age指令,如果判定緩存資源緩存時(shí)間數(shù)比指定數(shù)值更小,那么客戶端就接受緩存資源。當(dāng)指定max-age為0,那么緩存服務(wù)器通常需要將請(qǐng)求轉(zhuǎn)發(fā)給源服務(wù)器。
- HTTP/1.1版本緩存服務(wù)器遇到Expires首部及max-age指令,會(huì)忽略掉Expires首部,而HTTP/1.0版本相反,max-age指令會(huì)被忽略掉。
- HTTP/1.1版本默認(rèn)是持久連接。當(dāng)服務(wù)器想明確斷開連接時(shí),則指定Connction 首部字段值為Close。而之前HTTP協(xié)議版本默認(rèn)都是非持久化連接。如果希望在舊版本HTTP協(xié)議維持持久化連接,則指定Connecton首部字段值為Keep-Alive.
- 首部字段Upgrade 用于升級(jí)協(xié)議版本。使用首部Upgrade時(shí),還需要額外指定Connection:Upgrade。
- 首部字段Host會(huì)告知服務(wù)器,請(qǐng)求資源所處的互聯(lián)網(wǎng)主機(jī)名和端口號(hào)。Host是HTTP/1.1規(guī)范中唯一一個(gè)必須被包含在請(qǐng)求內(nèi)的首部字段。Host 在單臺(tái)服務(wù)器,分配多個(gè)域名虛擬主機(jī)。用 來明確指出請(qǐng)求主機(jī)名。
8. Cookie
- 服務(wù)器通過Set-Cookie首部控制cookie,包含NAME=VALUE、expires=DATE、path=PATH、domain=域名、Secure、HttpOnly
- 當(dāng)省略expires屬性,其Cookie有效期及限于維持瀏覽器會(huì)話(Session)時(shí)間段內(nèi)。這通常限于瀏覽器應(yīng)用被關(guān)閉之前。
- 添加secure屬性用于限制Web頁面僅在Https安全連接時(shí),才可以發(fā)送Cookie.
- HttpOnly屬性使Cookie不能被JavaScript腳本訪問,主要目的為防止跨站腳本攻擊(XSS)對(duì)Cookie信息的竊取。
- 一旦Cookie 從服務(wù)器發(fā)送給客戶端,服務(wù)端就不存在可以顯示刪除Cookie的方法,但是可以通過覆蓋已過期Cookie,實(shí)現(xiàn)對(duì)客戶端Cookie實(shí)質(zhì)性刪除操作。
9. HTTP缺點(diǎn)
- 無狀態(tài)協(xié)議
- 通信使用明文(不加密),內(nèi)容可能會(huì)被竊聽(竊聽風(fēng)險(xiǎn))
- 不驗(yàn)證通信放身份,因此有可能遭遇偽裝(冒充風(fēng)險(xiǎn))
- 無法驗(yàn)證報(bào)文完整性,英雌可能已遭篡改。(篡改風(fēng)險(xiǎn))
10.HTTPS
- Https是身披SSL外殼的HTTP,并非是應(yīng)用層的一種新協(xié)議,只是Http通信接口部分用SSL(Secure Socket Layer)和TLS(Transport Layer Security)協(xié)議代替而已。通常HTTP直接和TCP通信,當(dāng)時(shí)用SSL時(shí),則演變成先和SSL通信,再由SSL和TCP通信。
- 采用SSL 后,HTTP擁有HTTPS的加密、證書和完整性保護(hù)。
- SSL 時(shí)獨(dú)立于HTTP的協(xié)議,其他應(yīng)用層的協(xié)議均可配合SSL協(xié)議使用
- HTTPS使用SSL和TLS這兩個(gè)協(xié)議,TLS是以SSL為原型開發(fā)的協(xié)議,有時(shí)統(tǒng)稱SSL。當(dāng)前主流為SSL3.0和TLS1.0
- HTTPS 采用共享密鑰加密(對(duì)稱密鑰加密)和公開密鑰加密(不對(duì)稱密鑰加密)兩者并用混合加密機(jī)制。交換密鑰環(huán)節(jié)使用公開密鑰加密方式,之后建立通信交換報(bào)文階段則使用共享密鑰加密方式。
- 公開密碼加密通信存在無法證明公開密鑰就是貨真價(jià)實(shí)的公開密鑰??墒褂脭?shù)字證書認(rèn)證機(jī)構(gòu)和其他相關(guān)機(jī)構(gòu)頒發(fā)的公開證書。
- 整個(gè)SSL握手階段都不加密(也沒法加密),都是明文的。建立SSL連接采用對(duì)稱加密報(bào)文。
11. HTTPS 缺點(diǎn)
- 證書成本
- 降低訪問速度(多次握手)
- 改造HTTPS后,之前HTTP 跳轉(zhuǎn)到 HTTPS 的方式增加了用戶訪問耗時(shí)(多數(shù)網(wǎng)站采用302跳轉(zhuǎn))
- HTTPS 涉及到的安全算法會(huì)消耗 CPU 資源
12. HTTPs 為啥能安全通信
SSL/TLS協(xié)議的基本思路是采用公鑰加密法,也就是說,客戶端先向服務(wù)器端索要公鑰,然后用公鑰加密信息,服務(wù)器收到密文后,用自己的私鑰解密
- 保證公鑰不必篡改:將公鑰放在數(shù)字證書中。只要證書是可信的,公鑰就是可信的
- 減少公鑰加密時(shí)間: 非對(duì)稱公鑰只用于SSL 握手階段加密"對(duì)話密鑰"本身,建立SSL連接后,通過對(duì)稱密鑰加密報(bào)文,減少非對(duì)稱密碼加密解密耗時(shí)。
- SSL/TLS協(xié)議的基本過程:
- 客戶端向服務(wù)器索要并驗(yàn)證公鑰
- 雙方協(xié)商對(duì)話密碼
- 雙方采用對(duì)話密碼進(jìn)行加密通信。
13. HTTPS 通信過程
- 客戶端通過發(fā)送CLient Hello 報(bào)文開始SSL 通信,報(bào)文中包含客戶端支持的SSL版本、加密算法、支持壓縮方法、生成隨機(jī)數(shù)。
- 服務(wù)器可進(jìn)行SSL通信時(shí),會(huì)以Server Hello報(bào)文作為應(yīng)答。在報(bào)文中確認(rèn)通信SSL協(xié)議、加密方法 及生成的隨機(jī)數(shù),稍后用于生成"對(duì)話密鑰"
- 之后服務(wù)器發(fā)送Cerficate報(bào)文,報(bào)文包含公開密鑰證書
- 最后服務(wù)器發(fā)送Server Hello Done 報(bào)文通知客戶端,最初SSL 握手協(xié)商部分結(jié)束
- 客戶端收到證書后,首先驗(yàn)證服務(wù)器證書。如果證書不是可信機(jī)構(gòu)頒布、或者證書中的域名與實(shí)際域名不一致、或者證書已經(jīng)過期,就會(huì)向訪問者顯示一個(gè)警告,由其選擇是否還要繼續(xù)通信,客戶端以Client Key Exchange報(bào)文作為回應(yīng),報(bào)文中包含通信加密中使用的Pre-master secret 隨機(jī)密鑰串。
- 客戶端繼續(xù)發(fā)送Change Cipher Spec報(bào)文。提示服務(wù),在此報(bào)文之后通信會(huì)采用Pre-master secret 密鑰加密
- 客戶端發(fā)送Finished 報(bào)文。報(bào)文包含連接至今全部報(bào)文的全體校驗(yàn)值。這次握手協(xié)商是否能成功,要以服務(wù)器是否能夠正確解密該報(bào)文作為判斷標(biāo)準(zhǔn)
- 服務(wù)器同樣發(fā)送Change Cipher Spec 報(bào)文
- 服務(wù)器同樣發(fā)送Finished 報(bào)文
- SSL 連接建立完成,通信受SSL保護(hù),客戶端與服務(wù)器進(jìn)入加密通信,就完全是使用普通的HTTP協(xié)議,只不過用"會(huì)話密鑰"加密內(nèi)容。
14. 瀏覽器驗(yàn)證證書
- 瀏覽器讀取服務(wù)器發(fā)送過來的證書,對(duì)證書所有者、有效期等信息進(jìn)行一一校驗(yàn),看是否過期等
- 瀏覽器開始查找操作系統(tǒng)中已內(nèi)置的受信任的證書發(fā)布機(jī)構(gòu)CA,與服務(wù)器發(fā)來的證書中的頒發(fā)者CA比對(duì),用于校驗(yàn)證書是否為合法機(jī)構(gòu)頒發(fā)
- 如果找不到,瀏覽器就會(huì)報(bào)錯(cuò),說明服務(wù)器發(fā)來的證書是不可信任的
- 如果找到,那么瀏覽器就會(huì)從操作系統(tǒng)中取出 頒發(fā)者CA 的公鑰,然后對(duì)服務(wù)器發(fā)來的證書里面的簽名進(jìn)行解密
- 瀏覽器使用相同的hash算法計(jì)算出服務(wù)器發(fā)來的證書的hash值,將這個(gè)計(jì)算的hash值與證書中簽名做對(duì)比
- 對(duì)比結(jié)果一致,則證明服務(wù)器發(fā)來的證書合法,沒有被冒充
- 此時(shí)瀏覽器就可以讀取證書中的公鑰,用于后續(xù)加密了
15. HTTPS 升級(jí)操作
- 獲取證書
- 安裝證書 (證書可以放在/etc/ssl目錄(Linux 系統(tǒng)))
- 修改鏈接:因?yàn)榧用芫W(wǎng)頁內(nèi)如果有非加密的資源,瀏覽器是不會(huì)加載那些資源的,需要將http鏈接改成Https鏈接)
- 301重定向:使用 301 重定向,將 HTTP 協(xié)議的訪問導(dǎo)向 HTTPS 協(xié)議
- 參考:
16. session 管理及認(rèn)證過程
- 客戶端將用戶名和密碼等登錄信息放入報(bào)文實(shí)體部分提交給服務(wù)器。
- 服務(wù)器對(duì)客戶端發(fā)送過來的登錄信息進(jìn)行身份驗(yàn)證,并生成識(shí)別用戶的session ID,將用戶身份信息及認(rèn)證狀態(tài)與Session綁定記錄在服務(wù)端。向客戶端返回響應(yīng),在首部字段Set-Cookie寫入Session ID
- 客戶端接受到從服務(wù)器發(fā)來的Session ID后,會(huì)將作為Cookie保存在本地。
- 客戶端下次向服務(wù)器請(qǐng)求,瀏覽器自動(dòng)發(fā)送Cookie,Session ID 也隨之發(fā)送到服務(wù)器。
- 服務(wù)器通過驗(yàn)證接收到的Session ID識(shí)別用戶和其認(rèn)證狀態(tài)。
17. HTTP 標(biāo)準(zhǔn)缺點(diǎn)
- 一條連接上只可發(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ā)送
18. SPDY
- SPDY 沒有完全改寫HTTP 協(xié)議,而是在TCP/IP的應(yīng)用于傳輸層之間通過新加的會(huì)話層形式運(yùn)作。同時(shí),考慮安全性問題,SPDY規(guī)定通信中使用SSL。SPDY 以會(huì)話層的形式加入,控制對(duì)數(shù)據(jù)的流動(dòng),但還是采用HTTP 建立通信連接。
- 優(yōu)點(diǎn):
- 多路復(fù)用
- 賦予請(qǐng)求優(yōu)先級(jí)
- 壓縮HTTP 首部
- 推送功能
- 服務(wù)器提示功能
19. Websocket
- WebSocket通過Http建立連接,然后升級(jí)到WebSocket協(xié)議,之后所有的通信都依靠這個(gè)專門的協(xié)議進(jìn)行。
- 與HTTP相比,Websocket連接建立后就希望一直保持連接狀態(tài),減少每次連接開銷,而且Websocket首部信息很小,通信量也減少。
20. 網(wǎng)絡(luò)攻擊
- 因輸出值轉(zhuǎn)義不完全引發(fā)安全漏洞
- 跨站腳本攻擊(XSS)
- SQL注入(SQL injection)
- OS命令注入攻擊(OS Command Injection)
- HTTP首部注入攻擊(HTTP Header Injection)
- 郵件首部注入攻擊(Mail Header Injection)
- 目錄遍歷攻擊(Directory Traversal)
- 遠(yuǎn)程文件包含漏洞
- 設(shè)計(jì)上缺陷導(dǎo)致安全漏洞
- 強(qiáng)制瀏覽
- 不正確的錯(cuò)誤消息處理
- 開放重定向
- 會(huì)話管理疏忽引發(fā)安全漏洞
- 會(huì)話劫持(Session Hijack)
- 會(huì)話固定攻擊
- 跨站點(diǎn)請(qǐng)求偽造(CSRF)
- 其他安全漏洞
- 密碼破解
- 點(diǎn)擊劫持(Clickjacking)
- DoS攻擊(Denial of Service attack)
- 后門程序