信息大爆炸
人類文明史就是一部信息史——人類如何獲取褥实、存儲和傳遞信息的歷史。
遠古時代裂允,人類主要通過觀察自然現(xiàn)象來獲取信息和知識损离,通過口口相傳的方式傳遞信息。
而后绝编,人類發(fā)明了結(jié)繩僻澎、符號貌踏,可以將個人大腦中的信息加以符號化——這可以說是人類最早的信息存儲形式(它也是一種傳播形式)。這些符號不斷地傳播并豐富窟勃,最終演化為文字祖乳。
文字是個偉大的發(fā)明,它使得信息和知識能夠跨越時空傳遞秉氧。如果沒有文字眷昆,人類文明只能以“代代相傳”的方式進行。
除了口口相傳和文字汁咏,人類還發(fā)明了諸如烽火亚斋、燈塔、鼓聲等遠距離通信手段——人類對通信距離的不斷突破攘滩,到近代發(fā)明電報帅刊、無線電后,達到了一次高峰轰驳。
人類生產(chǎn)信息的腳步也是不斷加快厚掷。歐洲和中國在古希臘和春秋戰(zhàn)國時期出現(xiàn)了一次信息生產(chǎn)高峰弟灼,古希臘時期建造出了世界上最早的圖書館之一——亞歷山大圖書館级解。
圖書館是人類進行集中式信息管理的偉大嘗試。
歐洲文藝復興和啟蒙運動時期是人類信息生產(chǎn)的另一個高峰田绑。如果說在古希臘時期勤哗,知識生產(chǎn)大分工只是處于萌芽階段的話(那時候哲學和科學是不分家的),文藝復興和啟蒙運動時期則正式開啟了知識生產(chǎn)大分工的大門掩驱∶⒒科學從哲學中獨立出來,逐步發(fā)展成今天所理解的物理學欧穴、化學民逼、生物學、經(jīng)濟學等學科涮帘。
知識生產(chǎn)大分工的結(jié)果是人類進入了知識生產(chǎn)的指數(shù)加速時代拼苍。人類現(xiàn)在幾十年生產(chǎn)出來的知識比過去一千年都要多。
過去调缨,中國古人只需要背熟四書五經(jīng)大學中庸就行了疮鲫,現(xiàn)在光一門物理學(或者任意其他一門學科)的知識量就比那些多得多。古人可以做到“無所不知”弦叶,而二十世紀后的人類已經(jīng)不可能做到這一點了——甚至不可能做到窮盡一門學科的知識俊犯。
人類知識量指數(shù)增長帶來的是信息管理問題。面對信息海洋(知識是一種信息)伤哺,人們不知道該獲取哪些信息了燕侠,需要某類信息的時候也不知道該去哪里獲取了者祖。人類面臨著信息失控的危險。
人們可以建造更大的圖書館——再大也裝不下所有的知識绢彤,而且圖書館規(guī)模越大咸包,可能越難快速檢索到有用的信息。
人們還嘗試編纂百科全書——將那些重要的知識集中到一系列書籍中杖虾,為普通大眾在知識的海洋中提供指南和導航烂瘫。中國明朝永樂年間編纂了集大成之類書《永樂大典》;啟蒙運動時期法國哲學家丹尼·狄德羅編纂了歐洲第一部大百科全書奇适;1768 年英國人編纂了著名的《不列顛百科全書》坟比。
百科全書同樣不可能囊括所有的知識。
萬尼瓦爾·布什與 MEMEX
計算機并不是被設(shè)計用來處理信息的嚷往。
這從計算機的名字就能看出來——Computer 原意是“計算員”葛账,在計算機出現(xiàn)之前是一個專門的職業(yè)(像美國的人口普查、歐洲的航海歷之前都是由這些人類計算員手工算出來的)皮仁。
從巴貝奇的差分機和分析機籍琳,到何樂禮的電動制表機,到萬尼瓦爾·布什的微分分析儀贷祈,到第一臺通用電子計算機 ENIAC趋急,其設(shè)計的目的無不是為了數(shù)值計算。
馮·諾依曼當初“鬼使神差”地加入莫爾學院的 ENIAC 工作小組势誊,原因也在于尋求用計算機計算原子彈核爆問題——這一加入讓他“鬼使神差”地成了現(xiàn)代計算機之父呜达。
隨著二戰(zhàn)結(jié)束,計算機逐漸從軍事和科研走向商業(yè)領(lǐng)域粟耻。
同時人們嘗試進一步挖掘計算機的計算潛力查近。根據(jù)圖靈的理論,通用計算機可以計算所有的可計算問題挤忙,可以無限逼近(甚至超越)人腦——這些研究我們今天叫“人工智能”霜威,圖靈也被公認為人工智能之父。
然而册烈,還存在另一派研究人員戈泼,他們認為計算機研究應(yīng)該要為提升人類工作效率服務(wù),而不是當前看不到實際用途的所謂的“人工智能”茄厘。
他們發(fā)現(xiàn)矮冬,人們在工作中通常只有 15% 的時間在“思考”,其余時間都在查閱資料次哈、繪制圖表等胎署,工作效率非常底下。他們希望能用計算機來處理這些低級而耗時的事務(wù)窑滞,將人類的大腦解放出來去思考更有價值的事情琼牧。
總之恢筝,這些人開始研究用計算機處理信息——這些研究最終推動人類文明走向信息化時代。
數(shù)值處理和信息處理是不同的巨坊。
數(shù)值處理關(guān)注如何求三角函數(shù)撬槽、對數(shù)、微積分等數(shù)學計算問題趾撵,主要用在軍事侄柔、科研以及商業(yè)報表領(lǐng)域。
信息處理關(guān)注人類社會的各種信息占调,諸如書籍暂题、信函、圖片究珊、音頻薪者、視頻。
第一臺通用電子計算機 ENIAC 全稱是 Electronic Numerical Integrator And Computer剿涮,翻譯過來是“電子數(shù)字積分計算機”——看名字就知道人們想用它來干嘛言津。
計算機的兩大分支:數(shù)值處理和信息處理,在不同時期存在不同的發(fā)展態(tài)勢取试。二戰(zhàn)時悬槽,主要用來做數(shù)值處理(ENIAC 的目的是計算彈道);戰(zhàn)后其重心逐步轉(zhuǎn)變?yōu)樾畔⑻幚砩希ó斎徊皇钦f數(shù)值處理方面就沒有發(fā)展了)想括,最終推動人類走向信息化時代陷谱;如今,人工智能被重新提上議程瑟蜈,自動駕駛、智慧城市甚是火熱渣窜。
前面說隨著人類信息量的指數(shù)增長铺根,傳統(tǒng)的信息存儲和檢索方式面臨越來越大的挑戰(zhàn)。
首先是存儲乔宿。傳統(tǒng)的信息存儲方式主要是書籍位迂、文件這些紙質(zhì)媒介,這種媒介在信息量驟增的二十世紀已經(jīng)相當笨重和效率低下详瑞。大學需要建造龐大的圖書館掂林,公司需要準備大量的文件柜(不可避免地占用大量空間)歸檔各種函件。
其次是檢索坝橡。雖然有各種文件歸檔方案泻帮,在海量文件中找到想要的那個仍然是一件非常費力而又無聊的事情——一旦記不清文件放在何處更是讓人抓狂。
所以人們想能否通過計算機來解決這些問題计寇。
1945 年锣杂,萬尼瓦爾·布什(Vannevar Bush)發(fā)表了一篇名為"As We May Think"的文章脂倦。文章描述了一種被稱為 MEMEX 的機器,實現(xiàn)新型的數(shù)字化的信息存儲和檢索模式元莫。
MEMEX 設(shè)備相當于一個數(shù)字圖書館赖阻,它將現(xiàn)實中的各種書籍、圖片踱蠢、文件等數(shù)字化并存儲在微縮膠片上火欧,解決紙質(zhì)媒介的存儲效率問題。
MEMEX有一個屏幕茎截,資料可以投影到上面進行閱讀布隔,還有一個鍵盤,一系列按鈕和把手稼虎。
更重要的衅檀,布什在這篇文章中提出了后來被稱為“超文本”的概念,兩個相關(guān)聯(lián)的文檔之間可以建立某種關(guān)聯(lián)使得可以從一篇文檔直接跳轉(zhuǎn)到另一篇文檔霎俩。
布什并沒有在他的文章中使用“超文本”這個詞哀军,超文本(Hypertext)一詞是德特·納爾遜于 20 世紀 60 年代創(chuàng)造的。
超文本在今天看來稀疏平常打却,但在布什那個年代是一個非常大膽的杉适、創(chuàng)新的設(shè)想。傳統(tǒng)的信息檢索是集中式檢索柳击。想想我們在圖書館看書猿推,在一本書里面看到對另一本書的引用,此時如果我們需要看被引用的那本書捌肴,就得在圖書館里面到處找蹬叭。再想想我們在 Linux 命令行查看某命令的幫助文檔,當我們看到 See also 后像去看其引用的命令的細節(jié)状知,我們得退出去然后 man 另一個命令秽五。這種檢索模式稱為“線性檢索”。
和傳統(tǒng)的線性檢索方式不同饥悴,超文本允許任何信息之間交叉引用坦喘,可以從一個文檔直接轉(zhuǎn)移到另一個文檔,且能方便地返回到源文檔西设。
超文本的顛覆性在于它改變了人類幾千年來的集中式樹形目錄的信息檢索方式瓣铣。
超文本的概念催生了后來的萬維網(wǎng)。
電子郵件與阿帕網(wǎng)
上世紀 60 年代贷揽,計算機資源是非常昂貴的棠笑,人們就想能否將這些昂貴的計算機通過某種方式連接起來,用戶可以在一臺計算機上直接使用另一臺計算機資源擒滑,從而分攤計算和存儲成本腐晾。
1963 年叉弦,美國國防部的高級研究計劃局啟動了“阿帕網(wǎng)”(Advanced Research Projects Agency Network,高級研究計劃局網(wǎng)藻糖,簡稱 ARPANET)項目——通過將計劃局的所有計算機系統(tǒng)連接在一起淹冰,用戶就能使用網(wǎng)絡(luò)上的任何計算機設(shè)施。
阿帕網(wǎng)使用了存儲轉(zhuǎn)發(fā)分組交換的數(shù)據(jù)交換模式巨柒,該模式沿用至今樱拴。
存儲轉(zhuǎn)發(fā)是用來解決計算機之間的連接問題。研究員們?yōu)槿绾螌⒈姸嗟挠嬎銠C兩兩連接起來犯難洋满。不太可能為每兩臺計算機都拉一根網(wǎng)線——那樣網(wǎng)線數(shù)量將很快變得不可控晶乔。研究員們借鑒了電報行業(yè)的做法。
19 世紀電報行業(yè)在英國飛速發(fā)展牺勾,各大城市設(shè)有眾多的電報網(wǎng)點正罢。電報公司之間、以及各大城市之間如何通信成為必須解決的問題驻民。英國在幾個主要城市設(shè)立了交換中心翻具。電報公司之間、城市之間無需兩兩相連回还,大家可通過交換中心轉(zhuǎn)發(fā)電報裆泳。
交換中心內(nèi)部有兩撥人員,第一撥人將發(fā)送方的電報內(nèi)容記錄下來柠硕,由另一撥人通過合適的出口電報機轉(zhuǎn)發(fā)給目的地(或下一個交換中心)工禾。
將電報記錄在案的好處是它可以充當存儲系統(tǒng),如果下一個交換中心很忙蝗柔,則可以將報文暫存起來闻葵,等線路空閑時再發(fā)。
這就是所謂的“存儲轉(zhuǎn)發(fā)”诫咱。
通過交換中心轉(zhuǎn)發(fā)消息笙隙,使得計算機之間無需兩兩相連;通過存儲(緩沖隊列)坎缭,讓上游不會因下游繁忙而阻塞(另外在分組交換模式下,交換機是先將收到的 bit 存儲起來签钩,直到接收到完整的分組后才會轉(zhuǎn)發(fā))掏呼。
當然存儲轉(zhuǎn)發(fā)不是沒有缺點的,報文在到達目的地之前铅檩,需要經(jīng)過多個交換中心(交換機)的存儲和拷貝憎夷,大大增加了時延。
分組交換用來解決占線問題昧旨。如果我們一次發(fā)送整個報文(可能很大)拾给,那么一方面會導致高速通信線路在一段時間內(nèi)被某個用戶獨占祥得;另外采用存儲轉(zhuǎn)發(fā)策略的交換中心需要先存儲整個報文,這會帶來巨大的存儲開銷蒋得;最后级及,如果消息傳送失敗,需要重傳整條報文(而不是失敗的那部分)额衙。
所以饮焦,人們決定將整個報文切分成一個個更小的分組(Package),以分組為單位在網(wǎng)絡(luò)上傳輸窍侧。這樣高速線路就不會被某一個用戶的龐大消息獨占了县踢,交換中心需要存的東西也小很多。
分組交換也不是沒有缺點的伟件。分割成多個分組后硼啤,每個分組都必須攜帶額外元數(shù)據(jù)(首部),增加了傳輸?shù)谋忍財?shù)斧账。另外接收端也必須將分組重組成報文(消息)谴返。
最初接入阿帕網(wǎng)的只是高級研究計劃局內(nèi)部的計算機。很快其骄,加利福利亞大學亏镰、猶他大學、斯坦福研究院等跟計劃局有合作關(guān)系的大學計算機也加入到該網(wǎng)絡(luò)拯爽。在大學校園里索抓,一些研究生和程序員也開始將自己的主機接入其中,很快便在校園內(nèi)形成一種獨特的網(wǎng)絡(luò)社區(qū)文化毯炮。
到 1971 年春逼肯,共有23 臺主機聯(lián)網(wǎng)。
1972 年桃煎,阿帕網(wǎng)新負責人羅伯茨在首屆國際計算機通信大會上組織了一次公開演示篮幢,向世人展示阿帕網(wǎng)。這次演示影響很大为迈,越來越多的研究機構(gòu)和大學開始接入阿帕網(wǎng)三椿,一年后,網(wǎng)絡(luò)中的主機數(shù)量達到 45 臺葫辐。
4 年后搜锰,數(shù)字升到 111 臺。
從數(shù)量看耿战,增長非常緩慢蛋叼。
真正推動阿帕網(wǎng)發(fā)展的是電子郵件。
阿帕網(wǎng)最初并沒有考慮電子郵件。
1971 年狈涮,BBN 的兩位程序員為阿帕網(wǎng)開發(fā)了實驗性的電子郵件系統(tǒng)——起初他們并不認為這玩意能成什么氣候狐胎。
然而很快,電子郵件成為阿帕網(wǎng)中最大的流量歌馍,郵件注冊用戶導 1975 年已過千人握巢。收發(fā)電子郵件的需求也成為推動第一批非阿帕網(wǎng)網(wǎng)絡(luò)發(fā)展的主要力量。
計算機服務(wù)商看到了電子郵件的商業(yè)價值骆姐。很多服務(wù)商開始搭建自己的計算機網(wǎng)絡(luò)(大多數(shù)是基于阿帕網(wǎng)的技術(shù))提供電子郵件服務(wù)镜粤,形成了 70 年代的“電子郵件大戰(zhàn)”。
電子郵件推動了計算機網(wǎng)絡(luò)的發(fā)展玻褪,催生了大量基于阿帕網(wǎng)技術(shù)實現(xiàn)的肉渴、相互獨立的計算機網(wǎng)絡(luò)。
一個問題是带射,這些網(wǎng)絡(luò)之間無法通信(自然也無法收發(fā)郵件)同规。
于是人們開始考慮網(wǎng)際互聯(lián)問題。
當時阿帕網(wǎng)使用的網(wǎng)絡(luò)協(xié)議叫 NCP(Network Control Protocol窟社,網(wǎng)絡(luò)控制協(xié)議)券勺,該協(xié)議存在諸多缺陷,其中一個問題是 NCP 僅能用于同構(gòu)環(huán)境中(所有計算機都要運行相同的系統(tǒng))灿里。
人們決定開發(fā)個支持異構(gòu)系統(tǒng)的新協(xié)議替代 NCP关炼。
1973 年,高級研究計劃局的研究員羅伯特·卡恩和溫頓·瑟夫著手設(shè)計 TCP/IP 協(xié)議匣吊;1980年儒拂,用于“異構(gòu)”網(wǎng)絡(luò)環(huán)境的 TCP/IP 協(xié)議研制成功;1982年色鸳,ARPANET開始采用TCP/IP協(xié)議替代 NCP 協(xié)議社痛。
TCP/IP 協(xié)議的出現(xiàn)推動了計算機網(wǎng)絡(luò)之間的網(wǎng)際互聯(lián)(也就是我們今天說的互聯(lián)網(wǎng)),最終催生出世界上最重要的互聯(lián)網(wǎng)——因特網(wǎng)命雀。
個人計算機與因特網(wǎng)
電子郵件推動了阿帕網(wǎng)的發(fā)展蒜哀,并在商業(yè)公司的推動下形成各種計算機網(wǎng)絡(luò)百花齊放的局面,而這種局面最終因網(wǎng)際互聯(lián)的實際訴求而催生出因特網(wǎng)吏砂。
但因特網(wǎng)起初增長速度是很慢的撵儿,到 1984 年接入的主機數(shù)量也不過千臺,主要是大學狐血、科研和一些商業(yè)機構(gòu)统倒。
真正推動因特網(wǎng)快速發(fā)展的,是個人計算機浪潮氛雪。
80 年代,個人計算機風起云涌耸成,IBM叙身、蘋果堆生、微軟群雄逐鹿居砖,軟硬件百花齊放,個人計算機逐步成為大眾普遍接受的電子消費品和辦公品岳链。
大量個人計算機開始接入因特網(wǎng),人們不但在網(wǎng)上用電子郵件交流劲件,還開始交流整篇文檔掸哑。
很快,因特網(wǎng)上產(chǎn)生了大量沒有目錄組織的文檔——如何組織和檢索這些文檔成為一個亟待解決的問題零远。
人們開發(fā)了一些目錄服務(wù)軟件來解決文檔檢索問題苗分。比如有一款叫“阿奇”的軟件,通過梳理因特網(wǎng)牵辣,創(chuàng)建一個包含所有可供下載文件的目錄摔癣,用戶直接在該軟件里面即可下載,無需關(guān)注文檔的具體位置纬向。有些軟件還提供了根據(jù)文檔名稱模糊模糊檢索功能择浊。
和我們今天在瀏覽器中直接點“下載”按鈕就能下載文檔不同,那個時候人們要下載某個文檔逾条,必須先知道該文檔的精確位置琢岩。典型的操作流程如下:
張三先通過 ftp 登錄到某臺遠程主機上;
登錄上去后师脂,進入到某個目錄担孔;
從那個目錄下載文件;
也就是說危彩,張三必須知道文檔所在的主機攒磨,而且能登錄這臺主機,然后要進入到相應(yīng)目錄汤徽。
張三不可能知道因特網(wǎng)上所有文檔的精確位置娩缰。所以說,當時這種目錄服務(wù)軟件還是較好地解決了人們的痛點谒府。
這些軟件的目錄組織形式和傳統(tǒng)書籍無異拼坎,也是采用集中式樹形結(jié)構(gòu)目錄,文檔之間沒有直接的關(guān)系完疫。假如用戶在一篇文檔中看到“查爾斯·巴貝奇”的名字泰鸡,他想檢索查爾斯·巴貝奇的信息,就要回到目錄重新查找——他無法從當前文檔直接進入關(guān)于查爾斯·巴貝奇生平的另一篇文檔壳鹤。
上面提過盛龄,早在 40 年前,萬尼瓦爾·布什就提出了超文本的概念來解決信息交叉檢索問題。
那么余舶,能否將超文本和因特網(wǎng)結(jié)合起來呢啊鸭?
蒂姆·伯納斯·李與萬維網(wǎng)
在今天看來,因特網(wǎng)和超文本好像天然就是在一起的匿值,然而在上個世紀八十年代卻不是這樣赠制。那時候超文本和因特網(wǎng)都是很熱門的話題(至少在學術(shù)界如此),而且超文本也開始應(yīng)用于一些 CD-ROM 百科全書等消費類產(chǎn)品挟憔,然而钟些,兩者是單獨發(fā)展的,沒有人真正想到能將超文本應(yīng)用在因特網(wǎng)上绊谭。
有個叫蒂姆·伯納斯·李的英國軟件工程師最終想到了這點政恍,他于 1989 年向歐洲核子研究中心(CERN)遞交了一份項目提案,在這份提案中龙誊,描述了今后稱為“萬維網(wǎng)”的雛形抚垃。
歐洲核子研究中心是在聯(lián)合國教科文組織的倡導下,由歐洲 11 個國家于 1954 年 9 月創(chuàng)立趟大。作為一個國際性組織鹤树,擁有非常復雜的人員和組織結(jié)構(gòu),研究項目眾多逊朽、人員變動頻繁罕伯。在這樣一個大型組織中,如何高效地組織和檢索信息(人物信息叽讳、項目信息追他、各種技術(shù)檔案等)成為一個棘手的問題。
人們經(jīng)常被諸如下面的問題困擾:
這個模塊在哪里用到了岛蚤?
這些代碼是誰寫的邑狸?在哪里執(zhí)行?
哪些系統(tǒng)依賴該設(shè)備涤妒?
另外单雾,CERN 的人員流動很大,經(jīng)常因為人員離職而導致關(guān)鍵信息丟失——多數(shù)情況下不是因為離職人員沒有存留文檔她紫,而是因為后面的人找不到文檔了硅堆。
CERN 面臨著嚴重的信息丟失問題。
伯納斯·李進一步補充道:“在不久的將來贿讹,世界其他國家和組織也會面臨同樣的問題”渐逃。
所以,必須有一套通用的信息管理方案民褂。
當時人們普遍使用樹形結(jié)構(gòu)來組織信息茄菊。Unix 文件系統(tǒng)就是一個例子疯潭。當時 CERN 正在用的 CERNDOC 文檔系統(tǒng)也是。在這種系統(tǒng)中买羞,如果一個文檔(樹的葉子節(jié)點)中引用了另一個文檔(另一個葉子節(jié)點袁勺,如我們 man 查看命令文檔時的 See also),你是無法直接打開被引用的那篇文檔的畜普,你必須先退出當前文檔,然后從目錄開始重新檢索被引用的那篇文檔群叶。
樹形結(jié)構(gòu)并沒有表達信息之間的真實關(guān)系吃挑。比如有一篇講差分機的文章,里面提到了查爾斯·巴貝奇街立,該場景中舶衬,“差分機”和“查爾斯·巴貝奇”是有關(guān)聯(lián)的兩條信息,但在集中式樹形目錄中赎离,這兩條信息是作為單獨的逛犹、毫無關(guān)聯(lián)的實體存在的,我們從目錄中看不出“差分機”和“查爾斯·巴貝奇”存在任何關(guān)聯(lián)梁剔。
在傳統(tǒng)的基于目錄的信息組織和檢索方式中虽画,我們基本上只是管理了一個個孤零零的信息本身,并沒有管理信息之間的關(guān)系荣病。
相較于樹形目錄码撰,交叉檢索的超文本更能反映現(xiàn)實世界的信息組織結(jié)構(gòu),它允許人們從一條信息體直接跳轉(zhuǎn)到與之關(guān)聯(lián)的另一條信息體个盆,而無需重新檢索目錄脖岛,這大大提高了信息的檢索效率。
超文本的概念人們四十年前就提出了颊亮,在 80 年代已經(jīng)有一些實際應(yīng)用柴梆,如果僅僅到此為止,伯納斯·李的這個提案也沒有什么出眾之處——不過是開發(fā)另一款超文本信息管理系統(tǒng)而已终惑。
這份提案的創(chuàng)新之處在于绍在,它所描繪的超文本系統(tǒng)并不是一個系統(tǒng),而是全球范圍的系統(tǒng)集群狠鸳。
伯納斯·李發(fā)現(xiàn)揣苏,如今全球已經(jīng)面臨著信息大爆炸帶來的信息管理問題:人們不知道該去哪里找到有用的信息;組織機構(gòu)每天都面臨著大量的信息丟失件舵;用集中式目錄管理海量信息力不從心卸察。
另一方面,雖然當時已經(jīng)開發(fā)出一些超文本系統(tǒng)铅祸,但這些系統(tǒng)自成一體坑质,相互之間無法實現(xiàn)信息互聯(lián)互通合武。A 系統(tǒng)的超文本只能鏈接到 A 系統(tǒng)內(nèi)部的文檔,無法引用 B 系統(tǒng)的文檔涡扼;無論是 A 系統(tǒng)還是 B 系統(tǒng)稼跳,都無法囊括世界上所有的信息。
伯納斯·李的設(shè)想是吃沪,能否將全世界所有的系統(tǒng)看做一個整體的汤善、巨大的、動態(tài)的信息存儲庫票彪,通過超文本將這些信息連接起來红淡?
讓超文本跨越系統(tǒng)邊界的限制,在地球上構(gòu)成一個龐大的信息宇宙空間降铸,這是個大膽的設(shè)想在旱。
這個設(shè)想在當時看并非不可實現(xiàn)。因特網(wǎng)已經(jīng)打破網(wǎng)絡(luò)邊界推掸,能夠?qū)⑷澜绲挠嬎銠C連接成一個整體桶蝎。
那么,讓超文本插上因特網(wǎng)的翅膀不就能夠馳騁于系統(tǒng)之間了嗎谅畅?
伯納斯·李將這個基于因特網(wǎng)的超文本信息管理系統(tǒng)稱為萬維網(wǎng)(World Wide Web)登渣。
萬維網(wǎng)的關(guān)鍵組件
URI:
由于信息分布在世界各地,首先的問題便是如何找到這些信息铃彰?
在萬維網(wǎng)中绍豁,所有的信息統(tǒng)一稱為資源。每個資源都有唯一的名字(或者叫標識)牙捉。為了讓全世界各種系統(tǒng)都能夠理解這些名字竹揍,資源的命名必須符合某些規(guī)范——這個規(guī)范叫統(tǒng)一資源標識符(Uniform Resource Identifier,簡稱 URI)邪铲。
現(xiàn)在萬維網(wǎng)基本都是用 URL(Uniform Resource Locator芬位,統(tǒng)一資源定位符) 這種 URI 方案。
完整的 URL 長這樣:
<scheme>://<user>:<password>@<host>:<port>/<path>;<params>?<query>#<frag>
不過我們在 HTTP 協(xié)議應(yīng)用中很少用到 user带到、password 和 params昧碉,所以看起來長這樣:
<scheme>://<host>:<port>/<path>?<query>#<frag>
這個 URL 格式告訴客戶端如何找尋并使用資源。scheme 告訴客戶端和服務(wù)器端(包括代理)如何解析 URL以及如何處理資源(如通過 HTTP揽惹、FTP被饿、SMTP 等協(xié)議)。 host 說明資源在哪臺主機搪搏,port 說明由該主機上哪個端口進程來接收并處理客戶端的請求狭握。path 指定資源在該主機上具體什么位置。如果說 host 相當于公司總機號疯溺,那么 path 則相當于分機號论颅。frag 說明客戶端只關(guān)注整個資源的某個片段(注意該參數(shù)只對客戶端程序有效哎垦,不會傳給服務(wù)器,服務(wù)器總是返回完整的資源給客戶端)恃疯。
URL 的問題是它和資源的具體位置密切綁定漏设,一旦資源位置變了(如換域名了,或者存放位置變了)今妄,原來的 URL 也就失效了郑口。這相當于你的身份證只能在本省使用,出省就得換身份證蛙奖。
URL 的另一個問題是不好記潘酗。URL 對美國以外的人(特別是使用表意文字的人群)不太友好。萬維網(wǎng)的一個設(shè)計原則是最大兼容性雁仲,為了實現(xiàn)這一點,URL 標準規(guī)定 URL 只能使用 7 位編碼方案的 ASCII 字符琐脏,這樣便能最大程度兼容現(xiàn)有的協(xié)議(如 SMTP 協(xié)議)攒砖,超過 7 位的字符都會被轉(zhuǎn)義。另外日裙,隨著資源的爆炸式增長吹艇,URL 變得越來越長。
所以人們還制定了另一種 URI 方案叫 URN(Uniform Resource Name昂拂,統(tǒng)一資源名)受神,這是真正的名字(相較而言,URL 是資源的位置而不是名字)格侯,它不會隨著資源的位置變化而變化鼻听。
URN 雖然看起來更高大上,但很難普及(至少在目前以及不遠的將來)联四。從其目標來看(資源不會隨著位置變化而變化)撑碴,就目前的因特網(wǎng)現(xiàn)狀來說,需要某種中轉(zhuǎn)設(shè)施(或叫注冊中心)去做名稱和位置的映射(類似 DNS 服務(wù)做域名到 IP 的映射)朝墩,而且要將現(xiàn)存的大量的 URL 轉(zhuǎn)換成 URN醉拓,這是個浩大的工程,許多萬維網(wǎng)基礎(chǔ)設(shè)施需要改變收苏。
另一方面亿卤,資源位置改變后,人們可以通過 CNAME鹿霸、rewrite排吴、HTTP 重定向等手段實現(xiàn)新舊 URL 的轉(zhuǎn)發(fā),甚至對于很多 URL 來說杜跷,服務(wù)提供者可以簡單粗暴地直接廢棄也不會造成多大影響傍念。所以對于很多公司來說矫夷,這可能并不是個急需解決的問題。
隨著網(wǎng)址導航網(wǎng)站特別是搜索引擎出現(xiàn)后憋槐,URL 的第二個問題(難以記憶)的問題也隨之解決了——現(xiàn)今人們很少直接拿 URL 去訪問網(wǎng)站了双藕。
所以到目前為止,URL 的日子過得還挺滋潤的阳仔。
MIME:
客戶端定位并拿到資源后忧陪,它如何處理或使用這些資源呢?客戶端如何知道服務(wù)器返回的是圖片還是普通文本呢近范?
萬維網(wǎng)將一切都視為資源嘶摊,而且還給這些資源分門別類——但這其實不是萬維網(wǎng)自己的創(chuàng)舉。早在電子郵件時代评矩,人們?yōu)榱嗽陔娮余]件中收發(fā)多媒體資源(而不僅僅是純文本)叶堆,就發(fā)明了 MIME 媒體類型(Multipurpose Internet Mail Extensions,多用途互聯(lián)網(wǎng)郵件擴展類型)斥杜,萬維網(wǎng)采納了該類型標準虱颗。
MIME 媒體類型采用兩層分類結(jié)構(gòu):主類型+子類型,用 / 分割蔗喂。有時候可能還要帶上一些額外參數(shù)說明細節(jié)忘渔。
例如 HTTP 協(xié)議中我們常見的幾種類型:
Content-Type: text/html // html 純文本
Content-Type: text/plain // 純文本
Content-Type: image/jpeg // jpeg 格式圖片
Content-Type: video/quicktime // quicktime 格式音頻
Content-Type: application/json // json 格式數(shù)據(jù)
在 HTML 表單中我們還見過一種復合表單類型:
Content-Type: multipart/form-data;boundary=AauYd8a
它表示我們提交的表單內(nèi)容由多種媒體類型組成。比如在注冊時缰儿,我們要填寫用戶基本信息畦粮,還要上傳頭像,這里就存在 text/plain 和 image/jpeg 兩種媒體類型乖阵,所以此時我們得用 multipart/form-data 來表示該 HTTP 主體是個復合類型宣赔,然后在主體中將每個類型內(nèi)容都帶過去,這些類型的內(nèi)容之間通過 boundary 分割(此處就是字符串 AauYd8a)义起。
我們用 postman 模擬注冊請求拉背,填寫了兩個字段:字段 name 是姓名,普通文本默终;字段 avatar 是頭像椅棺,png 圖片。得到的 HTTP 請求報文如下:
[圖片上傳失敗...(image-38e22a-1650014928754)]
本報文主體是由 text/plain 和 image/png 兩種媒體類型組成的復合媒體類型齐蔽,兩者之間通過 HTTP 首部指定的 boundary 分割两疚。
當然復合媒體內(nèi)部還可以再放復合媒體,比如上圖中第二部分我們可以再由音頻和視頻復合含滴,然后由本部分首部指定新的 boundary 來分割音頻和視頻內(nèi)容的分隔符诱渤。
目前存在幾千個 MIME 類型,完整的類型列表可在 IANA 官網(wǎng)查看谈况。
客戶端拿到資源并知道了資源類型后勺美,如果客戶端能夠編解碼此種類型递胧,便能夠正確處理并顯示。現(xiàn)今瀏覽器一般都能支持幾百種常見類型處理赡茸,而且可以通過安裝擴展(或者調(diào)起本地軟件)支持更多的媒體類型缎脾。
HTTP:
雖然 URI 本身并不限制方案(scheme),但要想將全世界的計算機組織成一個龐大的統(tǒng)一的超文本系統(tǒng)占卧,則必須使用統(tǒng)一的數(shù)據(jù)傳輸協(xié)議——這個協(xié)議就叫 HTTP遗菠。
如果說萬維網(wǎng)是一個信息帝國,那么 HTTP 就是這個帝國的官方語言华蜒。
HTTP 協(xié)議的核心功能是讓客戶端能夠告訴服務(wù)器端它想要對資源進行做什么操作——這個能力體現(xiàn)在 HTTP 請求報文的起始行辙纬,如:
GET /doc.html HTTP/1.1
......
這個起始行包括三部分:操作、資源叭喜、協(xié)議版本贺拣。
HTTP 的一個創(chuàng)舉是將種類繁多的、亂七八糟的操作高度抽象成幾個動詞捂蕴。在第一版(HTTP/0.9)中纵柿,由于人們只需要查看資源,所以只有 GET 這一個動詞启绰。后續(xù)版本加入了 HEAD、PUT沟使、POST委可、TRACE、OPTIONS腊嗡、DELETE 等動詞(動詞是可擴展的)着倾。
說下幾個常用的:
GET:最常用的方法,請求獲取某個資源燕少;
HEAD:和 GET 類似卡者,不過服務(wù)器只返回首部而不返回主體(Body),在客戶端不需要主體信息的時候(如僅想查看資源的元信息)能節(jié)約帶寬客们;
PUT:如其名崇决,客戶端向服務(wù)器寫入(put)文檔(和 GET 的行為相反,類似于我們用 FTP 上傳文件)底挫。PUT 的標準行為是用客戶端請求報文的主體內(nèi)容覆蓋服務(wù)器上的整個資源(如果資源不存在恒傻,則創(chuàng)建);
POST:向服務(wù)器”輸入“數(shù)據(jù)建邓。有時候我們并不是想創(chuàng)建一個新資源盈厘,而僅僅是修改或增刪該資源的一些屬性,就可以用 POST 將相關(guān)數(shù)據(jù)提交給服務(wù)器官边。和 PUT 不同沸手,POST 的具體行為由服務(wù)器端決定(而 PUT 的語義已經(jīng)包含了其行為)外遇;
DELETE:如其名,刪除資源契吉。刪除操作的語義是確定的跳仿,但服務(wù)器端可以拒絕執(zhí)行該操作(拒絕刪除某資源,或者僅僅是做資源歸檔)栅隐。
起始行的第二部分是資源塔嬉。這里一般是寫本地資源路徑(在使用代理時也可能寫絕對 URL)。
第三部分說明客戶端支持的 HTTP 協(xié)議的最高版本租悄,服務(wù)器端可據(jù)此決定返回的數(shù)據(jù)格式(如有些低版本協(xié)議客戶端不支持某些新特性)谨究。
相應(yīng)地,服務(wù)器端需響應(yīng)處理結(jié)果——這個也是體現(xiàn)在 HTTP 響應(yīng)報文的起始行泣棋,如:
HTTP/1.1 200 OK
也是由三部分構(gòu)成:協(xié)議版本胶哲、處理結(jié)果狀態(tài)碼、結(jié)果描述潭辈。
HTTP 的狀態(tài)碼分成五大類:
- 100 ~ 199:信息性狀態(tài)碼鸯屿,平時見到最多的可能是 101 Switching Protocols,協(xié)議升級(如 WebSocket 中就用到)把敢;
- 200 ~ 299:成功狀態(tài)碼寄摆,說明服務(wù)器端成功執(zhí)行了客戶端的請求;
- 300 ~ 399:重定向狀態(tài)碼修赞,說明要到其他地方查找資源婶恼;
- 400 ~ 499:客戶端錯誤,如未授權(quán)柏副、請求的資源不存在勾邦;
- 500 ~ 599:服務(wù)器端錯誤,如經(jīng)常遇到的 502 Bad Gateway割择;
HTTP 報文的第二大塊是首部眷篇。首部提供應(yīng)用程序和資源的元信息,如客戶端支持的媒體類型列表荔泳、主體的媒體類型蕉饼、主體長度、緩存策略等换可。
HTTP 首部有兩個特點(這里說的是 HTTP/1.X):
- 純文本椎椰;
- 可擴展;
我們有時會聽說 HTTP 是純文本協(xié)議沾鳄,這不是說 HTTP 只能傳輸純文本(HTTP 能夠傳輸圖片慨飘、視頻等所有類型數(shù)據(jù)),而是說 HTTP 的首部是 ASCII 純文本的。比如下面的請求首部:
GET / HTTP/1.1
Host: www.baidu.com
Connection: keep-alive
Pragma: no-cache
Cache-Control: no-cache
......
我們能看出它是在講人話瓤的。首部是 key: value 格式的文本表示休弃。
相應(yīng)地,什么是二進制協(xié)議呢圈膏?像 IP塔猾、TCP、DNS 協(xié)議的首部那樣稽坤,采用二進制位來表示特定含義的協(xié)議丈甸,這些協(xié)議的首部往往也是固定的。
純文本首部的缺點是效率低尿褪,文本顯然比二進制形式更占空間睦擂,比如"Cache-Control:no-cache"占了 22 字節(jié),但在二進制協(xié)議中可能只需要 4 個比特就能搞定杖玲。另外報文接收方需分割字符串首部后進行字符串比較顿仇,其效率也遠低于位操作。
但純文本首部的一大優(yōu)點是擴展性很好摆马。二進制協(xié)議一般都是固定長度首部(如 TCP臼闻、DNS),所能表達的信息有限囤采。純文本首部一方面可以隨意增加新首部述呐,另外對現(xiàn)有首部的值也可以隨意擴展——可擴展性是 HTTP 協(xié)議的一個重要原則。
這里說的是 HTTP/1蕉毯。HTTP/2 是二進制協(xié)議市埋,采用 frame 作為傳輸單元。
HTTP 報文的第三大塊是主體恕刘。主體可以是任何文本或二進制數(shù)據(jù),HTTP 協(xié)議通過一系列首部提供了主體的相關(guān)信息抒倚,如 Content-Type 指定主體的 MIME 類型褐着,Content-Length 指定主體的長度,Content-Encoding 指定主體的編碼方式(如 gzip 壓縮)托呕。
早期 HTTP 并沒有 Content-Length 首部含蓉,客戶端是通過服務(wù)器端關(guān)閉連接來感知主體傳輸完畢,但有一個問題:客戶端無法知道該連接是否正常關(guān)閉的(有可能服務(wù)器端除了問題项郊,數(shù)據(jù)發(fā)送一半的時候宕掉了)馅扣。所以后面加了 Content-Length 首部。該首部在持久連接場景下是必須的——此場景服務(wù)器端發(fā)送完報文后不會關(guān)閉 TCP 連接着降。
從上面三大塊我們發(fā)現(xiàn)差油,可擴展性是 HTTP 協(xié)議的一個核心設(shè)計原則。靈活的擴展能力一方面滿足了萬維網(wǎng)上千姿百態(tài)的資源和資源使用方式,另外也使得 HTTP 協(xié)議自身擁有良好的向后兼容性(HTTP 協(xié)議還專門有個狀態(tài)碼 101 表示協(xié)議版本協(xié)商)蓄喇。
B/S 架構(gòu):
萬維網(wǎng)相較于傳統(tǒng)超文本系統(tǒng)的一大特點是存儲和展示分離发侵。
萬維網(wǎng)的資源是分布式存儲的,存儲系統(tǒng)(分布在世界各地的計算機)之間采用的操作系統(tǒng)妆偏、軟件以及協(xié)議各不相同刃鳄,這要求資源的展示不能依賴于存儲實現(xiàn)細節(jié)。
萬維網(wǎng)采取了瀏覽器/服務(wù)器架構(gòu)(B/S 架構(gòu)钱骂。這里說的瀏覽器是泛指實現(xiàn)了萬維網(wǎng)相關(guān)協(xié)議叔锐,能夠正確展示各種資源的終端程序)。瀏覽器負責展示資源见秽,服務(wù)器負責存儲資源愉烙。瀏覽器不關(guān)心服務(wù)器如何處理和存儲資源,服務(wù)器只需要做兩件事情:首先张吉,給資源取個名字(URI)并公布出來齿梁;然后,服務(wù)器將資源以合適的方式(HTTP 協(xié)議)提供給瀏覽器——如此肮蛹,瀏覽器便能正確地獲取并展示該資源勺择。
資源的展示和存儲分離在今天看來稀疏平常,其實它是一個非凡的創(chuàng)舉伦忠。當時在大部分系統(tǒng)中省核,信息的展示是依賴于存儲格式的,一種系統(tǒng)中的信息無法在另一種系統(tǒng)正常顯示(就好比無法在 PDF 閱讀器中打開 excel 格式文件一樣)——或者說昆码,特定格式的信息資源必須用對應(yīng)的應(yīng)用程序打開气忠。
伯納斯·李提出“瀏覽器”的概念——它是一款不關(guān)心資源存儲而只專注于資源展示的軟件。因為我們對瀏覽器過于熟悉赋咽,可能并不會被這個概念激起多少波瀾旧噪,我們不妨換個名稱叫“通用信息閱覽器”。什么意思呢脓匿?這個應(yīng)用程序并不是只能打開某一種類型的資源淘钟,它(理論上)可以打開任何類型資源——這才是“資源的展示不依賴于存儲格式”的終極理念。
當然陪毡,現(xiàn)實中沒有哪一款瀏覽器能支持所有 MIME 媒體類型米母,所以存在類型協(xié)商。具體做法是瀏覽器在 HTTP 請求報文中通過 Accept 首部告訴服務(wù)器它能夠(或說希望)接收的媒體類型有哪些毡琉;服務(wù)器則在響應(yīng)報文首部通過 Content-Type 告知瀏覽器自己返回的資源具體是什么媒體類型(這不代表服務(wù)器端一定是以該類型存儲資源的铁瞒,參見后面“網(wǎng)關(guān)”一節(jié)的說明),如此桅滋,如果瀏覽器支持該媒體類型慧耍,則能夠正常解析與展示。
也就是說,只要服務(wù)器端返回的資源格式是瀏覽器支持的 MIME 類型蜂绎,瀏覽器就一定能夠正確展示(而不管該資源在服務(wù)器端是怎么存儲的)栅表。
如此,我們在終端上只需要安裝一個瀏覽器(而無需像過去那樣安裝上百個專用軟件)就能瀏覽互聯(lián)網(wǎng)上各種形式的信息师枣。
這種架構(gòu)使得瀏覽器成為萬維網(wǎng)的入口怪瓶,瀏覽器因此成為各公司和創(chuàng)業(yè)者的爭奪焦點,在 90 年代掀起一場瀏覽器大戰(zhàn)践美,其中最著名的兩個角斗士是網(wǎng)景和微軟洗贰。開始的時候微軟壓根不是網(wǎng)景的對手,但微軟最終使用捆綁銷售策略陨倡,在 Windows 98 中免費附贈 IE 瀏覽器敛滋,據(jù)此擊敗網(wǎng)景。IE 從此橫著走了十幾年兴革,還產(chǎn)生了一款讓開發(fā)者痛恨欲絕的釘子戶——IE6绎晃。
HTML:
在萬維網(wǎng)的 B/S 架構(gòu)中,瀏覽器測負責資源的展示杂曲,具體來說是用一種叫 HTML 的標記語言來展示資源庶艾。
HTML 的全稱是 Hyper Text Markup Language,即超文本標記語言擎勘,由伯納斯·李和同事丹尼爾·康諾利于 1990 年設(shè)計咱揍。
在 HTML 中,通過各種標簽(tag棚饵,如a煤裙、img、div)來標記文本的結(jié)構(gòu)噪漾、格式或引用硼砰。瀏覽器不但可以展示不同媒體類型的資源,還能夠在一篇文檔(或叫頁面)中組織和展示多種媒體類型的資源欣硼,這種頁面我們叫超媒體頁面夺刑。
可以通過head、body分别、div、p存淫、tr耘斩、td 來管理文檔的結(jié)構(gòu)。
可以通過 i桅咆、b括授、h1 來表達文檔的格式。
可以通過 a、img荚虚、audio薛夜、video 這些超鏈接標簽給文檔引入文本、圖片版述、音頻梯澜、視頻資源,這些資源有可能和當前頁面在同一個服務(wù)器上渴析,也可能位于遙遠的另一臺服務(wù)器——萬維網(wǎng)的資源倉庫分布在全球各地晚伙。
隨著層疊樣式表 CSS 的出現(xiàn),HTML 語言的重心逐漸轉(zhuǎn)向表達文檔的結(jié)構(gòu)俭茧,而由 CSS 來負責文檔的布局和樣式咆疗。
瀏覽器隨著 HTML、CSS母债、JavaScript 這些前端語言的發(fā)展而愈發(fā)強大起來午磁,從最初只能展示基本的 HTML 靜態(tài)頁面,到可以通過 CSS 控制各種炫酷的樣式和布局毡们,到通過 JavaScript 實現(xiàn)動態(tài)交互迅皇,到 ajax 實現(xiàn)動態(tài)內(nèi)容和信息流式交互。
網(wǎng)關(guān):
伯納斯·李在設(shè)計萬維網(wǎng)時漏隐,世界上已經(jīng)存在大量的信息系統(tǒng)喧半,這些系統(tǒng)間的信息格式迥異,大多數(shù)并不符合萬維網(wǎng)協(xié)議標準青责,但萬維網(wǎng)不能拋棄這些既有信息挺据。
伯納斯·李提出了網(wǎng)關(guān)(Gateway)的概念來解決此問題。
網(wǎng)關(guān)其實就是一個文檔格式轉(zhuǎn)換器:將現(xiàn)有的不符合萬維網(wǎng)標準的文檔轉(zhuǎn)換成標準文檔脖隶,然后發(fā)給客戶端扁耐。
如上圖,瀏覽器訪問 Web 服務(wù)器(左側(cè)那個 Hypertext Server)产阱,該服務(wù)器會去訪問網(wǎng)關(guān)服務(wù)器(右側(cè)小的那個)婉称,網(wǎng)關(guān)服務(wù)器將原始文檔轉(zhuǎn)換成符合萬維網(wǎng)格式的文檔后返回給 Web 服務(wù)器,Web 服務(wù)器再返回給瀏覽器构蹬。這里只是增加一層網(wǎng)關(guān)服務(wù)器王暗,無需修改原始文檔,也不用大面積改造 Web 服務(wù)器庄敛。
伯納斯·李這個網(wǎng)關(guān)概念和我們今天說的網(wǎng)關(guān)服務(wù)器是類似的俗壹。我們今天所說的網(wǎng)關(guān)主要起到協(xié)議轉(zhuǎn)換作用,它的一頭通過 HTTP 協(xié)議和瀏覽器(或者代理)通信藻烤,另一頭通過其他協(xié)議(FTP绷雏、STMP头滔、fast-cgi 等)和其他應(yīng)用程序通信。另外涎显,今天的 Web 服務(wù)器大部分同時也是網(wǎng)關(guān)服務(wù)器坤检,如 nginx:
如圖,如今網(wǎng)上很大部分內(nèi)容都是由應(yīng)用程序動態(tài)生成的期吓,當瀏覽器訪問 Web 服務(wù)器時早歇,Web 服務(wù)器并不是在它本地直接找到資源并返回,而是通過諸如 fast-cgi 協(xié)議訪問后面的應(yīng)用程序服務(wù)膘婶,應(yīng)用程序生成相關(guān)結(jié)果返回給 Web 服務(wù)器缺前,Web 服務(wù)器再返回給瀏覽器。對于瀏覽器來說悬襟,該過程是透明的衅码,所以對于瀏覽器來說,它就是 Web 服務(wù)器脊岳;對于應(yīng)用程序來說逝段,它將自己返回的 fast-cgi 格式數(shù)據(jù)轉(zhuǎn)換成了 HTTP 協(xié)議格式數(shù)據(jù),因而它是個網(wǎng)關(guān)——因而這種網(wǎng)關(guān)又叫做服務(wù)器端網(wǎng)關(guān)割捅。
有了網(wǎng)關(guān)這層轉(zhuǎn)換奶躯,就可以基于現(xiàn)有的數(shù)據(jù)、現(xiàn)有的服務(wù)(如郵件服務(wù))對外提供統(tǒng)一的 HTTP 服務(wù)亿驾,從而高效快速地接入萬維網(wǎng)嘹黔。
原文出自公眾號“編碼胡同”:
《萬維網(wǎng):蒂姆·伯納斯·李的信息帝國》