第一章:Web及網(wǎng)絡(luò)基礎(chǔ)
- TCP/IP是互聯(lián)網(wǎng)相關(guān)的各類(lèi)協(xié)議族的總稱(chēng)蜂奸,包含TCP、UDP硬萍、HTTP扩所、FTP、IP朴乖、PPPoE等祖屏。
- TCP/IP的分層管理:
? 應(yīng)用層:決定向用戶(hù)提供應(yīng)用服務(wù)時(shí)通信的活動(dòng),如HTTP屬于應(yīng)用層买羞,發(fā)送原始的數(shù)據(jù)報(bào)文袁勺。
? 傳輸層:提供處于網(wǎng)絡(luò)連接中的兩臺(tái)計(jì)算機(jī)之間的數(shù)據(jù)傳輸,如TCP畜普、UDP屬于傳輸層期丰,對(duì)數(shù)據(jù)報(bào)文進(jìn)行分割。
? 網(wǎng)絡(luò)層:處理網(wǎng)絡(luò)上流動(dòng)的數(shù)據(jù)包吃挑,數(shù)據(jù)包時(shí)網(wǎng)絡(luò)傳輸最小的數(shù)據(jù)單位钝荡,對(duì)數(shù)據(jù)包進(jìn)行打包,增加MAC地址進(jìn)行轉(zhuǎn)發(fā)舶衬。
? 數(shù)據(jù)鏈路層:處理連接網(wǎng)絡(luò)的硬件部分埠通。 - 數(shù)據(jù)每經(jīng)過(guò)一層都會(huì)被打上一個(gè)該層所屬的首部信息,接收時(shí)一層一層去掉首部信息约炎,這個(gè)過(guò)程叫封裝植阴。
- MAC地址是網(wǎng)卡所屬的固定地址,基本不會(huì)改變圾浅,IP地址和MAC地址一起確定接收方在哪掠手。
- 建立TCP連接需要三次握手(SYN、_SYN/ACK狸捕、ACK)喷鸽,斷開(kāi)TCP連接四次握手(FIN、_ACK灸拍、_FIN做祝、ACK)。
- URI是統(tǒng)一資源標(biāo)識(shí)符鸡岗,標(biāo)識(shí)某一互聯(lián)網(wǎng)資源混槐;URL是統(tǒng)一資源定位符,標(biāo)識(shí)資源地點(diǎn)轩性,是URI的子集声登。
- 路由器相當(dāng)于物流中的集散中心,路由器有固定的MAC地址,發(fā)送端和接收端有自己的IP(相應(yīng)路由器分配的)悯嗓,因此發(fā)送端先將數(shù)據(jù)包發(fā)給自己的路由器件舵,路由器會(huì)根據(jù)IP地址和MAC去尋找對(duì)應(yīng)的其他路由器進(jìn)行中轉(zhuǎn),最后由接收端的路由器發(fā)給接收端脯厨。
- 網(wǎng)頁(yè)處理大致流程:客戶(hù)端輸入域名 -> DNS解析出IP地址 -> 三次握手簡(jiǎn)歷連接 -> HTTP協(xié)議生成原始請(qǐng)求報(bào)文 -> TCP協(xié)議對(duì)報(bào)文分割铅祸、打包 -> IP協(xié)議搜索對(duì)方地址,一邊中轉(zhuǎn)一邊傳送 -> TCP協(xié)議重組報(bào)文段 -> HTTP協(xié)議解析原始報(bào)文請(qǐng)求內(nèi)容 -> 目標(biāo)計(jì)算機(jī)(服務(wù)器)處理請(qǐng)求并回傳結(jié)果 -> 四次揮手?jǐn)嚅_(kāi)連接合武。
第二章:簡(jiǎn)單的HTTP協(xié)議
- 請(qǐng)求必定由客戶(hù)端發(fā)出临梗,而服務(wù)端回復(fù)響應(yīng)。
- 請(qǐng)求報(bào)文由請(qǐng)求方法眯杏、請(qǐng)求URI夜焦、協(xié)議版本、請(qǐng)求頭岂贩、內(nèi)容實(shí)體五部分構(gòu)成茫经。
響應(yīng)報(bào)文由協(xié)議版本、狀態(tài)碼萎津、狀態(tài)碼原因短語(yǔ)卸伞、響應(yīng)頭、響應(yīng)實(shí)體五部分構(gòu)成锉屈。 - 八種HTTP方法:
? GET:查荤傲,用來(lái)請(qǐng)求訪(fǎng)問(wèn)已被URI識(shí)別的資源。
? POST:改颈渊,用來(lái)傳輸實(shí)體的主體遂黍。
? PUT:增,用來(lái)傳輸文件到服務(wù)器保存到URI指定位置俊嗽,無(wú)驗(yàn)證機(jī)制雾家,一般不使用。
? DELETE:刪绍豁,用來(lái)刪除指定URI位置的文件芯咧,無(wú)驗(yàn)證機(jī)制,一般不使用竹揍。
? HEAD:類(lèi)似GET敬飒,只用于請(qǐng)求頭部一些信息。
? OPTIONS:用來(lái)查詢(xún)針對(duì)請(qǐng)求URI指定資源的支持方法芬位。
? TRANCE:請(qǐng)求可能經(jīng)過(guò)一些代理服務(wù)器轉(zhuǎn)發(fā)无拗,用來(lái)讓W(xué)eb服務(wù)器將之前的請(qǐng)求通信環(huán)回給客戶(hù)端。
? CONNECT:要求在與代理服務(wù)器通信時(shí)建立隧道昧碉,實(shí)現(xiàn)用隧道協(xié)議進(jìn)行TCP通信蓝纲,主要使用SSL和TLS進(jìn)行隧道加密傳輸阴孟。 - HTTP/1.0中的鏈接是無(wú)狀態(tài)的,每次斷開(kāi)鏈接后才能再次鏈接税迷;HTTP/1.1中默認(rèn)是持久鏈接,三次握手之后可以多次發(fā)送請(qǐng)求響應(yīng)锹漱,也使管線(xiàn)化方式成為可能(不必等待上一次響應(yīng)可再次發(fā)送請(qǐng)求)箭养;持久鏈接減少了TCP鏈接的重復(fù)建立和斷開(kāi)所造成的額外開(kāi)銷(xiāo),減輕了服務(wù)器負(fù)載哥牍。
- 由于是HTTP協(xié)議無(wú)狀態(tài)的毕泌,采用Cookie技術(shù)來(lái)保存客戶(hù)端狀態(tài),首次請(qǐng)求后服務(wù)端會(huì)下發(fā)set-cookie在響應(yīng)中嗅辣,下次請(qǐng)求時(shí)客戶(hù)端帶上cookie即可撼泛。
第三章:HTTP報(bào)文內(nèi)的HTTP信息
- 請(qǐng)求報(bào)文和響應(yīng)報(bào)文一般都分為三部分:請(qǐng)求行、請(qǐng)求頭澡谭、請(qǐng)求體愿题。
- 報(bào)文是HTTP通信中的基本單位,8位字節(jié)流蛙奖;實(shí)體主體指請(qǐng)求體部分潘酗。一般報(bào)文主體就是實(shí)體主體,當(dāng)傳輸中編碼時(shí)雁仲,實(shí)體主體內(nèi)容發(fā)生變化仔夺,才會(huì)與報(bào)文主體有差異。
- 常見(jiàn)的幾種壓縮內(nèi)容編碼:gzip攒砖、compress缸兔、deflate、identity吹艇。
- 當(dāng)傳輸大量?jī)?nèi)容時(shí)惰蜜,可以把數(shù)據(jù)分割成多塊,讓瀏覽器逐步顯示頁(yè)面掐暮,實(shí)體主體最后一塊會(huì)用"0(CR+LF)"來(lái)標(biāo)記蝎抽。
- 發(fā)送多種數(shù)據(jù)的多部分對(duì)象集合,采用MIME機(jī)制路克,使用Multipart來(lái)標(biāo)記內(nèi)容類(lèi)型樟结,如multipart/form-data、multipart/byteranges等精算。
- 使用boundary字符串來(lái)劃分多部分對(duì)象集合指明的各類(lèi)主體瓢宦,在頭部Content-Type中定義boundary=XXX,使用--XXX來(lái)標(biāo)記起始位置灰羽、分隔位置和末尾位置驮履,每一部分都可以有實(shí)體頭和實(shí)體主體鱼辙。
- 內(nèi)容協(xié)商返回最合適的內(nèi)容,三種類(lèi)型:服務(wù)器驅(qū)動(dòng)協(xié)商(服務(wù)端處理)玫镐、客戶(hù)端驅(qū)動(dòng)協(xié)商(瀏覽器處理)倒戏、透明協(xié)商(雙向處理)。
第四章:返回結(jié)果的HTTP狀態(tài)碼
- 5中常見(jiàn)類(lèi)型:
? 1XX:接收的請(qǐng)求正在處理恐似。
? 2XX:請(qǐng)求正常處理完畢杜跷。200成功、204成功但無(wú)內(nèi)容返回矫夷、206分段請(qǐng)求成功葛闷。
? 3XX:需要附加操作以完成請(qǐng)求。301永久重定向双藕、302臨時(shí)重定向淑趾、303臨時(shí)重定向(指明客戶(hù)端需要使用GET請(qǐng)求)、304資源找到但不符合請(qǐng)求條件忧陪、307臨時(shí)重定向(不能將POST轉(zhuǎn)為GET)扣泊。
? 4XX:客戶(hù)端錯(cuò)誤。400語(yǔ)法錯(cuò)誤服務(wù)端無(wú)法理解赤嚼、401需要認(rèn)證客戶(hù)端旷赖、403請(qǐng)求被禁止、404請(qǐng)求URI不存在更卒。
? 5XX:服務(wù)端錯(cuò)誤等孵。500服務(wù)端本身發(fā)生錯(cuò)誤、503服務(wù)器處于超負(fù)載或正在停機(jī)維護(hù)蹂空。
第五章:與HTTP協(xié)作的WEB服務(wù)器
- 一臺(tái)Web服務(wù)器可以利用虛擬主機(jī)技術(shù)搭建多個(gè)web站點(diǎn)俯萌,多個(gè)站點(diǎn)的域名不同,但是映射的IP相同上枕,這時(shí)候就需要用的頭部字段Host(必傳)咐熙,來(lái)確認(rèn)要請(qǐng)求哪個(gè)Uri。
- 通信數(shù)據(jù)轉(zhuǎn)發(fā)程序:
? 代理:扮演了客戶(hù)端和服務(wù)器的中間人角色辨萍,不改變請(qǐng)求Uri棋恼,每一次轉(zhuǎn)發(fā)會(huì)加入Via首部信息,分為緩存代理和透明代理兩種類(lèi)型锈玉,可以作用于內(nèi)網(wǎng)訪(fǎng)問(wèn)控制爪飘。
? 網(wǎng)關(guān):作為中間的轉(zhuǎn)發(fā)服務(wù)器,可以轉(zhuǎn)發(fā)請(qǐng)求也可以自己直接對(duì)請(qǐng)求進(jìn)行處理拉背,另外它可以進(jìn)行非HTTP協(xié)議的轉(zhuǎn)發(fā)服務(wù)师崎,對(duì)接其他各種系統(tǒng),功能更叼椅棺。
? 隧道:在客戶(hù)端和服務(wù)器相距甚遠(yuǎn)時(shí)進(jìn)行中轉(zhuǎn)犁罩,保證穩(wěn)定通信齐蔽,采用SSL等一些加密手段可以保證雙端的安全通信。
第六章:HTTP首部
- 首部分為四種類(lèi)型:通用首部床估、請(qǐng)求首部含滴、響應(yīng)首部、實(shí)體首部丐巫,作用是為報(bào)文數(shù)據(jù)增加一些附加信息蛙吏。
- 各個(gè)首部常用字段:
? 通用首部字段:Catch-Control、Connection鞋吉、Date、Via等
? 請(qǐng)求首部字段:Host励烦、Accept谓着、Authorization、Range坛掠、Referer赊锚、User-Agent等。
? 響應(yīng)首部字段:Age屉栓、Location舷蒲、Server、Set-cookie等友多。
? 實(shí)體首部字段:Content-length牲平、Content-Type、Expires等域滥。 - Http首部字段將定義成緩存代理和非緩存代理的行為纵柿,分為2種類(lèi)型:
? 端到端首部(End-to-end Header 會(huì)轉(zhuǎn)發(fā)給請(qǐng)求/響應(yīng)的最終目標(biāo),必須保存在由緩存生成的響應(yīng)中)
? 逐跳首部(Htp-by-hop Header 只對(duì)單次轉(zhuǎn)發(fā)有效启绰,會(huì)因通過(guò)緩存而不再次轉(zhuǎn)發(fā)) - 首部字段格式為key:value昂儒,多個(gè)字段以","分隔,權(quán)重信息以q(0~1 默認(rèn)1)標(biāo)記委可,以";"加在value里渊跋,如Accept-Charset:iso-8895-5, unicode-1-1;q=0.8
- Catch-Control中no-cache代表不緩存過(guò)期的資源,緩存會(huì)向源服務(wù)器進(jìn)行有效期確認(rèn)后處理資源着倾;而no-store才是真正的不進(jìn)行緩存拾酝。
- HTTP1.1版本默認(rèn)是持久化連接(Connection:Keep-Alive),服務(wù)端想斷開(kāi)鏈接可以設(shè)置Connection:Close屈呕。
- Accept字段表示客戶(hù)端接收類(lèi)型微宝,使用type/subtype格式,可一次指定多種類(lèi)型虎眨,也可以加權(quán)重蟋软,如image/jpeg镶摘。
- set-cookie是服務(wù)端的response首部,cookie是客戶(hù)端的request首部岳守。
第七章:確保WEB安全的HTTPS
- HTTP的三個(gè)缺點(diǎn):傳輸內(nèi)容可能被竊聽(tīng)凄敢、無(wú)法驗(yàn)證雙方的身份、傳輸內(nèi)容可能被篡改湿痢。
- HTTP協(xié)議本身沒(méi)有加密機(jī)制涝缝,因此可以通過(guò)雙方自己制定加密規(guī)則對(duì)傳輸內(nèi)容進(jìn)行加密;或者配合SSL或TSL進(jìn)行HTTPS通信譬重。
- HTTP + 加密 + 認(rèn)證 +完整性保護(hù) = HTTPS拒逮,SSL處于應(yīng)用層和TCP/IP之間。
- 對(duì)稱(chēng)加密算法使用同一個(gè)秘鑰進(jìn)行加密解密臀规,非對(duì)稱(chēng)加密算法使用公鑰和私鑰進(jìn)行加密解密滩援;通常對(duì)稱(chēng)加密更快,因此一般結(jié)合使用塔嬉,通過(guò)對(duì)稱(chēng)加密報(bào)文玩徊,非對(duì)稱(chēng)加密秘鑰的混合加密方式。
- CA認(rèn)證流程:
①由于服務(wù)端要下發(fā)公鑰給客戶(hù)端谨究,公鑰可能在下發(fā)過(guò)程中被篡改恩袱,因此需要驗(yàn)證服務(wù)端下發(fā)公鑰的可靠性。
②服務(wù)端會(huì)向CA機(jī)構(gòu)申請(qǐng)公鑰胶哲,CA會(huì)用自己的私鑰對(duì)將要下發(fā)給服務(wù)端的公鑰進(jìn)行簽名畔塔,并嵌入證書(shū)發(fā)給服務(wù)端,服務(wù)端將這個(gè)CA簽發(fā)的公鑰證書(shū)發(fā)給客戶(hù)端即可纪吮。
客戶(hù)端瀏覽器內(nèi)置了CA機(jī)構(gòu)的公鑰俩檬,會(huì)對(duì)服務(wù)端下發(fā)的公鑰證書(shū)的簽名進(jìn)行校驗(yàn),校驗(yàn)通過(guò)說(shuō)明公鑰證書(shū)確實(shí)是CA機(jī)構(gòu)頒發(fā)的碾盟,值得信任(中間篡改者沒(méi)有CA的私鑰因此無(wú)法篡改公鑰的簽名信息)棚辽。
③客戶(hù)端就可以用服務(wù)端發(fā)的這個(gè)公鑰對(duì)自己生成的對(duì)稱(chēng)秘鑰進(jìn)行加密,發(fā)給服務(wù)端冰肴,之后的請(qǐng)求就用該對(duì)稱(chēng)秘鑰加密內(nèi)容即可屈藐。 - HTTPS通信步驟:
? 客戶(hù)端發(fā)起請(qǐng)求->服務(wù)端下發(fā)公鑰->客戶(hù)端驗(yàn)證公鑰->客戶(hù)端用公鑰加密對(duì)稱(chēng)秘鑰發(fā)給服務(wù)端->服務(wù)端成功解密獲取對(duì)稱(chēng)秘鑰(正式開(kāi)始通信)->客戶(hù)端發(fā)送對(duì)稱(chēng)密文->服務(wù)端解密并回復(fù)->斷開(kāi)鏈接。
? 這中間的混合加密都是HTTPS自己做的熙尉,我們雙方不用自己具體去指定加密算法联逻。 - 有些機(jī)構(gòu)自己頒發(fā)證書(shū),這些證書(shū)不內(nèi)置在瀏覽器里检痰,因此稱(chēng)為自簽名證書(shū)包归,服務(wù)端下發(fā)此類(lèi)證書(shū)時(shí),我們要么直接信任該證書(shū)铅歼,要么在客戶(hù)端事先植入自簽名公鑰等公壤。
- HTTPS的通信速度由于多次傳輸换可、加密解密等會(huì)受到影響,比HTTP慢2~100倍厦幅,因此敏感數(shù)據(jù)使用HTTPS沾鳄,一般數(shù)據(jù)使用HTTP即可。
第八章:確認(rèn)訪(fǎng)問(wèn)用戶(hù)身份
- HTTP1.1使用4種認(rèn)證方式:BASIC認(rèn)證(基本認(rèn)證)确憨、DIGEST認(rèn)證(摘要認(rèn)證)译荞、SSL客戶(hù)端認(rèn)證、FromBase(基于表單認(rèn)證)休弃。
- 幾種認(rèn)證方式特點(diǎn):
? BASIC認(rèn)證第一次服務(wù)端會(huì)以401返回碼返回吞歼,客戶(hù)端將ID和密碼已Base64編碼后發(fā)給服務(wù)端,例如VPN第一次登錄時(shí)填寫(xiě)賬號(hào)密碼一樣塔猾,不過(guò)Base64編碼時(shí)可逆的浆熔,這種方式不太安全。
? DIGEST認(rèn)證同樣使用質(zhì)詢(xún)/響應(yīng)的方式桥帆,客戶(hù)端先發(fā)送認(rèn)證要求,服務(wù)端返回質(zhì)詢(xún)碼慎皱,客戶(hù)端計(jì)算后返回響應(yīng)碼結(jié)果老虫,服務(wù)端驗(yàn)證認(rèn)證結(jié)果,安全也是有限茫多。
? SSL認(rèn)證需要客戶(hù)端證書(shū)祈匙,雙向認(rèn)證,需要花錢(qián)天揖。夺欲。
? FromBase就是web應(yīng)用自己寫(xiě)的表單認(rèn)證了,平時(shí)的web應(yīng)用那樣自己認(rèn)證今膊。 - 雖然可以web應(yīng)用認(rèn)證些阅,但是HTTP是無(wú)狀態(tài)協(xié)議,服務(wù)端需要再次認(rèn)證的話(huà)需要將第一次認(rèn)證的sessionID放到set-cookie字段返回給客戶(hù)端斑唬,客戶(hù)端保存起來(lái)下次發(fā)送該cookie市埋,服務(wù)端找到相應(yīng)的sessionID進(jìn)行認(rèn)證。
第九章:基于HTTP的功能追加協(xié)議
- HTTP比較簡(jiǎn)單恕刘,因此性能還是有一定瓶頸的缤谎,無(wú)狀態(tài),且每次請(qǐng)求都要刷新整個(gè)response褐着,于是有了Ajax通過(guò)JS腳本發(fā)送請(qǐng)求刷新局部頁(yè)面的API。
- 為了實(shí)現(xiàn)長(zhǎng)連接,WebSocket技術(shù)問(wèn)世演熟,一旦瀏覽器與服務(wù)器建立了WebSocket協(xié)議的全雙工通信連接,之后就走這個(gè)協(xié)議進(jìn)行通信了项郊,類(lèi)似Java中的Socket。
- WebSocket第一次通信時(shí)需要一次Http的握手姻政,首先客戶(hù)端請(qǐng)求頭添加Upgrade:websocket呆抑、Connection:Upgrade、Sec-WebSoeket-Key汁展、Origin鹊碍、Sec-Websocket-Protocol、Sec-Websocket-Version等首部字段食绿;服務(wù)端返回101 Switching Protocols響應(yīng)確認(rèn)使用WebSocket協(xié)議侈咕,包括Connection:Upgrade、Sec-Websocket-Accept器紧、Sec-Websocket-Protocol等首部字段耀销。
后面的請(qǐng)求就使用ws://example.com/
協(xié)議通信了。
第十章:構(gòu)建Web內(nèi)容的技術(shù):
- Web頁(yè)面幾乎全部由Html文檔構(gòu)建铲汪,Html是超文本標(biāo)記語(yǔ)言熊尉,超文本是一種文檔系統(tǒng),可以將任意位置的信息和其他信息(圖片掌腰、鏈接等)建立關(guān)聯(lián)狰住,即超鏈接文本,瀏覽器可以解析html文檔渲染出豐富的富文本頁(yè)面齿梁,markdown也是類(lèi)似的催植。
- Html5解決了瀏覽器兼容性問(wèn)題(標(biāo)簽解析不一致、語(yǔ)法更加簡(jiǎn)單等)勺择,并且動(dòng)畫(huà)更加簡(jiǎn)單和豐富创南。
- Css屬于樣式標(biāo)準(zhǔn)之一,配合Html解析成各種樣式效果省核,更多時(shí)候我們使用動(dòng)態(tài)構(gòu)建Html網(wǎng)頁(yè)技術(shù)來(lái)實(shí)現(xiàn)頁(yè)面動(dòng)態(tài)改變稿辙,使用JavaScript腳本語(yǔ)言可以控制html元素和改變其樣式,類(lèi)似Android中Java代碼控制控件一樣气忠。
- Web應(yīng)用的作用是每次客戶(hù)端請(qǐng)求Web服務(wù)器從而動(dòng)態(tài)下發(fā)html文檔來(lái)返回用戶(hù)需要的頁(yè)面邓深,配合JS請(qǐng)求和編輯Html文檔,瀏覽器負(fù)責(zé)渲染笔刹。
- Servlet是一種能在服務(wù)器上創(chuàng)建動(dòng)態(tài)內(nèi)容的程序芥备,運(yùn)行在Web容器中,常駐內(nèi)存舌菜,因此執(zhí)行效率較高萌壳。
第十一章:Web攻擊技術(shù)
- HTTP只是一個(gè)單純的協(xié)議機(jī)制,本身并不具備安全機(jī)制。需要客戶(hù)端和服務(wù)器之間自己做安全防范袱瓮。
- Web攻擊分為主動(dòng)攻擊和被動(dòng)攻擊兩種缤骨。主動(dòng)攻擊就是直接攻擊Web應(yīng)用,注入攻擊代碼尺借;被動(dòng)攻擊就類(lèi)似釣魚(yú)網(wǎng)站绊起,誘導(dǎo)用戶(hù)自己進(jìn)入圈套非法獲取用戶(hù)信息等。
- 幾種攻擊方式:
? 跨站腳本攻擊:動(dòng)態(tài)創(chuàng)建非法HTML標(biāo)簽或Js腳本進(jìn)行攻擊燎斩,獲取cookie或數(shù)據(jù)等(被動(dòng)攻擊)虱歪。
? SQL注入攻擊:服務(wù)端的SQL語(yǔ)句也是根據(jù)客戶(hù)端操作動(dòng)態(tài)生成的,可以插入命令執(zhí)行非法SQL查詢(xún)等(主動(dòng)攻擊)栅表。
? OS命令注入攻擊:Web應(yīng)用有時(shí)候收到客戶(hù)端請(qǐng)求會(huì)通過(guò)命令打開(kāi)本地其他應(yīng)用進(jìn)行一些操作(例如發(fā)郵件)笋鄙,此時(shí)可以注入非法命令執(zhí)行非法操作(主動(dòng)攻擊)。
? HTTP首部注入攻擊:攻擊者可以攔截請(qǐng)求或相應(yīng)首部進(jìn)行非法首部字段注入怪瓶,例如常見(jiàn)的緩存服務(wù)器首部注入攻擊(主動(dòng)攻擊)萧落。
? Dos攻擊:拒絕服務(wù)攻擊,通過(guò)海量僵尸請(qǐng)求使服務(wù)器處理過(guò)載洗贰,來(lái)逼迫服務(wù)器停止服務(wù)找岖。