?
This document uses PHP Chinese website manual Release
HTTP 是萬維網(wǎng)的底層協(xié)議。由 Tim Berners-Lee 在1989 - 1991年發(fā)明的,HTTP 已經(jīng)看到了許多變化,保持了大部分簡單性并進(jìn)一步塑造了其靈活性。HTTP 已經(jīng)從早期的協(xié)議演變到在半可信的實(shí)驗(yàn)室環(huán)境中交換文件,到現(xiàn)在的互聯(lián)網(wǎng)迷宮,現(xiàn)在它們攜帶圖像,高分辨率和3D視頻。
1989年,當(dāng)他在歐洲核子研究中心工作時(shí),蒂姆伯納斯李寫了一個(gè)建議,建立一個(gè)通過互聯(lián)網(wǎng)的超文本系統(tǒng)。最初稱它為Mesh,后來在1990年實(shí)施時(shí)重新命名為萬維網(wǎng)。它建立在現(xiàn)有的TCP和IP協(xié)議上,由4個(gè)構(gòu)建塊組成:
表示超文本文件的文本格式,即超文本標(biāo)記語言(HTML)。
一個(gè)簡單的協(xié)議來交換這些文件,HypertText傳輸協(xié)議(HTTP)。
一個(gè)客戶端顯示(和意外編輯)這些文件,第一個(gè)Web瀏覽器稱為WorldWideWeb。
提供訪問文檔的服務(wù)器,httpd的早期版本。
這四個(gè)構(gòu)件塊在1990年底完成,第一批服務(wù)器已在1991年初在歐洲核子研究中心外運(yùn)行。1991年8月6日,Tim Berners-Lee 在公共超文本新聞組的帖子現(xiàn)在被認(rèn)為是正式開始作為一個(gè)公共項(xiàng)目的萬維網(wǎng)。
這些早期階段使用的HTTP協(xié)議非常簡單,后來被稱為HTTP/0.9,有時(shí)也被稱為單線協(xié)議。
HTTP的初始版本沒有版本號; 它后來被稱為0.9來區(qū)分它和更高版本。HTTP / 0.9非常簡單:請求由一行代碼組成,并從唯一可能的方法開始,GET
然后是資源路徑(不是URL,因?yàn)檫B接到服務(wù)器后不需要協(xié)議,服務(wù)器和端口)。
GET /mypage.html
答案也非常簡單:它只包含文件本身。
<HTML>A very simple HTML page</HTML>
與隨后的演變不同,沒有HTTP標(biāo)頭,這意味著只能傳輸HTML文件,而不能傳輸其他類型的文件。沒有狀態(tài)或錯(cuò)誤代碼:在發(fā)生問題的情況下,發(fā)送特定的HTML文件并將其中包含的問題描述供人類使用。
HTTP/0.9非常有限,瀏覽器和服務(wù)器很快將其擴(kuò)展到更多功能:
版本信息現(xiàn)在在每個(gè)請求中發(fā)送(HTTP/1.0
附加到GET
行中)
狀態(tài)碼行也在響應(yīng)開始時(shí)發(fā)送,允許瀏覽器自己了解請求的成功或失敗并調(diào)整其行為(如以特定方式更新或使用本地緩存)
已經(jīng)引入了HTTP標(biāo)頭的概念,包括請求和響應(yīng),允許傳輸元數(shù)據(jù)并使協(xié)議非常靈活和可擴(kuò)展。
在新的HTTP標(biāo)題的幫助下,增加了傳輸其他文檔而不是純HTML文件的功能(感謝Content-Type
標(biāo)題)。
一個(gè)典型的要求是這樣的:
GET /mypage.html HTTP/1.0User-Agent: NCSA_Mosaic/2.0 (Windows 3.1)200 OK Date: Tue, 15 Nov 1994 08:12:31 GMT Server: CERN/3.0 libwww/2.17Content-Type: text/html<HTML> A page with an image <IMG SRC="/myimage.gif"></HTML>
接下來是第二個(gè)連接并請求獲取圖像:
GET /myimage.gif HTTP/1.0User-Agent: NCSA_Mosaic/2.0 (Windows 3.1)200 OK Date: Tue, 15 Nov 1994 08:12:32 GMT Server: CERN/3.0 libwww/2.17Content-Type: text/gif(image content)
這些新奇事物并沒有作為協(xié)同努力被引入,而是作為1991 - 1995年期間的一種嘗試和看見的方法:服務(wù)器和瀏覽器增加了一個(gè)功能,并且看到它是否得到了牽引。許多互操作性問題很常見。在1996年11月,為了解決這些煩惱,RFC 1945發(fā)布了描述通用實(shí)踐的信息文件。這是HTTP/1.0的定義,值得注意的是,從狹義上講,它不是官方的標(biāo)準(zhǔn)。
與HTTP/1.0的各種實(shí)現(xiàn)的有些混亂的使用并行,并且從1995年開始,在明年發(fā)布HTTP/1.0文檔之前,正在進(jìn)行適當(dāng)?shù)臉?biāo)準(zhǔn)化。HTTP/1.1的第一個(gè)標(biāo)準(zhǔn)化版本于1997年初發(fā)布,僅在HTTP/1.0之后幾個(gè)月發(fā)布。
HTTP/1.1澄清了含糊之處并引入了許多改進(jìn):
連接可以重復(fù)使用,節(jié)省重新打開多次的時(shí)間,以顯示嵌入到檢索到的單個(gè)原始文檔中的資源。
流水線已添加,允許在第一個(gè)請求的答案完全傳輸之前發(fā)送第二個(gè)請求,從而降低通信延遲。
分塊響應(yīng)現(xiàn)在也支持。
額外的緩存控制機(jī)制已經(jīng)被引入。
內(nèi)容協(xié)商(包括語言,編碼或類型)已經(jīng)引入,并允許客戶和服務(wù)器就最適合交換的內(nèi)容達(dá)成一致。
多虧了Host
標(biāo)題,現(xiàn)在可以在同一個(gè)IP地址上托管不同的域,從而允許服務(wù)器搭配。
一個(gè)典型的請求流,通過一個(gè)單一的連接現(xiàn)在看起來像這樣:
GET /en-US/docs/Glossary/Simple_header HTTP/1.1Host: developer.mozilla.org User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:50.0) Gecko/20100101 Firefox/50.0Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 Accept-Language: en-US,en;q=0.5 Accept-Encoding: gzip, deflate, br Referer: https://developer.mozilla.org/en-US/docs/Glossary/Simple_header 200 OK Connection: Keep-Alive Content-Encoding: gzip Content-Type: text/html; charset=utf-8 Date: Wed, 20 Jul 2016 10:55:30 GMT Etag: "547fa7e369ef56031dd3bff2ace9fc0832eb251a" Keep-Alive: timeout=5, max=1000 Last-Modified: Tue, 19 Jul 2016 00:59:33 GMT Server: Apache Transfer-Encoding: chunked Vary: Cookie, Accept-Encoding (content) GET /static/img/header-background.png HTTP/1.1 Host: developer.cdn.mozilla.net User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:50.0) Gecko/20100101 Firefox/50.0 Accept: */*Accept-Language: en-US,en;q=0.5Accept-Encoding: gzip, deflate, br Referer: https://developer.mozilla.org/en-US/docs/Glossary/Simple_header200 OK Age: 9578461Cache-Control: public, max-age=315360000Connection: keep-alive Content-Length: 3077Content-Type: image/png Date: Thu, 31 Mar 2016 13:34:46 GMT Last-Modified: Wed, 21 Oct 2015 18:27:50 GMT Server: Apache(image content of 3077 bytes)
HTTP/1.1于1997年1月首次發(fā)布為RFC 2068。
由于其可擴(kuò)展性 - 很容易創(chuàng)建新的頭文件或方法 - 即使HTTP/1.1協(xié)議經(jīng)過兩次修訂(1999年6月發(fā)布的RFC 2616和2014年6月發(fā)布的RFC 7230 - RFC 7235系列)HTTP / 2的發(fā)布,這個(gè)協(xié)議在超過15年的時(shí)間里非常穩(wěn)定。
發(fā)生在HTTP上的最大變化早在1994年底完成。Netscape Communication不是通過基本的TCP / IP堆棧發(fā)送HTTP,而是在其上創(chuàng)建了一個(gè)額外的加密傳輸層:SSL。SSL 1.0從未在公司以外發(fā)布過,但SSL 2.0及其后繼者SSL 3.0和SSL 3.1允許通過加密和保證服務(wù)器和客戶端之間交換消息的真實(shí)性來創(chuàng)建電子商務(wù)網(wǎng)站。SSL被放在標(biāo)準(zhǔn)軌道上,最終成為TLS,1.0,1.1和1.2版成功出現(xiàn)在關(guān)閉漏洞的地方。TLS 1.3目前正在制作中。
同時(shí),對加密傳輸層的需求也在增加:Web留下了大多數(shù)學(xué)術(shù)網(wǎng)絡(luò)的相對可信度,到了廣告客戶,隨機(jī)個(gè)人或罪犯競相獲取關(guān)于人們的私人信息的叢林,試圖模仿他們甚至可以取代由改變的數(shù)據(jù)傳輸?shù)臄?shù)據(jù)。隨著通過HTTP構(gòu)建的應(yīng)用程序變得越來越強(qiáng)大,訪問越來越多的私人信息(如地址簿,電子郵件或用戶的地理位置),即使在電子商務(wù)使用之外,也需要使TLS變得無處不在案件。
Tim Berners-Lee對于Web的最初設(shè)想不是只讀媒體。他設(shè)想了一個(gè)Web,人們可以在其中遠(yuǎn)程添加和移動文檔,這是一種分布式文件系統(tǒng)。大約在1996年,HTTP已經(jīng)擴(kuò)展到允許創(chuàng)作,并且創(chuàng)建了一個(gè)名為WebDAV的標(biāo)準(zhǔn)。它已被進(jìn)一步擴(kuò)展用于特定應(yīng)用程序,如CardDAV處理地址簿條目和CalDAV以處理日歷。但所有這些* DAV擴(kuò)展都有一個(gè)缺陷:它們必須由要使用的服務(wù)器來實(shí)現(xiàn),這非常復(fù)雜。他們在Web領(lǐng)域的使用保持保密。
在2000年,設(shè)計(jì)了一種使用HTTP的新模式:表示狀態(tài)轉(zhuǎn)移(或REST)。API引發(fā)的操作不再通過新的HTTP方法傳達(dá),而僅通過使用基本的HTTP/1.1方法訪問特定的URI。這允許任何Web應(yīng)用程序提供API以允許檢索和修改其數(shù)據(jù),而不必更新瀏覽器或服務(wù)器:所有需要的內(nèi)容都通過標(biāo)準(zhǔn)的HTTP/1.1嵌入到網(wǎng)站提供的文件中。REST模型的缺點(diǎn)在于每個(gè)網(wǎng)站都定義了自己的非標(biāo)準(zhǔn)RESTful API并對其進(jìn)行了全面控制; 與客戶端和服務(wù)器可互操作的* DAV擴(kuò)展不同。REST風(fēng)格的API在2010年變得非常普遍。
自2005年以來,Web頁面可用的一組API大大增加,其中一些API為特定目的而創(chuàng)建了HTTP協(xié)議的擴(kuò)展(主要是新的特定HTTP標(biāo)頭):
服務(wù)器發(fā)送的事件,服務(wù)器可以將偶然消息推送到瀏覽器。
WebSocket,一種可以通過升級現(xiàn)有HTTP連接來建立的新協(xié)議。
HTTP獨(dú)立于Web的安全模型,即同源策略。實(shí)際上,當(dāng)前的Web安全模型是在創(chuàng)建HTTP之后開發(fā)的!多年來,通過允許在某些限制條件下取消對這項(xiàng)政策的某些限制,能夠變得更加寬容,證明是有用的。服務(wù)器使用一堆新的HTTP標(biāo)頭將這些限制解除多少以及何時(shí)傳送給客戶端。這些定義在跨源資源共享(CORS)或內(nèi)容安全策略(CSP)等規(guī)范中。
除了這些大的擴(kuò)展之外,還添加了許多其他的頭文件,有時(shí)僅用于實(shí)驗(yàn)。值得注意的標(biāo)題是Do Not Track(DNT
)標(biāo)題來控制隱私X-Frame-Options
,或者Upgrade-Insecure-Requests
更多的存在。
多年來,網(wǎng)頁變得越來越復(fù)雜,甚至成為應(yīng)用程序本身。顯示的可視媒體數(shù)量,增加交互性的腳本的體積和大小也有所增加:通過顯著更多的HTTP請求傳輸更多的數(shù)據(jù)。HTTP/1.1連接需要以正確的順序發(fā)送請求。理論上,可以使用幾個(gè)并行連接(通常在5到8之間),帶來相當(dāng)大的開銷和復(fù)雜性。例如,HTTP流水線已成為Web開發(fā)中的資源負(fù)擔(dān)。
在2010年上半年,Google通過實(shí)施SPDY實(shí)驗(yàn)協(xié)議,演示了在客戶端和服務(wù)器之間交換數(shù)據(jù)的另一種方式。這引起了在瀏覽器和服務(wù)器上工作的開發(fā)人員的興趣。SPDY定義了響應(yīng)性的增加,并解決了傳輸數(shù)據(jù)重復(fù)的問題,成為HTTP/2協(xié)議的基礎(chǔ)。
HTTP/2協(xié)議與HTTP/1.1版本有幾個(gè)主要區(qū)別:
這是一個(gè)二進(jìn)制協(xié)議,而不是文本。盡管有這個(gè)障礙,但不能再手動讀取和創(chuàng)建,現(xiàn)在可以實(shí)施改進(jìn)的優(yōu)化技術(shù)。
它是一個(gè)多路復(fù)用協(xié)議。并行請求可以通過同一個(gè)連接處理,消除HTTP/1.x協(xié)議的順序和阻塞約束。
它壓縮標(biāo)題。由于這些請求在一組請求中經(jīng)常相似,這消除了傳輸數(shù)據(jù)的重復(fù)和開銷。
它允許服務(wù)器在需要之前通過稱為服務(wù)器推送的機(jī)制將數(shù)據(jù)填充到客戶端緩存中。
2015年5月正式標(biāo)準(zhǔn)化后,HTTP/2取得了很大的成功。到2016年7月,所有網(wǎng)站中有8.7%已經(jīng)使用它,占所有請求的68%以上。高流量的網(wǎng)站顯示了最快的采用率,大大節(jié)省了數(shù)據(jù)傳輸開銷和后續(xù)預(yù)算。
這種快速采用率很可能是因?yàn)镠TTP/2不需要適應(yīng)網(wǎng)站和應(yīng)用程序:使用HTTP/1.1或HTTP/2對他們來說是透明的。使用最新的服務(wù)器與最近的瀏覽器進(jìn)行通信足以支持其使用:只需要有限的一組組即可觸發(fā)采用,并且隨著舊版瀏覽器和服務(wù)器版本的更新,使用量自然會增加,而無需其他Web開發(fā)者努力。
HTTP在HTTP / 2發(fā)布后并沒有停止發(fā)展。與之前的HTTP / 1.x一樣,HTTP的可擴(kuò)展性仍然用于添加新功能。值得注意的是,我們可以引用2016年出現(xiàn)的HTTP協(xié)議的新擴(kuò)展:
支持Alt-Svc
允許標(biāo)識和給定資源的位置分離,允許更智能的CDN緩存機(jī)制。
引入Client-Hints
允許瀏覽器或客戶端主動將有關(guān)其需求或硬件約束的信息傳達(dá)給服務(wù)器。
在Cookie
頭文件中引入與安全有關(guān)的前綴,現(xiàn)在有助于保證cookie的安全性沒有被改變。
HTTP的這種演變證明了它的可擴(kuò)展性和簡單性,解放了許多應(yīng)用程序的創(chuàng)建并強(qiáng)制采用該協(xié)議?,F(xiàn)在使用HTTP的環(huán)境與20世紀(jì)90年代初期的情況完全不同。HTTP的原創(chuàng)設(shè)計(jì)被證明是一個(gè)杰作,它允許Web在四分之一世紀(jì)內(nèi)發(fā)展,而不需要嘩變。通過修復(fù)漏洞,并保持使HTTP獲得如此成功的靈活性和可擴(kuò)展性,采用HTTP / 2為協(xié)議提供了光明的未來。