1 歷史
時(shí)光回到1989年榜旦,地處瑞典日內(nèi)瓦的一個(gè)研究所,門口的牌子上寫著歐洲核子研究組織的爍金大字景殷,里面的一個(gè)研究員蒂姆.伯納斯.李提出了一種設(shè)想:利用現(xiàn)在的通信技術(shù)溅呢,讓不同地方的研究員方便地共享知識(shí)文檔。1990年底猿挚,該組織研發(fā)了第一臺(tái)Web服務(wù)器和Web瀏覽器咐旧。按照這個(gè)設(shè)計(jì)的實(shí)現(xiàn),如果不同地方的研究員绩蜻,都搭建一個(gè)類似的服務(wù)站铣墨,他們之間就可以互相自由訪問,結(jié)果就形成了一張覆蓋所有站點(diǎn)的大網(wǎng)办绝。隨著新站點(diǎn)的不斷加入伊约,這張大網(wǎng)的維度就會(huì)不斷膨脹词顾,也就是現(xiàn)在稱為萬維網(wǎng)的原因。
當(dāng)年用來瀏覽網(wǎng)站的Web瀏覽器客戶端碱妆,名稱叫WWW,現(xiàn)在人們已經(jīng)習(xí)慣用WWW代指萬維網(wǎng)∥羟現(xiàn)代的萬維網(wǎng)系統(tǒng)提出了3項(xiàng)構(gòu)建技術(shù):1 指定文檔所在地址的URL疹尾;2 用來展現(xiàn)文檔的超文本標(biāo)記語言HTML;3 傳遞文檔的協(xié)議HTTP骤肛∧杀荆可以說,HTTP協(xié)議是構(gòu)成萬維網(wǎng)的重要基石之一腋颠。
作為萬維網(wǎng)的入口——瀏覽器客戶端繁成,對其的所有權(quán)爆發(fā)了一系列的爭奪戰(zhàn)。PC時(shí)代淑玫,微軟通過操作系統(tǒng)預(yù)裝IE的優(yōu)勢巾腕,戰(zhàn)勝網(wǎng)景,成為霸主絮蒿。后面隨著移動(dòng)端崛起的變化尊搬,霸主地位不斷被谷歌、蘋果等其他眾多公司挑戰(zhàn)土涝,現(xiàn)在知名的瀏覽器客戶端有Chrome\Safari\Edge\Firfox\百度\夸克等佛寿。
萬維網(wǎng)的服務(wù)器端,最知名的莫過于Apache,可以運(yùn)行在幾乎所有的Unix但壮、Linux冀泻、Windows、MacOS操作系統(tǒng)上蜡饵,除此之外弹渔,現(xiàn)在經(jīng)常使用的還有Nginx、Tomcat等验残。
而HTTP自從1997年1月公布HTTP/1.1版本后捞附,一直延續(xù)至2015年,期間幾乎沒有變化您没,現(xiàn)在還在大規(guī)模使用鸟召。2015年發(fā)布的HTTP/2.0,還在不斷的推廣中氨鹏。
2 體系
兩個(gè)人的順利交流欧募,需要使用相同的語言和相同的理解方式。不同的計(jì)算機(jī)要想通過網(wǎng)絡(luò)順利通信仆抵,也必須基于相同的數(shù)據(jù)傳遞方式跟继。這種計(jì)算機(jī)相互通信的規(guī)則种冬,統(tǒng)稱為協(xié)議。
那協(xié)議為什么要分層呢舔糖?還是拿兩個(gè)人的對話為例娱两,一個(gè)人的聲音首先經(jīng)過發(fā)生器官——聲帶來振動(dòng),然后通過嘴巴金吗、空氣十兢,到達(dá)對方的耳朵中,接聽后的人將聲音傳送到大腦當(dāng)中進(jìn)行處理摇庙,最后理解了對方所說的意思旱物。如果采用一個(gè)協(xié)議來規(guī)范這整個(gè)通話的過程,那任何一處變化就會(huì)引起整體的變化卫袒。比如如果在太空中宵呛,根本不存在空氣。通話就需要更換成無線電夕凝、或者觀察對方口型的方式宝穗,按照規(guī)定,這個(gè)通話的協(xié)議就要跟著變化码秉。
換一種方式讽营,如果采用分層的方式,就可以避免上面變化的情況泡徙。比如在頂層規(guī)定:110就代表有緊急情況要處理橱鹏。至于傳輸和接收的方式,放在其他層次去協(xié)定堪藐。這樣當(dāng)一個(gè)人不能發(fā)聲時(shí)莉兰,可以采用手寫、擺放石頭礁竞、修理稻田等方式糖荒,也可以采用像「孤注一擲」中被困主角那樣,在襯衫上留下6(二進(jìn)制為110)的方式模捂。這樣頂層的規(guī)定不變捶朵,只需要變化傳輸和接收這個(gè)層次的協(xié)議就可以了。
為了順利實(shí)現(xiàn)計(jì)算機(jī)的網(wǎng)絡(luò)通信狂男,定義了多個(gè)分層的協(xié)議综看,統(tǒng)稱為TCP/IP協(xié)議簇。TCP/IP協(xié)議按照層次分為4層:應(yīng)用層岖食、網(wǎng)絡(luò)層红碑、傳輸層和數(shù)據(jù)鏈路層。其中HTTP處于應(yīng)用層。
3 組成
在應(yīng)用層析珊,規(guī)定了系統(tǒng)與用戶交互的具體接口羡鸥。下面是一個(gè)簡化的網(wǎng)絡(luò)請求和響應(yīng)報(bào)文:
請求
-------------------
GET / HTTP/1.1
Accept:*/*
Accept-Encoding:gzip, deflate, br
Accept-Language:zh-CN,zh;q=0.9
Cache-Control:no-cache
User-Agent:Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/117.0.0.0 Mobile Safari/537.36
(空行)
-------------------
響應(yīng)
-------------------
HTTP/1.1 200 0K
Date:Wed, 18 Oct 2023 06:35:36 GMT
Server:TLB
Content-Type:text/html
X-Tt-Trace-Tag:id=06;cdn-cache=miss;type=dyn
(空行)
報(bào)文體
-------------------
請求報(bào)文分為請求行、請求頭部和請求體忠寻。響應(yīng)報(bào)文分為狀態(tài)行惧浴、響應(yīng)頭部和響應(yīng)體∞忍辏客戶端將請求報(bào)文傳遞給傳輸層時(shí)赶舆,會(huì)加上傳輸層頭部信息;向下傳遞給網(wǎng)絡(luò)層時(shí)祭饭,會(huì)加上網(wǎng)絡(luò)層頭部信息;再向下傳遞給數(shù)據(jù)鏈路層叙量,會(huì)加上數(shù)據(jù)鏈路層的信息倡蝙。發(fā)送給服務(wù)端后,服務(wù)端會(huì)按照相反的方式層層解析绞佩,最后收到請求的內(nèi)容寺鸥,處理后會(huì)將結(jié)果按照同樣的方式進(jìn)行返回。
一次請求中品山,通過響應(yīng)頭的狀態(tài)碼可以快速確定響應(yīng)的具體情況胆建。狀態(tài)碼由3位數(shù)字和原因短語組成,比如200 OK肘交。第一位指定了響應(yīng)的類別笆载,響應(yīng)類別有如下5種:
狀態(tài)碼的類別 | 類別 | 原因短語 |
---|---|---|
1XX | Informational(信息性狀態(tài)碼) | 接收的譴求正在處理 |
2XX | Success(成功狀態(tài)碼) | 請求正賞處理完畢 |
3XX | Redirection( 重定向狀態(tài)碼) | 需要進(jìn)行附加操作以完成請求 |
4XX | Client Error(客戶端錯(cuò)誤狀態(tài)碼) | 服務(wù)器無達(dá)處理請求 |
5XX | Server Error (服務(wù)器錯(cuò)誤狀態(tài)碼) | 服務(wù)器處理請求出錯(cuò) |
在實(shí)際使用中,根據(jù)具體使用情況涯呻,會(huì)對HTTP傳輸?shù)臄?shù)據(jù)進(jìn)行優(yōu)化處理凉驻。比如壓縮傳輸?shù)臄?shù)據(jù)以加快傳輸效率、分割大數(shù)據(jù)為小塊進(jìn)行傳輸复罐、集成不同數(shù)據(jù)格式的內(nèi)容統(tǒng)一返回等等涝登,這些措施大大豐富了HTTP的使用場景。
4 演化
HTTP協(xié)議是無狀態(tài)的協(xié)議效诅,也就是不記錄客戶端的狀態(tài)變化胀滚。這在展示頁面的Web類應(yīng)用上無影響,但是隨著時(shí)代的發(fā)展乱投,出現(xiàn)了很多復(fù)雜的Web應(yīng)用咽笼,比如在線交流、在線購物等Web應(yīng)用戚炫,需要對客戶端的身份狀態(tài)進(jìn)行管理『趾桑現(xiàn)在常見的方式是通過在HTTP首部添加Cookie,來區(qū)別用戶的不同身份和狀態(tài)嘹悼。
隨著Facebook叛甫、Twitter和微博這種SNS網(wǎng)站的出現(xiàn)层宫,要求用戶能夠近實(shí)時(shí)地觀看到海量用戶發(fā)布的內(nèi)容。使用HTTP時(shí)其监,要想知道服務(wù)端是否存在內(nèi)容更新萌腿,需要不斷的輪詢服務(wù)器,這樣就會(huì)存在大量的無效請求抖苦。為了應(yīng)對這種使用場景毁菱,出現(xiàn)了不同的處理技術(shù)。比如Ajax锌历,利用異步JavaScript和DOM的操作贮庞,可以局部更新頁面,減少請求的通信量究西。Comet可以讓客戶端發(fā)送請求后窗慎,服務(wù)端不立即返回,而是延遲到內(nèi)容更新時(shí)卤材。
不過最有效的解決方式遮斥,還是谷歌的SPDY協(xié)議。它是在HTTP和TCP之間扇丛,新增加了一個(gè)會(huì)話層术吗。而且考慮到安全性,規(guī)定通信中必須使用SSL帆精。相比HTTP,SPDY有以下優(yōu)點(diǎn):1 多路復(fù)用卓练,一個(gè)TCP鏈接,可以處理任意多的HTTP請求昆庇;2賦予請求優(yōu)先級,在并發(fā)請求時(shí)整吆,可以適配低帶寬時(shí)的響應(yīng)慢問題拱撵;3 壓縮HTTP首部,使請求和響應(yīng)的字節(jié)數(shù)都有效減少表蝙;4 推送功能拴测,服務(wù)器可以主動(dòng)向客戶端推送新內(nèi)容府蛇;5 提示客戶端,在資源更新時(shí)提示客戶端,避免其繼續(xù)使用緩存务荆。不過SPDY只能對單個(gè)域名的通信實(shí)現(xiàn)多路復(fù)用妆距,如果一個(gè)網(wǎng)站使用了不同域名的資源,改善效果就會(huì)有限制函匕。
隨著HTML5的不斷發(fā)展娱据,出現(xiàn)了一個(gè)針對HTTP瓶頸問題進(jìn)行解決的新協(xié)議——WebSocket盅惜。WebSocket在2011年發(fā)布了第一個(gè)標(biāo)準(zhǔn)版本,可以讓瀏覽器客戶端和服務(wù)端之間實(shí)現(xiàn)全雙工通信抒寂。通信過程中,可以互相發(fā)送JSON屈芜、XML、HTML沸伏、或圖片等任意格式的數(shù)據(jù)动分。WebSocket鏈接時(shí)毅糟,客戶端首先發(fā)送一次HTTP請求澜公,請求切換為WebSocket協(xié)議通信姆另。服務(wù)端成功處理后坟乾,客戶端和服務(wù)端后續(xù)通信就會(huì)切換到WebSocket。
在SPDY和WebSocket的基礎(chǔ)上甚侣,標(biāo)準(zhǔn)組織發(fā)布了HTTP2.0。它集成了二者的優(yōu)點(diǎn)殷费,并且在網(wǎng)絡(luò)和服務(wù)器資源占用等性能方面進(jìn)行了進(jìn)一步改進(jìn)和完善。
隨著在線辦公概念的興起详羡,對在線操控文檔的需求越來越強(qiáng)烈。WebDAV(Web-based Distributed Authoring and Versioning, 基于萬維網(wǎng)的分布式創(chuàng)作和版本控制)就是為了適配這種場景出現(xiàn)的新協(xié)議实柠。通過WebDAV,可以方便的對文件進(jìn)行復(fù)制、修改、加鎖钢拧、移動(dòng)等操作。
5 安全
HTTP是明文傳輸娶靡,內(nèi)容可能會(huì)被竊聽,而且通信對方的身份也無法確認(rèn)姿锭,通信的內(nèi)容也可能被修改。為了解決以上問題伯铣,出現(xiàn)了加密呻此、身份認(rèn)證和完整性保護(hù)的技術(shù)∏还眩基于這些技術(shù)焚鲜,誕生了有效解決以上問題的方式——HTTPS。HTTPS在通信時(shí)放前,首先通過證書簽名來認(rèn)證對方身份忿磅。當(dāng)通信開始時(shí),使用證書中的公鑰對信息進(jìn)行加密凭语,另一方通過私鑰獲取信息葱她,然后雙方協(xié)商出正常通信的對稱密鑰,這樣就有效保證了通信內(nèi)容的安全吨些。
針對HTTP網(wǎng)站的攻擊,大致可以分為主動(dòng)攻擊和被動(dòng)攻擊兩種豪墅。主動(dòng)攻擊是針對服務(wù)上的資源黔寇,傳入攻擊代碼。最有代表性的是SQL注入和OS命令注入缝裤。被動(dòng)攻擊是對客戶端進(jìn)行偽裝,誘發(fā)用戶點(diǎn)擊動(dòng)過手腳的頁面倘是,從而獲取用戶賬戶、密碼等私有信息搀崭,最常見的有跨站腳本(XSS)猾编、釣魚網(wǎng)站等攻擊方式升敲。還有一種容易被攻擊的情況是開發(fā)者對錯(cuò)誤處理的相關(guān)提示,比如網(wǎng)站提示賬戶未注冊驴党、帶有MySQL/PHP等關(guān)鍵字等。這樣就會(huì)給攻擊者以特定的提示倔既,有針對性地進(jìn)行下一步攻擊。
為了防止密碼泄漏渤涌,服務(wù)端一般都會(huì)將用戶的密碼把还,首先進(jìn)行加鹽实蓬,再計(jì)算MD5散列值進(jìn)行存儲(chǔ)吊履。這樣就算密碼在服務(wù)端不小心被泄漏,攻擊者也不知道用戶的原始密碼酌伊。不過針對這種MD5和原始明文對應(yīng)的情況,有公開的彩虹表腺晾,記錄了龐大的一一對應(yīng)的信息庫辜贵。這就是針尖對麥芒吧,沒有絕對的安全托慨,只有成本和收益之間相互的權(quán)衡暇榴。
喜歡和關(guān)注都是對我的鼓勵(lì)和支持~